From 4b5319129cfe1e0c768d6263dbd0040df2efd3b4 Mon Sep 17 00:00:00 2001
From: "Marc G. Fournier" <scrappy@hub.org>
Date: Wed, 23 Apr 1997 03:18:27 +0000
Subject: [PATCH] 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...
---
 src/backend/parser/gram.y     |  32 +++++-
 src/backend/parser/keywords.c |   4 +-
 src/backend/tcop/utility.c    |  20 +++-
 src/backend/tcop/variable.c   | 137 ++++++++++++++++++++++---
 src/include/nodes/nodes.h     |   4 +-
 src/include/tcop/variable.h   |  49 +++++++--
 src/man/built-in.3            | 187 ++++++++++++++++++++++++++++++++--
 7 files changed, 392 insertions(+), 41 deletions(-)

diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index be874b20cd2..0c980c58c40 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -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 :
diff --git a/src/backend/parser/keywords.c b/src/backend/parser/keywords.c
index 804f20d7ca4..a76da4a2d0e 100644
--- a/src/backend/parser/keywords.c
+++ b/src/backend/parser/keywords.c
@@ -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		},
diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c
index ec4c7c68aef..03fcd111ca7 100644
--- a/src/backend/tcop/utility.c
+++ b/src/backend/tcop/utility.c
@@ -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;
       
diff --git a/src/backend/tcop/variable.c b/src/backend/tcop/variable.c
index 424e3d08fbd..a1c95a7a02a 100644
--- a/src/backend/tcop/variable.c
+++ b/src/backend/tcop/variable.c
@@ -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))
+			{
+			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
@@ -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;
+	}
diff --git a/src/include/nodes/nodes.h b/src/include/nodes/nodes.h
index a7c7ae95f1c..e63e56f251d 100644
--- a/src/include/nodes/nodes.h
+++ b/src/include/nodes/nodes.h
@@ -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,
diff --git a/src/include/tcop/variable.h b/src/include/tcop/variable.h
index 888a432ccec..dd0d70a8eeb 100644
--- a/src/include/tcop/variable.h
+++ b/src/include/tcop/variable.h
@@ -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 *);
diff --git a/src/man/built-in.3 b/src/man/built-in.3
index 5f2cf8d4563..ef950cc8973 100644
--- a/src/man/built-in.3
+++ b/src/man/built-in.3
@@ -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
-- 
GitLab