*
*
* 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
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,
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
| DestroydbStmt
| VacuumStmt
| VariableSetStmt
+ | VariableShowStmt
+ | VariableResetStmt
;
/*****************************************************************************
VariableSetStmt *n = makeNode(VariableSetStmt);
n->name = $2;
n->value = $4;
-
+
$$ = (Node *) n;
}
;
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 :
*
*
* 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 $
*
*-------------------------------------------------------------------------
*/
{ "recipe", RECIPE },
{ "rename", RENAME },
{ "replace", REPLACE },
+ { "reset", RESET },
{ "retrieve", RETRIEVE },
{ "returns", RETURNS },
{ "revoke", REVOKE },
{ "sequence", SEQUENCE },
{ "set", SET },
{ "setof", SETOF },
+ { "show", SHOW },
{ "stdin", STDIN },
{ "stdout", STDOUT },
{ "store", STORE },
*
*
* 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 $
*
*-------------------------------------------------------------------------
*/
{
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;
/*
* 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
*/
/*-----------------------------------------------------------------------*/
+#include <stdio.h>
#include <string.h>
#include "postgres.h"
+#include "miscadmin.h"
#include "tcop/variable.h"
/*-----------------------------------------------------------------------*/
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))
+ {
+ EuroDates = TRUE;
+ ecnt++;
+ }
+ else if((!strcasecmp(tok, "us"))
+ || (!strncasecmp(tok, "noneuro", 7)))
{
- PGVariables.date.euro = TRUE;
+ EuroDates = FALSE;
ecnt++;
}
- else if(!strcasecmp(tok, "us"))
+ else if(!strcasecmp(tok, "default"))
{
- PGVariables.date.euro = FALSE;
+ DateStyle = USE_POSTGRES_DATES;
+ EuroDates = FALSE;
ecnt++;
}
else
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 }
};
/*-----------------------------------------------------------------------*/
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;
+ }
*
* 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 $
*
*-------------------------------------------------------------------------
*/
T_ExplainStmt,
T_CreateSeqStmt,
T_VariableSetStmt,
+ T_VariableShowStmt,
+ T_VariableResetStmt,
T_A_Expr = 700,
T_Attr,
/*
* 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
/*-----------------------------------------------------------------------*/
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 *);
.\" 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
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)
.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"
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.
/ division
% modulus
@ absolute value
+ <===> distance between
float8
^ exponentiation
\(eq|\(eq equality
===> point inside box
===` point on path
- <===> distance between points
box
&& boxes overlap
~= 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.
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
.BR not
directly usable as C function prototypes.
+.nf
result |left_type |right_type|operatr|func_name
---------+----------+----------+-------+---------------
_aclitem |_aclitem |aclitem |+ |aclinsert
; |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