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:
Marc G. Fournier 1997-04-23 03:18:27 +00:00
parent cf398593fd
commit 4b5319129c
7 changed files with 392 additions and 41 deletions

View File

@ -10,7 +10,7 @@
*
*
* 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
* 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,
CreatedbStmt, DestroydbStmt, VacuumStmt, RetrieveStmt, CursorStmt,
ReplaceStmt, AppendStmt, NotifyStmt, DeleteStmt, ClusterStmt,
ExplainStmt, VariableSetStmt
ExplainStmt, VariableSetStmt, VariableShowStmt, VariableResetStmt
%type <str> relation_name, copy_file_name, copy_delimiter, def_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,
OIDS, ON, OPERATOR, OPTION, OR, ORDER,
PNULL, PRIVILEGES, PUBLIC, PURGE, P_TYPE,
RENAME, REPLACE, RETRIEVE, RETURNS, REVOKE, ROLLBACK, RULE,
SELECT, SET, SETOF, STDIN, STDOUT, STORE,
RENAME, REPLACE, RESET, RETRIEVE, RETURNS, REVOKE, ROLLBACK, RULE,
SELECT, SET, SETOF, SHOW, STDIN, STDOUT, STORE,
TABLE, TO, TRANSACTION, UNIQUE, UPDATE, USING, VACUUM, VALUES
VERBOSE, VERSION, VIEW, WHERE, WITH, WORK
%token EXECUTE, RECIPE, EXPLAIN, LIKE, SEQUENCE
@ -275,6 +275,8 @@ stmt : AddAttrStmt
| DestroydbStmt
| VacuumStmt
| VariableSetStmt
| VariableShowStmt
| VariableResetStmt
;
/*****************************************************************************
@ -289,7 +291,7 @@ VariableSetStmt: SET var_name TO var_value
VariableSetStmt *n = makeNode(VariableSetStmt);
n->name = $2;
n->value = $4;
$$ = (Node *) n;
}
;
@ -297,6 +299,26 @@ VariableSetStmt: SET var_name TO var_value
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 :

View File

@ -7,7 +7,7 @@
*
*
* 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 },
{ "rename", RENAME },
{ "replace", REPLACE },
{ "reset", RESET },
{ "retrieve", RETRIEVE },
{ "returns", RETURNS },
{ "revoke", REVOKE },
@ -125,6 +126,7 @@ static ScanKeyword ScanKeywords[] = {
{ "sequence", SEQUENCE },
{ "set", SET },
{ "setof", SETOF },
{ "show", SHOW },
{ "stdin", STDIN },
{ "stdout", STDOUT },
{ "store", STORE },

View File

@ -9,7 +9,7 @@
*
*
* 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;
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;

View File

@ -1,9 +1,49 @@
/*
* 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 $
* 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
* From: "Martin J. Laubach" <mjl@CSlab.tuwien.ac.at>
* Subject: [HACKERS] Patch: set date to euro/us postgres/iso/sql
@ -24,8 +64,10 @@
*/
/*-----------------------------------------------------------------------*/
#include <stdio.h>
#include <string.h>
#include "postgres.h"
#include "miscadmin.h"
#include "tcop/variable.h"
/*-----------------------------------------------------------------------*/
@ -70,38 +112,55 @@ static bool parse_null(const char *value)
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)
{
char tok[32];
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 */
if(!strcasecmp(tok, "iso"))
{
PGVariables.date.format = Date_ISO;
DateStyle = USE_ISO_DATES;
dcnt++;
}
else if(!strcasecmp(tok, "sql"))
{
PGVariables.date.format = Date_SQL;
DateStyle = USE_SQL_DATES;
dcnt++;
}
else if(!strcasecmp(tok, "postgres"))
{
PGVariables.date.format = Date_Postgres;
DateStyle = USE_POSTGRES_DATES;
dcnt++;
}
else if(!strcasecmp(tok, "euro"))
else if(!strncasecmp(tok, "euro", 4))
{
PGVariables.date.euro = TRUE;
EuroDates = TRUE;
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++;
}
else
@ -116,16 +175,39 @@ static bool parse_date(const char *value)
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
{
const char *name;
bool (*parser)(const char *);
bool (*show)();
bool (*reset)();
} VariableParsers[] =
{
{ "date", parse_date },
{ "timezone", parse_null },
{ NULL }
{ "datestyle", parse_date, show_date, reset_date },
{ "timezone", parse_null, show_null, reset_null },
{ NULL, NULL, NULL }
};
/*-----------------------------------------------------------------------*/
@ -139,14 +221,39 @@ bool SetPGVariable(const char *name, const char *value)
return (vp->parser)(value);
}
elog(NOTICE, "No such variable %s", name);
elog(NOTICE, "Unrecognized variable %s", name);
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;
}

View File

@ -6,7 +6,7 @@
*
* 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_CreateSeqStmt,
T_VariableSetStmt,
T_VariableShowStmt,
T_VariableResetStmt,
T_A_Expr = 700,
T_Attr,

View File

@ -1,9 +1,49 @@
/*
* 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 $
* 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
* From: "Martin J. Laubach" <mjl@CSlab.tuwien.ac.at>
* 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 *);
const char *GetPGVariable(const char *);
/*-----------------------------------------------------------------------*/
bool SetPGVariable(const char *, const char *);
const char *GetPGVariable(const char *);
bool GetPGVariable(const char *);
bool ResetPGVariable(const char *);

View File

@ -1,6 +1,6 @@
.\" This is -*-nroff-*-
.\" 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
.SH "DESCRIPTION"
This section describes the data types, functions and operators
@ -46,15 +46,17 @@ described in this section.
float4 single-precision floating-point number
float8 double-precision floating-point number
lseg 2-dimensional line segment
money decimal type with fixed precision
name a multi-character type for storing system identifiers
oid object identifier type
oid8 array of 8 oid
oidchar16 oid and char16 composed
oidint2 oid and int2 composed
oidint4 oid and int4 composed
path variable-length array of lseg
path open or closed line segments
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
regproc registered procedure
reltime (relative) date and time span (duration)
@ -72,10 +74,9 @@ described in this section.
.fi
.in
.PP
As a rule, the built-in types are all either (1) internal types, in
which case the user should not worry about their external format, or
(2) have obvious formats. The exceptions to this rule are the date and
time types.
Many of the built-in types have obvious external formats. However, several
types are either unique to Postgres, such as open and closed paths, or have
several possibilities for formats, such as date and time types.
.SH "Syntax of date and time types"
.SH "DATETIME"
@ -229,6 +230,142 @@ where
is a time in the absolute time format. Special abstime values such as
\*(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 OPERATORS
Postgres provides a large number of built-in operators on system types.
@ -276,6 +413,7 @@ general
/ division
% modulus
@ absolute value
<===> distance between
float8
^ exponentiation
@ -293,7 +431,6 @@ point
\(eq|\(eq equality
===> point inside box
===` point on path
<===> distance between points
box
&& boxes overlap
@ -323,6 +460,17 @@ polygon
~= A same as 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
#<\(eq interval length less or equal reltime
#<> interval length not equal to reltime.
@ -369,6 +517,22 @@ timespan
float8 date_part(text,timespan) specified portion of time field
bool isfinite(timespan) TRUE if this is a finite time
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
.PP
@ -400,6 +564,7 @@ These operations are cast in terms of SQL types and so are
.BR not
directly usable as C function prototypes.
.nf
result |left_type |right_type|operatr|func_name
---------+----------+----------+-------+---------------
_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
- |int2 |int2
- |int4 |int4
!! |int4 |int4
\| |tinterval|abstime
| |tinterval|abstime
.fi
.in