mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-01-12 18:34:36 +08: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:
parent
cf398593fd
commit
4b5319129c
@ -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 :
|
||||
|
@ -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 },
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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,
|
||||
|
@ -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 *);
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user