mirror of
https://github.com/postgres/postgres.git
synced 2025-07-02 09:02:37 +03:00
To: Thomas Lockhart <Thomas.G.Lockhart@jpl.nasa.gov>
Subject: Re: [PATCHES] SET DateStyle patches On Tue, 22 Apr 1997, Thomas Lockhart wrote: > Some more patches! These (try to) finish implementing SET variable TO value > for "DateStyle" (changed the name from simply "date" to be more descriptive). > This is based on code from Martin and Bruce (?), which was easy to modify. > The syntax is > > SET DateStyle TO 'iso' > SET DateStyle TO 'postgres' > SET DateStyle TO 'sql' > SET DateStyle TO 'european' > SET DateStyle TO 'noneuropean' > SET DateStyle TO 'us' (same as "noneuropean") > SET DateStyle TO 'default' (current same as "postgres,us") > > ("european" is just compared for the first 4 characters, and "noneuropean" > is compared for the first 7 to allow less typing). > > Multiple arguments are allowed, so SET datestyle TO 'sql,euro' is valid. > > My mods also try to implement "SHOW variable" and "RESET variable", but > that part just core dumps at the moment. I would guess that my errors > are obvious to someone who knows what they are doing with the parser stuff, > so if someone (Bruce and/or Martin??) could have it do the right thing > we will have a more complete set of what we need. > > Also, I would like to have a floating point precision global variable to > implement "SET precision TO 10" and perhaps "SET precision TO 10,2" for > float8 and float4, but I don't know how to do that for integer types rather > than strings. If someone is fixing the SHOW and RESET code, perhaps they can > add some hooks for me to do the floats while they are at it. > > I've left some remnants of variable structures in the source code which > I did not use in the interests of getting something working for v6.1. > We'll have time to clean things up for the next release...
This commit is contained in:
@ -10,7 +10,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 1.30 1997/04/05 06:25:59 vadim Exp $
|
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 1.31 1997/04/23 03:17:00 scrappy Exp $
|
||||||
*
|
*
|
||||||
* HISTORY
|
* HISTORY
|
||||||
* AUTHOR DATE MAJOR EVENT
|
* AUTHOR DATE MAJOR EVENT
|
||||||
@ -108,7 +108,7 @@ static Node *makeA_Expr(int oper, char *opname, Node *lexpr, Node *rexpr);
|
|||||||
RevokeStmt, RuleStmt, TransactionStmt, ViewStmt, LoadStmt,
|
RevokeStmt, RuleStmt, TransactionStmt, ViewStmt, LoadStmt,
|
||||||
CreatedbStmt, DestroydbStmt, VacuumStmt, RetrieveStmt, CursorStmt,
|
CreatedbStmt, DestroydbStmt, VacuumStmt, RetrieveStmt, CursorStmt,
|
||||||
ReplaceStmt, AppendStmt, NotifyStmt, DeleteStmt, ClusterStmt,
|
ReplaceStmt, AppendStmt, NotifyStmt, DeleteStmt, ClusterStmt,
|
||||||
ExplainStmt, VariableSetStmt
|
ExplainStmt, VariableSetStmt, VariableShowStmt, VariableResetStmt
|
||||||
|
|
||||||
%type <str> relation_name, copy_file_name, copy_delimiter, def_name,
|
%type <str> relation_name, copy_file_name, copy_delimiter, def_name,
|
||||||
database_name, access_method_clause, access_method, attr_name,
|
database_name, access_method_clause, access_method, attr_name,
|
||||||
@ -190,8 +190,8 @@ static Node *makeA_Expr(int oper, char *opname, Node *lexpr, Node *rexpr);
|
|||||||
NONE, NOT, NOTHING, NOTIFY, NOTNULL,
|
NONE, NOT, NOTHING, NOTIFY, NOTNULL,
|
||||||
OIDS, ON, OPERATOR, OPTION, OR, ORDER,
|
OIDS, ON, OPERATOR, OPTION, OR, ORDER,
|
||||||
PNULL, PRIVILEGES, PUBLIC, PURGE, P_TYPE,
|
PNULL, PRIVILEGES, PUBLIC, PURGE, P_TYPE,
|
||||||
RENAME, REPLACE, RETRIEVE, RETURNS, REVOKE, ROLLBACK, RULE,
|
RENAME, REPLACE, RESET, RETRIEVE, RETURNS, REVOKE, ROLLBACK, RULE,
|
||||||
SELECT, SET, SETOF, STDIN, STDOUT, STORE,
|
SELECT, SET, SETOF, SHOW, STDIN, STDOUT, STORE,
|
||||||
TABLE, TO, TRANSACTION, UNIQUE, UPDATE, USING, VACUUM, VALUES
|
TABLE, TO, TRANSACTION, UNIQUE, UPDATE, USING, VACUUM, VALUES
|
||||||
VERBOSE, VERSION, VIEW, WHERE, WITH, WORK
|
VERBOSE, VERSION, VIEW, WHERE, WITH, WORK
|
||||||
%token EXECUTE, RECIPE, EXPLAIN, LIKE, SEQUENCE
|
%token EXECUTE, RECIPE, EXPLAIN, LIKE, SEQUENCE
|
||||||
@ -275,6 +275,8 @@ stmt : AddAttrStmt
|
|||||||
| DestroydbStmt
|
| DestroydbStmt
|
||||||
| VacuumStmt
|
| VacuumStmt
|
||||||
| VariableSetStmt
|
| VariableSetStmt
|
||||||
|
| VariableShowStmt
|
||||||
|
| VariableResetStmt
|
||||||
;
|
;
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
@ -289,7 +291,7 @@ VariableSetStmt: SET var_name TO var_value
|
|||||||
VariableSetStmt *n = makeNode(VariableSetStmt);
|
VariableSetStmt *n = makeNode(VariableSetStmt);
|
||||||
n->name = $2;
|
n->name = $2;
|
||||||
n->value = $4;
|
n->value = $4;
|
||||||
|
|
||||||
$$ = (Node *) n;
|
$$ = (Node *) n;
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
@ -297,6 +299,26 @@ VariableSetStmt: SET var_name TO var_value
|
|||||||
var_value: Sconst { $$ = $1; }
|
var_value: Sconst { $$ = $1; }
|
||||||
;
|
;
|
||||||
|
|
||||||
|
VariableShowStmt: SHOW var_name
|
||||||
|
{
|
||||||
|
VariableSetStmt *n = makeNode(VariableSetStmt);
|
||||||
|
n->name = $2;
|
||||||
|
n->value = NULL;
|
||||||
|
|
||||||
|
$$ = (Node *) n;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
|
VariableResetStmt: RESET var_name
|
||||||
|
{
|
||||||
|
VariableSetStmt *n = makeNode(VariableSetStmt);
|
||||||
|
n->name = $2;
|
||||||
|
n->value = NULL;
|
||||||
|
|
||||||
|
$$ = (Node *) n;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
*
|
*
|
||||||
* QUERY :
|
* QUERY :
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.8 1997/04/02 04:49:13 vadim Exp $
|
* $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.9 1997/04/23 03:17:04 scrappy Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -116,6 +116,7 @@ static ScanKeyword ScanKeywords[] = {
|
|||||||
{ "recipe", RECIPE },
|
{ "recipe", RECIPE },
|
||||||
{ "rename", RENAME },
|
{ "rename", RENAME },
|
||||||
{ "replace", REPLACE },
|
{ "replace", REPLACE },
|
||||||
|
{ "reset", RESET },
|
||||||
{ "retrieve", RETRIEVE },
|
{ "retrieve", RETRIEVE },
|
||||||
{ "returns", RETURNS },
|
{ "returns", RETURNS },
|
||||||
{ "revoke", REVOKE },
|
{ "revoke", REVOKE },
|
||||||
@ -125,6 +126,7 @@ static ScanKeyword ScanKeywords[] = {
|
|||||||
{ "sequence", SEQUENCE },
|
{ "sequence", SEQUENCE },
|
||||||
{ "set", SET },
|
{ "set", SET },
|
||||||
{ "setof", SETOF },
|
{ "setof", SETOF },
|
||||||
|
{ "show", SHOW },
|
||||||
{ "stdin", STDIN },
|
{ "stdin", STDIN },
|
||||||
{ "stdout", STDOUT },
|
{ "stdout", STDOUT },
|
||||||
{ "store", STORE },
|
{ "store", STORE },
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/tcop/utility.c,v 1.14 1997/04/02 18:23:34 scrappy Exp $
|
* $Header: /cvsroot/pgsql/src/backend/tcop/utility.c,v 1.15 1997/04/23 03:17:09 scrappy Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -643,7 +643,23 @@ ProcessUtility(Node *parsetree,
|
|||||||
{
|
{
|
||||||
VariableSetStmt *n = (VariableSetStmt *) parsetree;
|
VariableSetStmt *n = (VariableSetStmt *) parsetree;
|
||||||
SetPGVariable(n->name, n->value);
|
SetPGVariable(n->name, n->value);
|
||||||
commandTag = "SET_VARIABLE";
|
commandTag = "SET VARIABLE";
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case T_VariableShowStmt:
|
||||||
|
{
|
||||||
|
VariableSetStmt *n = (VariableSetStmt *) parsetree;
|
||||||
|
GetPGVariable(n->name);
|
||||||
|
commandTag = "SHOW VARIABLE";
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case T_VariableResetStmt:
|
||||||
|
{
|
||||||
|
VariableSetStmt *n = (VariableSetStmt *) parsetree;
|
||||||
|
ResetPGVariable(n->name);
|
||||||
|
commandTag = "RESET VARIABLE";
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -1,9 +1,49 @@
|
|||||||
/*
|
/*
|
||||||
* Routines for handling of SET var TO statements
|
* Routines for handling of SET var TO statements
|
||||||
*
|
*
|
||||||
* $Id: variable.c,v 1.3 1997/04/17 13:50:30 scrappy Exp $
|
* $Id: variable.c,v 1.4 1997/04/23 03:17:16 scrappy Exp $
|
||||||
*
|
*
|
||||||
* $Log: variable.c,v $
|
* $Log: variable.c,v $
|
||||||
|
* Revision 1.4 1997/04/23 03:17:16 scrappy
|
||||||
|
* To: Thomas Lockhart <Thomas.G.Lockhart@jpl.nasa.gov>
|
||||||
|
* Subject: Re: [PATCHES] SET DateStyle patches
|
||||||
|
*
|
||||||
|
* On Tue, 22 Apr 1997, Thomas Lockhart wrote:
|
||||||
|
*
|
||||||
|
* > Some more patches! These (try to) finish implementing SET variable TO value
|
||||||
|
* > for "DateStyle" (changed the name from simply "date" to be more descriptive).
|
||||||
|
* > This is based on code from Martin and Bruce (?), which was easy to modify.
|
||||||
|
* > The syntax is
|
||||||
|
* >
|
||||||
|
* > SET DateStyle TO 'iso'
|
||||||
|
* > SET DateStyle TO 'postgres'
|
||||||
|
* > SET DateStyle TO 'sql'
|
||||||
|
* > SET DateStyle TO 'european'
|
||||||
|
* > SET DateStyle TO 'noneuropean'
|
||||||
|
* > SET DateStyle TO 'us' (same as "noneuropean")
|
||||||
|
* > SET DateStyle TO 'default' (current same as "postgres,us")
|
||||||
|
* >
|
||||||
|
* > ("european" is just compared for the first 4 characters, and "noneuropean"
|
||||||
|
* > is compared for the first 7 to allow less typing).
|
||||||
|
* >
|
||||||
|
* > Multiple arguments are allowed, so SET datestyle TO 'sql,euro' is valid.
|
||||||
|
* >
|
||||||
|
* > My mods also try to implement "SHOW variable" and "RESET variable", but
|
||||||
|
* > that part just core dumps at the moment. I would guess that my errors
|
||||||
|
* > are obvious to someone who knows what they are doing with the parser stuff,
|
||||||
|
* > so if someone (Bruce and/or Martin??) could have it do the right thing
|
||||||
|
* > we will have a more complete set of what we need.
|
||||||
|
* >
|
||||||
|
* > Also, I would like to have a floating point precision global variable to
|
||||||
|
* > implement "SET precision TO 10" and perhaps "SET precision TO 10,2" for
|
||||||
|
* > float8 and float4, but I don't know how to do that for integer types rather
|
||||||
|
* > than strings. If someone is fixing the SHOW and RESET code, perhaps they can
|
||||||
|
* > add some hooks for me to do the floats while they are at it.
|
||||||
|
* >
|
||||||
|
* > I've left some remnants of variable structures in the source code which
|
||||||
|
* > I did not use in the interests of getting something working for v6.1.
|
||||||
|
* > We'll have time to clean things up for the next release...
|
||||||
|
*
|
||||||
* Revision 1.3 1997/04/17 13:50:30 scrappy
|
* Revision 1.3 1997/04/17 13:50:30 scrappy
|
||||||
* From: "Martin J. Laubach" <mjl@CSlab.tuwien.ac.at>
|
* From: "Martin J. Laubach" <mjl@CSlab.tuwien.ac.at>
|
||||||
* Subject: [HACKERS] Patch: set date to euro/us postgres/iso/sql
|
* Subject: [HACKERS] Patch: set date to euro/us postgres/iso/sql
|
||||||
@ -24,8 +64,10 @@
|
|||||||
*/
|
*/
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "postgres.h"
|
#include "postgres.h"
|
||||||
|
#include "miscadmin.h"
|
||||||
#include "tcop/variable.h"
|
#include "tcop/variable.h"
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
@ -70,38 +112,55 @@ static bool parse_null(const char *value)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool show_null(const char *value)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool reset_null(const char *value)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static bool parse_date(const char *value)
|
static bool parse_date(const char *value)
|
||||||
{
|
{
|
||||||
char tok[32];
|
char tok[32];
|
||||||
int dcnt = 0, ecnt = 0;
|
int dcnt = 0, ecnt = 0;
|
||||||
|
|
||||||
while(value = get_token(tok, sizeof(tok), value))
|
while((value = get_token(tok, sizeof(tok), value)) != 0)
|
||||||
{
|
{
|
||||||
/* Ugh. Somebody ought to write a table driven version -- mjl */
|
/* Ugh. Somebody ought to write a table driven version -- mjl */
|
||||||
|
|
||||||
if(!strcasecmp(tok, "iso"))
|
if(!strcasecmp(tok, "iso"))
|
||||||
{
|
{
|
||||||
PGVariables.date.format = Date_ISO;
|
DateStyle = USE_ISO_DATES;
|
||||||
dcnt++;
|
dcnt++;
|
||||||
}
|
}
|
||||||
else if(!strcasecmp(tok, "sql"))
|
else if(!strcasecmp(tok, "sql"))
|
||||||
{
|
{
|
||||||
PGVariables.date.format = Date_SQL;
|
DateStyle = USE_SQL_DATES;
|
||||||
dcnt++;
|
dcnt++;
|
||||||
}
|
}
|
||||||
else if(!strcasecmp(tok, "postgres"))
|
else if(!strcasecmp(tok, "postgres"))
|
||||||
{
|
{
|
||||||
PGVariables.date.format = Date_Postgres;
|
DateStyle = USE_POSTGRES_DATES;
|
||||||
dcnt++;
|
dcnt++;
|
||||||
}
|
}
|
||||||
else if(!strcasecmp(tok, "euro"))
|
else if(!strncasecmp(tok, "euro", 4))
|
||||||
{
|
{
|
||||||
PGVariables.date.euro = TRUE;
|
EuroDates = TRUE;
|
||||||
ecnt++;
|
ecnt++;
|
||||||
}
|
}
|
||||||
else if(!strcasecmp(tok, "us"))
|
else if((!strcasecmp(tok, "us"))
|
||||||
|
|| (!strncasecmp(tok, "noneuro", 7)))
|
||||||
{
|
{
|
||||||
PGVariables.date.euro = FALSE;
|
EuroDates = FALSE;
|
||||||
|
ecnt++;
|
||||||
|
}
|
||||||
|
else if(!strcasecmp(tok, "default"))
|
||||||
|
{
|
||||||
|
DateStyle = USE_POSTGRES_DATES;
|
||||||
|
EuroDates = FALSE;
|
||||||
ecnt++;
|
ecnt++;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -116,16 +175,39 @@ static bool parse_date(const char *value)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool show_date()
|
||||||
|
{
|
||||||
|
char buf[64];
|
||||||
|
|
||||||
|
sprintf( buf, "Date style is %s with%s European conventions",
|
||||||
|
((DateStyle == USE_ISO_DATES)? "iso": ((DateStyle == USE_ISO_DATES)? "sql": "postgres")),
|
||||||
|
((EuroDates)? "": "out"));
|
||||||
|
|
||||||
|
elog(NOTICE, buf, NULL);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool reset_date()
|
||||||
|
{
|
||||||
|
DateStyle = USE_POSTGRES_DATES;
|
||||||
|
EuroDates = FALSE;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
struct VariableParsers
|
struct VariableParsers
|
||||||
{
|
{
|
||||||
const char *name;
|
const char *name;
|
||||||
bool (*parser)(const char *);
|
bool (*parser)(const char *);
|
||||||
|
bool (*show)();
|
||||||
|
bool (*reset)();
|
||||||
} VariableParsers[] =
|
} VariableParsers[] =
|
||||||
{
|
{
|
||||||
{ "date", parse_date },
|
{ "datestyle", parse_date, show_date, reset_date },
|
||||||
{ "timezone", parse_null },
|
{ "timezone", parse_null, show_null, reset_null },
|
||||||
{ NULL }
|
{ NULL, NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
@ -139,14 +221,39 @@ bool SetPGVariable(const char *name, const char *value)
|
|||||||
return (vp->parser)(value);
|
return (vp->parser)(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
elog(NOTICE, "No such variable %s", name);
|
elog(NOTICE, "Unrecognized variable %s", name);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
const char *GetPGVariable(const char *varName)
|
bool GetPGVariable(const char *name)
|
||||||
{
|
{
|
||||||
return NULL;
|
struct VariableParsers *vp;
|
||||||
|
|
||||||
|
for(vp = VariableParsers; vp->name; vp++)
|
||||||
|
{
|
||||||
|
if(!strcasecmp(vp->name, name))
|
||||||
|
return (vp->show)();
|
||||||
|
}
|
||||||
|
|
||||||
|
elog(NOTICE, "Unrecognized variable %s", name);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
|
bool ResetPGVariable(const char *name)
|
||||||
|
{
|
||||||
|
struct VariableParsers *vp;
|
||||||
|
|
||||||
|
for(vp = VariableParsers; vp->name; vp++)
|
||||||
|
{
|
||||||
|
if(!strcasecmp(vp->name, name))
|
||||||
|
return (vp->reset)();
|
||||||
|
}
|
||||||
|
|
||||||
|
elog(NOTICE, "Unrecognized variable %s", name);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
*
|
*
|
||||||
* Copyright (c) 1994, Regents of the University of California
|
* Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* $Id: nodes.h,v 1.7 1997/04/02 18:24:38 scrappy Exp $
|
* $Id: nodes.h,v 1.8 1997/04/23 03:17:29 scrappy Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -180,6 +180,8 @@ typedef enum NodeTag {
|
|||||||
T_ExplainStmt,
|
T_ExplainStmt,
|
||||||
T_CreateSeqStmt,
|
T_CreateSeqStmt,
|
||||||
T_VariableSetStmt,
|
T_VariableSetStmt,
|
||||||
|
T_VariableShowStmt,
|
||||||
|
T_VariableResetStmt,
|
||||||
|
|
||||||
T_A_Expr = 700,
|
T_A_Expr = 700,
|
||||||
T_Attr,
|
T_Attr,
|
||||||
|
@ -1,9 +1,49 @@
|
|||||||
/*
|
/*
|
||||||
* Headers for handling of SET var TO statements
|
* Headers for handling of SET var TO statements
|
||||||
*
|
*
|
||||||
* $Id: variable.h,v 1.2 1997/04/17 13:50:57 scrappy Exp $
|
* $Id: variable.h,v 1.3 1997/04/23 03:17:52 scrappy Exp $
|
||||||
*
|
*
|
||||||
* $Log: variable.h,v $
|
* $Log: variable.h,v $
|
||||||
|
* Revision 1.3 1997/04/23 03:17:52 scrappy
|
||||||
|
* To: Thomas Lockhart <Thomas.G.Lockhart@jpl.nasa.gov>
|
||||||
|
* Subject: Re: [PATCHES] SET DateStyle patches
|
||||||
|
*
|
||||||
|
* On Tue, 22 Apr 1997, Thomas Lockhart wrote:
|
||||||
|
*
|
||||||
|
* > Some more patches! These (try to) finish implementing SET variable TO value
|
||||||
|
* > for "DateStyle" (changed the name from simply "date" to be more descriptive).
|
||||||
|
* > This is based on code from Martin and Bruce (?), which was easy to modify.
|
||||||
|
* > The syntax is
|
||||||
|
* >
|
||||||
|
* > SET DateStyle TO 'iso'
|
||||||
|
* > SET DateStyle TO 'postgres'
|
||||||
|
* > SET DateStyle TO 'sql'
|
||||||
|
* > SET DateStyle TO 'european'
|
||||||
|
* > SET DateStyle TO 'noneuropean'
|
||||||
|
* > SET DateStyle TO 'us' (same as "noneuropean")
|
||||||
|
* > SET DateStyle TO 'default' (current same as "postgres,us")
|
||||||
|
* >
|
||||||
|
* > ("european" is just compared for the first 4 characters, and "noneuropean"
|
||||||
|
* > is compared for the first 7 to allow less typing).
|
||||||
|
* >
|
||||||
|
* > Multiple arguments are allowed, so SET datestyle TO 'sql,euro' is valid.
|
||||||
|
* >
|
||||||
|
* > My mods also try to implement "SHOW variable" and "RESET variable", but
|
||||||
|
* > that part just core dumps at the moment. I would guess that my errors
|
||||||
|
* > are obvious to someone who knows what they are doing with the parser stuff,
|
||||||
|
* > so if someone (Bruce and/or Martin??) could have it do the right thing
|
||||||
|
* > we will have a more complete set of what we need.
|
||||||
|
* >
|
||||||
|
* > Also, I would like to have a floating point precision global variable to
|
||||||
|
* > implement "SET precision TO 10" and perhaps "SET precision TO 10,2" for
|
||||||
|
* > float8 and float4, but I don't know how to do that for integer types rather
|
||||||
|
* > than strings. If someone is fixing the SHOW and RESET code, perhaps they can
|
||||||
|
* > add some hooks for me to do the floats while they are at it.
|
||||||
|
* >
|
||||||
|
* > I've left some remnants of variable structures in the source code which
|
||||||
|
* > I did not use in the interests of getting something working for v6.1.
|
||||||
|
* > We'll have time to clean things up for the next release...
|
||||||
|
*
|
||||||
* Revision 1.2 1997/04/17 13:50:57 scrappy
|
* Revision 1.2 1997/04/17 13:50:57 scrappy
|
||||||
* From: "Martin J. Laubach" <mjl@CSlab.tuwien.ac.at>
|
* From: "Martin J. Laubach" <mjl@CSlab.tuwien.ac.at>
|
||||||
* Subject: [HACKERS] Patch: set date to euro/us postgres/iso/sql
|
* Subject: [HACKERS] Patch: set date to euro/us postgres/iso/sql
|
||||||
@ -41,8 +81,5 @@ extern struct PGVariables PGVariables;
|
|||||||
|
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
bool SetPGVariable(const char *, const char *);
|
bool SetPGVariable(const char *, const char *);
|
||||||
const char *GetPGVariable(const char *);
|
bool GetPGVariable(const char *);
|
||||||
|
bool ResetPGVariable(const char *);
|
||||||
/*-----------------------------------------------------------------------*/
|
|
||||||
bool SetPGVariable(const char *, const char *);
|
|
||||||
const char *GetPGVariable(const char *);
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
.\" This is -*-nroff-*-
|
.\" This is -*-nroff-*-
|
||||||
.\" XXX standard disclaimer belongs here....
|
.\" XXX standard disclaimer belongs here....
|
||||||
.\" $Header: /cvsroot/pgsql/src/man/Attic/built-in.3,v 1.4 1997/04/02 18:31:22 scrappy Exp $
|
.\" $Header: /cvsroot/pgsql/src/man/Attic/built-in.3,v 1.5 1997/04/23 03:18:27 scrappy Exp $
|
||||||
.TH BUILT-INS INTRO 04/01/97 PostgreSQL PostgreSQL
|
.TH BUILT-INS INTRO 04/01/97 PostgreSQL PostgreSQL
|
||||||
.SH "DESCRIPTION"
|
.SH "DESCRIPTION"
|
||||||
This section describes the data types, functions and operators
|
This section describes the data types, functions and operators
|
||||||
@ -46,15 +46,17 @@ described in this section.
|
|||||||
float4 single-precision floating-point number
|
float4 single-precision floating-point number
|
||||||
float8 double-precision floating-point number
|
float8 double-precision floating-point number
|
||||||
lseg 2-dimensional line segment
|
lseg 2-dimensional line segment
|
||||||
|
money decimal type with fixed precision
|
||||||
name a multi-character type for storing system identifiers
|
name a multi-character type for storing system identifiers
|
||||||
oid object identifier type
|
oid object identifier type
|
||||||
oid8 array of 8 oid
|
oid8 array of 8 oid
|
||||||
oidchar16 oid and char16 composed
|
oidchar16 oid and char16 composed
|
||||||
oidint2 oid and int2 composed
|
oidint2 oid and int2 composed
|
||||||
oidint4 oid and int4 composed
|
oidint4 oid and int4 composed
|
||||||
path variable-length array of lseg
|
path open or closed line segments
|
||||||
point 2-dimensional geometric point
|
point 2-dimensional geometric point
|
||||||
polygon 2-dimensional polygon
|
polygon 2-dimensional polygon (same as a closed path)
|
||||||
|
circle 2-dimensional circle (center and radius)
|
||||||
real alias for float4
|
real alias for float4
|
||||||
regproc registered procedure
|
regproc registered procedure
|
||||||
reltime (relative) date and time span (duration)
|
reltime (relative) date and time span (duration)
|
||||||
@ -72,10 +74,9 @@ described in this section.
|
|||||||
.fi
|
.fi
|
||||||
.in
|
.in
|
||||||
.PP
|
.PP
|
||||||
As a rule, the built-in types are all either (1) internal types, in
|
Many of the built-in types have obvious external formats. However, several
|
||||||
which case the user should not worry about their external format, or
|
types are either unique to Postgres, such as open and closed paths, or have
|
||||||
(2) have obvious formats. The exceptions to this rule are the date and
|
several possibilities for formats, such as date and time types.
|
||||||
time types.
|
|
||||||
|
|
||||||
.SH "Syntax of date and time types"
|
.SH "Syntax of date and time types"
|
||||||
.SH "DATETIME"
|
.SH "DATETIME"
|
||||||
@ -229,6 +230,142 @@ where
|
|||||||
is a time in the absolute time format. Special abstime values such as
|
is a time in the absolute time format. Special abstime values such as
|
||||||
\*(lqcurrent\*(rq, \*(lqinfinity\*(rq and \*(lq-infinity\*(rq can be used.
|
\*(lqcurrent\*(rq, \*(lqinfinity\*(rq and \*(lq-infinity\*(rq can be used.
|
||||||
|
|
||||||
|
.SH "Syntax of geometric types"
|
||||||
|
.SH "POINT"
|
||||||
|
Points are specified using the following syntax:
|
||||||
|
.PP
|
||||||
|
.nf
|
||||||
|
( x , y )
|
||||||
|
.nf
|
||||||
|
x , y
|
||||||
|
.sp
|
||||||
|
where
|
||||||
|
x is the x-axis coordinate as a floating point number
|
||||||
|
y is the y-axis coordinate as a floating point number
|
||||||
|
.fi
|
||||||
|
.PP
|
||||||
|
.SH "LSEG"
|
||||||
|
Line segments are represented by pairs of points.
|
||||||
|
.PP
|
||||||
|
lseg is specified using the following syntax:
|
||||||
|
.PP
|
||||||
|
.nf
|
||||||
|
( ( x1 , y1 ) , ( x2 , y2 ) )
|
||||||
|
.nf
|
||||||
|
( x1 , y1 ) , ( x2 , y2 )
|
||||||
|
.nf
|
||||||
|
x1 , y1 , x2 , y2
|
||||||
|
.sp
|
||||||
|
where
|
||||||
|
(x1,y1) and (x2,y2) are the endpoints of the segment
|
||||||
|
.fi
|
||||||
|
.PP
|
||||||
|
.SH "BOX"
|
||||||
|
Boxes are represented by pairs of points which are opposite
|
||||||
|
corners of the box.
|
||||||
|
.PP
|
||||||
|
box is specified using the following syntax:
|
||||||
|
.PP
|
||||||
|
.nf
|
||||||
|
( ( x1 , y1 ) , ( x2 , y2 ) )
|
||||||
|
.nf
|
||||||
|
( x1 , y1 ) , ( x2 , y2 )
|
||||||
|
.nf
|
||||||
|
x1 , y1 , x2 , y2
|
||||||
|
.sp
|
||||||
|
where
|
||||||
|
(x1,y1) and (x2,y2) are opposite corners
|
||||||
|
.fi
|
||||||
|
.PP
|
||||||
|
Boxes are output using the first syntax.
|
||||||
|
The corners are reordered on input to store
|
||||||
|
the lower left corner first and the upper right corner last.
|
||||||
|
Other corners of the box can be entered, but the lower
|
||||||
|
left and upper right corners are determined from the input and stored.
|
||||||
|
.SH "PATH"
|
||||||
|
Paths are represented by sets of points. Paths can be "open", where
|
||||||
|
the first and last points in the set are not connected, and "closed",
|
||||||
|
where the first and last point are connected. Functions
|
||||||
|
.IR popen(p)
|
||||||
|
and
|
||||||
|
.IR pclose(p)
|
||||||
|
are supplied to force a path to be open or closed, and functions
|
||||||
|
.IR isopen(p)
|
||||||
|
and
|
||||||
|
.IR isclosed(p)
|
||||||
|
are supplied to select either type in a query.
|
||||||
|
.PP
|
||||||
|
path is specified using the following syntax:
|
||||||
|
.PP
|
||||||
|
.nf
|
||||||
|
( ( x1 , y1 ) , ... , ( xn , yn ) )
|
||||||
|
.nf
|
||||||
|
[ ( x1 , y1 ) , ... , ( xn , yn ) ]
|
||||||
|
.nf
|
||||||
|
( x1 , y1 ) , ... , ( xn , yn )
|
||||||
|
.nf
|
||||||
|
x1 , y1 , ... , xn , yn
|
||||||
|
.nf
|
||||||
|
( closed, n, x1 , y1 , ... , xn , yn )
|
||||||
|
.sp
|
||||||
|
where
|
||||||
|
(x1,y1),...,(xn,yn) are points 1 through n
|
||||||
|
a leading "[" indicates an open path
|
||||||
|
a leading "(" indicates a closed path
|
||||||
|
a single leading "(" indicates a v6.0-compatible format
|
||||||
|
closed is an integer flag which is zero for an open path
|
||||||
|
n is the number of points in the path
|
||||||
|
.fi
|
||||||
|
.PP
|
||||||
|
Paths are output using the first syntax.
|
||||||
|
The last format is supplied to be backward compatible with v6.0 and earlier
|
||||||
|
path formats and will not be supported in future versions of Postgres.
|
||||||
|
.SH "POLYGON"
|
||||||
|
Polygons are represented by sets of points. Polygons should probably be
|
||||||
|
considered
|
||||||
|
equivalent to closed paths, but are stored differently and have their own
|
||||||
|
set of support routines.
|
||||||
|
.PP
|
||||||
|
polygon is specified using the following syntax:
|
||||||
|
.PP
|
||||||
|
.nf
|
||||||
|
( ( x1 , y1 ) , ... , ( xn , yn ) )
|
||||||
|
.nf
|
||||||
|
( x1 , y1 ) , ... , ( xn , yn )
|
||||||
|
.nf
|
||||||
|
x1 , y1 , ... , xn , yn
|
||||||
|
.nf
|
||||||
|
( x1 , ... , xn , y1 , ... , yn )
|
||||||
|
.sp
|
||||||
|
where
|
||||||
|
(x1,y1),...,(xn,yn) are points 1 through n
|
||||||
|
a single leading "(" indicates a v6.0-compatible format
|
||||||
|
.fi
|
||||||
|
.PP
|
||||||
|
Polygons are output using the first syntax.
|
||||||
|
The last format is supplied to be backward compatible with v6.0 and earlier
|
||||||
|
path formats and will not be supported in future versions of Postgres.
|
||||||
|
.SH "CIRCLE"
|
||||||
|
Circles are represented by a center point and a radius.
|
||||||
|
.PP
|
||||||
|
circle is specified using the following syntax:
|
||||||
|
.PP
|
||||||
|
.nf
|
||||||
|
< ( x , y ) , r >
|
||||||
|
.nf
|
||||||
|
( ( x , y ) , r )
|
||||||
|
.nf
|
||||||
|
( x , y ) , r
|
||||||
|
.nf
|
||||||
|
x , y , r
|
||||||
|
.sp
|
||||||
|
where
|
||||||
|
(x,y) is the center of the circle
|
||||||
|
r is the radius of the circle
|
||||||
|
.fi
|
||||||
|
.PP
|
||||||
|
Circles are output using the first syntax.
|
||||||
|
|
||||||
.SH "Built-in operators and functions"
|
.SH "Built-in operators and functions"
|
||||||
.SH OPERATORS
|
.SH OPERATORS
|
||||||
Postgres provides a large number of built-in operators on system types.
|
Postgres provides a large number of built-in operators on system types.
|
||||||
@ -276,6 +413,7 @@ general
|
|||||||
/ division
|
/ division
|
||||||
% modulus
|
% modulus
|
||||||
@ absolute value
|
@ absolute value
|
||||||
|
<===> distance between
|
||||||
|
|
||||||
float8
|
float8
|
||||||
^ exponentiation
|
^ exponentiation
|
||||||
@ -293,7 +431,6 @@ point
|
|||||||
\(eq|\(eq equality
|
\(eq|\(eq equality
|
||||||
===> point inside box
|
===> point inside box
|
||||||
===` point on path
|
===` point on path
|
||||||
<===> distance between points
|
|
||||||
|
|
||||||
box
|
box
|
||||||
&& boxes overlap
|
&& boxes overlap
|
||||||
@ -323,6 +460,17 @@ polygon
|
|||||||
~= A same as B
|
~= A same as B
|
||||||
~ A contains B
|
~ A contains B
|
||||||
|
|
||||||
|
circle
|
||||||
|
&& circles overlap
|
||||||
|
&< A overlaps B but does not extend to right of B
|
||||||
|
&> A overlaps B but does not extend to left of B
|
||||||
|
<< A is left of B
|
||||||
|
>> A is right of B
|
||||||
|
@ A is contained by B
|
||||||
|
~\(eq equality
|
||||||
|
~= A same as B
|
||||||
|
~ A contains B
|
||||||
|
|
||||||
tinterval
|
tinterval
|
||||||
#<\(eq interval length less or equal reltime
|
#<\(eq interval length less or equal reltime
|
||||||
#<> interval length not equal to reltime.
|
#<> interval length not equal to reltime.
|
||||||
@ -369,6 +517,22 @@ timespan
|
|||||||
float8 date_part(text,timespan) specified portion of time field
|
float8 date_part(text,timespan) specified portion of time field
|
||||||
bool isfinite(timespan) TRUE if this is a finite time
|
bool isfinite(timespan) TRUE if this is a finite time
|
||||||
reltime reltime(timespan) convert to reltime
|
reltime reltime(timespan) convert to reltime
|
||||||
|
|
||||||
|
box
|
||||||
|
box box(point,point) convert points to box
|
||||||
|
float8 area(box) area of box
|
||||||
|
|
||||||
|
path
|
||||||
|
bool isopen(path) TRUE if this is an open path
|
||||||
|
bool isclosed(path) TRUE if this is a closed path
|
||||||
|
|
||||||
|
circle
|
||||||
|
circle circle(point,float8) convert to circle
|
||||||
|
polygon polygon(npts,circle) convert to polygon with npts points
|
||||||
|
float8 center(circle) radius of circle
|
||||||
|
float8 radius(circle) radius of circle
|
||||||
|
float8 diameter(circle) diameter of circle
|
||||||
|
float8 area(circle) area of circle
|
||||||
.fi
|
.fi
|
||||||
|
|
||||||
.PP
|
.PP
|
||||||
@ -400,6 +564,7 @@ These operations are cast in terms of SQL types and so are
|
|||||||
.BR not
|
.BR not
|
||||||
directly usable as C function prototypes.
|
directly usable as C function prototypes.
|
||||||
|
|
||||||
|
.nf
|
||||||
result |left_type |right_type|operatr|func_name
|
result |left_type |right_type|operatr|func_name
|
||||||
---------+----------+----------+-------+---------------
|
---------+----------+----------+-------+---------------
|
||||||
_aclitem |_aclitem |aclitem |+ |aclinsert
|
_aclitem |_aclitem |aclitem |+ |aclinsert
|
||||||
@ -750,14 +915,14 @@ left_unary|operand |return_type
|
|||||||
; |float8 |float8
|
; |float8 |float8
|
||||||
: |float8 |float8
|
: |float8 |float8
|
||||||
% |float8 |float8
|
% |float8 |float8
|
||||||
\|\|/ |float8 |float8
|
||/ |float8 |float8
|
||||||
\|/ |float8 |float8
|
|/ |float8 |float8
|
||||||
@ |float8 |float8
|
@ |float8 |float8
|
||||||
- |float8 |float8
|
- |float8 |float8
|
||||||
- |int2 |int2
|
- |int2 |int2
|
||||||
- |int4 |int4
|
- |int4 |int4
|
||||||
!! |int4 |int4
|
!! |int4 |int4
|
||||||
\| |tinterval|abstime
|
| |tinterval|abstime
|
||||||
|
|
||||||
.fi
|
.fi
|
||||||
.in
|
.in
|
||||||
|
Reference in New Issue
Block a user