From 4b5319129cfe1e0c768d6263dbd0040df2efd3b4 Mon Sep 17 00:00:00 2001 From: "Marc G. Fournier" Date: Wed, 23 Apr 1997 03:18:27 +0000 Subject: [PATCH] To: Thomas Lockhart 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 be874b20cd..0c980c58c4 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 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 804f20d7ca..a76da4a2d0 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 ec4c7c68ae..03fcd111ca 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 424e3d08fb..a1c95a7a02 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 + * 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" * Subject: [HACKERS] Patch: set date to euro/us postgres/iso/sql @@ -24,8 +64,10 @@ */ /*-----------------------------------------------------------------------*/ +#include #include #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 a7c7ae95f1..e63e56f251 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 888a432cce..dd0d70a8ee 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 + * 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" * 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 5f2cf8d456..ef950cc897 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