4 /*-------------------------------------------------------------------------
7 * POSTGRES SQL YACC rules/actions
9 * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
10 * Portions Copyright (c) 1994, Regents of the University of California
14 * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.429 2003/08/17 19:58:05 tgl Exp $
17 * AUTHOR DATE MAJOR EVENT
18 * Andrew Yu Sept, 1994 POSTQUEL to SQL conversion
19 * Andrew Yu Oct, 1994 lispy code conversion
22 * CAPITALS are used to represent terminal symbols.
23 * non-capitals are used to represent non-terminals.
24 * SQL92-specific syntax is separated from plain SQL/Postgres syntax
25 * to help isolate the non-extensible portions of the parser.
27 * In general, nothing in this file should initiate database accesses
28 * nor depend on changeable state (such as SET variables). If you do
29 * database accesses, your code will fail when we have aborted the
30 * current transaction and are just parsing commands to find the next
31 * ROLLBACK or COMMIT. If you make use of SET variables, then you
32 * will do the wrong thing in multi-query strings like this:
33 * SET SQL_inheritance TO off; SELECT * FROM foo;
34 * because the entire string is parsed by gram.y before the SET gets
35 * executed. Anything that depends on the database or changeable state
36 * should be handled inside parse_analyze() so that it happens at the
37 * right time not the wrong time. The handling of SQL_inheritance is
41 * If you use a list, make sure the datum is a node so that the printing
44 * Sometimes we assign constants to makeStrings. Make sure we don't free
47 *-------------------------------------------------------------------------
54 #include "access/htup.h"
55 #include "catalog/index.h"
56 #include "catalog/namespace.h"
57 #include "catalog/pg_type.h"
58 #include "nodes/makefuncs.h"
59 #include "nodes/params.h"
60 #include "nodes/parsenodes.h"
61 #include "parser/gramparse.h"
62 #include "storage/lmgr.h"
63 #include "utils/numeric.h"
64 #include "utils/datetime.h"
65 #include "utils/date.h"
67 extern List *parsetree; /* final parse result is delivered here */
69 static bool QueryIsRule = FALSE;
72 * If you need access to certain yacc-generated variables and find that
73 * they're static by default, uncomment the next line. (this is not a
76 /*#define __YYSCLASS*/
78 static Node *makeTypeCast(Node *arg, TypeName *typename);
79 static Node *makeStringConst(char *str, TypeName *typename);
80 static Node *makeIntConst(int val);
81 static Node *makeFloatConst(char *str);
82 static Node *makeAConst(Value *v);
83 static Node *makeRowExpr(List *opr, List *largs, List *rargs);
84 static Node *makeDistinctExpr(List *largs, List *rargs);
85 static Node *makeRowNullTest(NullTestType test, List *args);
86 static DefElem *makeDefElem(char *name, Node *arg);
87 static A_Const *makeBoolConst(bool state);
88 static FuncCall *makeOverlaps(List *largs, List *rargs);
89 static SelectStmt *findLeftmostSelect(SelectStmt *node);
90 static void insertSelectOptions(SelectStmt *stmt,
91 List *sortClause, List *forUpdate,
92 Node *limitOffset, Node *limitCount);
93 static Node *makeSetOp(SetOperation op, bool all, Node *larg, Node *rarg);
94 static Node *doNegate(Node *n);
95 static void doNegateFloat(Value *v);
108 DropBehavior dbehavior;
109 OnCommitAction oncommit;
113 ColumnRef *columnref;
125 PrivTarget *privtarget;
128 VariableSetStmt *vsetstmt;
131 %type <node> stmt schema_stmt
132 AlterDatabaseSetStmt AlterDomainStmt AlterGroupStmt
133 AlterSeqStmt AlterTableStmt AlterUserStmt AlterUserSetStmt
134 AnalyzeStmt ClosePortalStmt ClusterStmt CommentStmt
135 ConstraintsSetStmt CopyStmt CreateAsStmt CreateCastStmt
136 CreateDomainStmt CreateGroupStmt CreateOpClassStmt CreatePLangStmt
137 CreateSchemaStmt CreateSeqStmt CreateStmt
138 CreateAssertStmt CreateTrigStmt CreateUserStmt
139 CreatedbStmt DeclareCursorStmt DefineStmt DeleteStmt
140 DropGroupStmt DropOpClassStmt DropPLangStmt DropStmt
141 DropAssertStmt DropTrigStmt DropRuleStmt DropCastStmt
142 DropUserStmt DropdbStmt ExplainStmt FetchStmt
143 GrantStmt IndexStmt InsertStmt ListenStmt LoadStmt
144 LockStmt NotifyStmt ExplainableStmt PreparableStmt
145 CreateFunctionStmt ReindexStmt RemoveAggrStmt
146 RemoveFuncStmt RemoveOperStmt RenameStmt RevokeStmt
147 RuleActionStmt RuleActionStmtOrEmpty RuleStmt
148 SelectStmt TransactionStmt TruncateStmt
149 UnlistenStmt UpdateStmt VacuumStmt
150 VariableResetStmt VariableSetStmt VariableShowStmt
151 ViewStmt CheckPointStmt CreateConversionStmt
152 DeallocateStmt PrepareStmt ExecuteStmt
154 %type <node> select_no_parens select_with_parens select_clause
157 %type <node> alter_column_default opclass_item
158 %type <ival> add_drop
160 %type <dbehavior> opt_drop_behavior
162 %type <list> createdb_opt_list copy_opt_list
163 %type <defelt> createdb_opt_item copy_opt_item
165 %type <ival> opt_lock lock_type cast_context
166 %type <boolean> opt_force opt_or_replace transaction_access_mode
167 opt_grant_grant_option opt_revoke_grant_option
169 %type <boolean> like_including_defaults
171 %type <list> user_list
173 %type <list> OptGroupList
174 %type <defelt> OptGroupElem
176 %type <list> OptUserList
177 %type <defelt> OptUserElem
179 %type <str> OptSchemaName
180 %type <list> OptSchemaEltList
182 %type <boolean> TriggerActionTime TriggerForSpec opt_trusted
183 %type <str> opt_lancompiler
185 %type <str> TriggerEvents
186 %type <value> TriggerFuncArg
188 %type <str> relation_name copy_file_name
189 database_name access_method_clause access_method attr_name
190 index_name name function_name file_name
192 %type <list> func_name handler_name qual_Op qual_all_Op
193 opt_class opt_validator
195 %type <range> qualified_name OptConstrFromTable
197 %type <str> all_Op MathOp opt_name SpecialRuleRelation
199 %type <str> iso_level opt_encoding
201 %type <list> grantee_list
202 %type <ival> privilege
203 %type <list> privileges privilege_list
204 %type <privtarget> privilege_target
205 %type <node> function_with_argtypes
206 %type <list> function_with_argtypes_list
207 %type <chr> TriggerOneEvent
209 %type <list> stmtblock stmtmulti
210 OptTableElementList TableElementList OptInherit definition
211 opt_distinct opt_definition func_args
212 func_args_list func_as createfunc_opt_list
213 oper_argtypes RuleActionList RuleActionMulti
214 opt_column_list columnList opt_name_list
215 sort_clause opt_sort_clause sortby_list index_params
216 name_list from_clause from_list opt_array_bounds
217 qualified_name_list any_name any_name_list
218 any_operator expr_list dotted_name attrs
219 target_list update_target_list insert_column_list
220 insert_target_list def_list opt_indirection
221 group_clause TriggerFuncArgs select_limit
222 opt_select_limit opclass_item_list transaction_mode_list
223 transaction_mode_list_or_empty
225 prep_type_clause prep_type_list
228 %type <range> into_clause OptTempTableName
230 %type <defelt> createfunc_opt_item
231 %type <typnam> func_arg func_return func_type aggr_argtype
233 %type <boolean> opt_arg TriggerForType OptTemp OptWithOids
234 %type <oncommit> OnCommitOption
236 %type <list> for_update_clause opt_for_update_clause update_list
237 %type <boolean> opt_all
239 %type <node> join_outer join_qual
240 %type <jtype> join_type
242 %type <list> extract_list overlay_list position_list
243 %type <list> substr_list trim_list
244 %type <ival> opt_interval
245 %type <node> overlay_placing substr_from substr_for
247 %type <boolean> opt_instead opt_analyze
248 %type <boolean> index_opt_unique opt_verbose opt_full
249 %type <boolean> opt_freeze opt_default opt_recheck
250 %type <defelt> opt_binary opt_oids copy_delimiter
252 %type <boolean> copy_from opt_hold
254 %type <ival> fetch_count opt_column event cursor_options
255 %type <objtype> reindex_type drop_type comment_type
257 %type <node> fetch_direction select_limit_value select_offset_value
259 %type <list> OptSeqList
260 %type <defelt> OptSeqElem
262 %type <istmt> insert_rest
264 %type <vsetstmt> set_rest
266 %type <node> TableElement ConstraintElem TableFuncElement
267 %type <node> columnDef
268 %type <defelt> def_elem
269 %type <node> def_arg columnElem where_clause insert_column_item
270 a_expr b_expr c_expr r_expr AexprConst
271 in_expr having_clause func_table array_expr
272 %type <list> row row_descriptor type_list array_expr_list
273 %type <node> case_expr case_arg when_clause case_default
274 %type <list> when_clause_list
275 %type <ival> sub_type
276 %type <list> OptCreateAs CreateAsList
277 %type <node> CreateAsElement
278 %type <value> NumericOnly FloatOnly IntegerOnly
279 %type <columnref> columnref
280 %type <alias> alias_clause
281 %type <sortby> sortby
282 %type <ielem> index_elem
283 %type <node> table_ref
284 %type <jexpr> joined_table
285 %type <range> relation_expr
286 %type <target> target_el insert_target_el update_target_el
288 %type <typnam> Typename SimpleTypename ConstTypename
289 GenericType Numeric opt_float
290 Character ConstCharacter
291 CharacterWithLength CharacterWithoutLength
292 ConstDatetime ConstInterval
293 Bit ConstBit BitWithLength BitWithoutLength
294 %type <str> character
295 %type <str> extract_arg
296 %type <str> opt_charset opt_collate
297 %type <ival> opt_numeric opt_decimal
298 %type <boolean> opt_varying opt_timezone
301 %type <str> Sconst comment_text
302 %type <str> UserId opt_boolean ColId_or_Sconst
303 %type <list> var_list var_list_or_default
304 %type <str> ColId ColLabel type_name
305 %type <node> var_value zone_value
307 %type <keyword> unreserved_keyword func_name_keyword
308 %type <keyword> col_name_keyword reserved_keyword
310 %type <node> TableConstraint TableLikeClause
311 %type <list> ColQualList
312 %type <node> ColConstraint ColConstraintElem ConstraintAttr
313 %type <ival> key_actions key_delete key_match key_update key_action
314 %type <ival> ConstraintAttributeSpec ConstraintDeferrabilitySpec
317 %type <list> constraints_set_list
318 %type <boolean> constraints_set_mode
322 * If you make any token changes, update the keyword table in
323 * parser/keywords.c and add new keywords to the appropriate one of
324 * the reserved-or-not-so-reserved keyword lists, below.
327 /* ordinary key words in alphabetical order */
328 %token <keyword> ABORT_P ABSOLUTE_P ACCESS ACTION ADD AFTER
329 AGGREGATE ALL ALTER ANALYSE ANALYZE AND ANY ARRAY AS ASC
330 ASSERTION ASSIGNMENT AT AUTHORIZATION
332 BACKWARD BEFORE BEGIN_P BETWEEN BIGINT BINARY BIT
335 CACHE CALLED CASCADE CASE CAST CHAIN CHAR_P
336 CHARACTER CHARACTERISTICS CHECK CHECKPOINT CLASS CLOSE
337 CLUSTER COALESCE COLLATE COLUMN COMMENT COMMIT
338 COMMITTED CONSTRAINT CONSTRAINTS CONVERSION_P CONVERT COPY CREATE CREATEDB
339 CREATEUSER CROSS CURRENT_DATE CURRENT_TIME
340 CURRENT_TIMESTAMP CURRENT_USER CURSOR CYCLE
342 DATABASE DAY_P DEALLOCATE DEC DECIMAL_P DECLARE DEFAULT DEFAULTS
343 DEFERRABLE DEFERRED DEFINER DELETE_P DELIMITER DELIMITERS
344 DESC DISTINCT DO DOMAIN_P DOUBLE_P DROP
346 EACH ELSE ENCODING ENCRYPTED END_P ESCAPE EXCEPT EXCLUDING
347 EXCLUSIVE EXECUTE EXISTS EXPLAIN EXTERNAL EXTRACT
349 FALSE_P FETCH FIRST_P FLOAT_P FOR FORCE FOREIGN FORWARD
350 FREEZE FROM FULL FUNCTION
354 HANDLER HAVING HOLD HOUR_P
356 ILIKE IMMEDIATE IMMUTABLE IMPLICIT_P IN_P INCLUDING INCREMENT
357 INDEX INHERITS INITIALLY INNER_P INOUT INPUT_P
358 INSENSITIVE INSERT INSTEAD INT_P INTEGER INTERSECT
359 INTERVAL INTO INVOKER IS ISNULL ISOLATION
365 LANCOMPILER LANGUAGE LAST_P LEADING LEFT LEVEL LIKE LIMIT
366 LISTEN LOAD LOCAL LOCALTIME LOCALTIMESTAMP LOCATION
369 MATCH MAXVALUE MINUTE_P MINVALUE MODE MONTH_P MOVE
371 NAMES NATIONAL NATURAL NCHAR NEW NEXT NO NOCREATEDB
372 NOCREATEUSER NONE NOT NOTHING NOTIFY NOTNULL NULL_P
375 OF OFF OFFSET OIDS OLD ON ONLY OPERATOR OPTION OR
376 ORDER OUT_P OUTER_P OVERLAPS OVERLAY OWNER
378 PARTIAL PASSWORD PATH_P PENDANT PLACING POSITION
379 PRECISION PRESERVE PREPARE PRIMARY
380 PRIOR PRIVILEGES PROCEDURAL PROCEDURE
382 READ REAL RECHECK REFERENCES REINDEX RELATIVE_P RENAME REPLACE
383 RESET RESTART RESTRICT RETURNS REVOKE RIGHT ROLLBACK ROW ROWS
386 SCHEMA SCROLL SECOND_P SECURITY SELECT SEQUENCE
387 SERIALIZABLE SESSION SESSION_USER SET SETOF SHARE
388 SHOW SIMILAR SIMPLE SMALLINT SOME STABLE START STATEMENT
389 STATISTICS STDIN STDOUT STORAGE STRICT_P SUBSTRING SYSID
391 TABLE TEMP TEMPLATE TEMPORARY THEN TIME TIMESTAMP
392 TO TOAST TRAILING TRANSACTION TREAT TRIGGER TRIM TRUE_P
393 TRUNCATE TRUSTED TYPE_P
395 UNENCRYPTED UNION UNIQUE UNKNOWN UNLISTEN UNTIL
396 UPDATE USAGE USER USING
398 VACUUM VALID VALIDATOR VALUES VARCHAR VARYING
399 VERBOSE VERSION VIEW VOLATILE
401 WHEN WHERE WITH WITHOUT WORK WRITE
407 /* The grammar thinks these are keywords, but they are not in the keywords.c
408 * list and so can never be entered directly. The filter in parser.c
409 * creates these tokens when required.
413 /* Special keywords, not in the query language - see the "lex" file */
414 %token <str> IDENT FCONST SCONST BCONST XCONST Op
415 %token <ival> ICONST PARAM
417 /* precedence: lowest to highest */
425 %nonassoc LIKE ILIKE SIMILAR
430 %left POSTFIXOP /* dummy for postfix Op rules */
431 %left Op OPERATOR /* multi-character ops and user-defined operators */
434 %nonassoc IS NULL_P TRUE_P FALSE_P UNKNOWN /* sets precedence for IS NULL, etc */
438 /* Unary Operators */
439 %left AT ZONE /* sets precedence for AT TIME ZONE */
447 * These might seem to be low-precedence, but actually they are not part
448 * of the arithmetic hierarchy at all in their use as JOIN operators.
449 * We make them high-precedence to support their use as function names.
450 * They wouldn't be given a precedence at all, were it not that we need
451 * left-associativity among the JOIN rules themselves.
453 %left JOIN UNIONJOIN CROSS LEFT FULL RIGHT INNER_P NATURAL
457 * Handle comment-only lines, and ;; SELECT * FROM pg_class ;;;
458 * psql already handles such cases, but other interfaces don't.
461 stmtblock: stmtmulti { parsetree = $1; }
464 /* the thrashing around here is to discard "empty" statements... */
465 stmtmulti: stmtmulti ';' stmt
466 { if ($3 != (Node *)NULL)
467 $$ = lappend($1, $3);
472 { if ($1 != (Node *)NULL)
497 | CreateConversionStmt
552 { $$ = (Node *)NULL; }
555 /*****************************************************************************
557 * Create a new Postgres DBMS user
560 *****************************************************************************/
563 CREATE USER UserId opt_with OptUserList
565 CreateUserStmt *n = makeNode(CreateUserStmt);
577 /*****************************************************************************
579 * Alter a postgresql DBMS user
582 *****************************************************************************/
585 ALTER USER UserId opt_with OptUserList
587 AlterUserStmt *n = makeNode(AlterUserStmt);
596 ALTER USER UserId SET set_rest
598 AlterUserSetStmt *n = makeNode(AlterUserSetStmt);
600 n->variable = $5->name;
604 | ALTER USER UserId VariableResetStmt
606 AlterUserSetStmt *n = makeNode(AlterUserSetStmt);
608 n->variable = ((VariableResetStmt *)$4)->name;
615 /*****************************************************************************
617 * Drop a postgresql DBMS user
619 * XXX Ideally this would have CASCADE/RESTRICT options, but since a user
620 * might own objects in multiple databases, there is presently no way to
621 * implement either cascading or restricting. Caveat DBA.
622 *****************************************************************************/
627 DropUserStmt *n = makeNode(DropUserStmt);
634 * Options for CREATE USER and ALTER USER
637 OptUserList OptUserElem { $$ = lappend($1, $2); }
638 | /* EMPTY */ { $$ = NIL; }
644 $$ = makeDefElem("password", (Node *)makeString($2));
646 | ENCRYPTED PASSWORD Sconst
648 $$ = makeDefElem("encryptedPassword", (Node *)makeString($3));
650 | UNENCRYPTED PASSWORD Sconst
652 $$ = makeDefElem("unencryptedPassword", (Node *)makeString($3));
656 $$ = makeDefElem("sysid", (Node *)makeInteger($2));
660 $$ = makeDefElem("createdb", (Node *)makeInteger(TRUE));
664 $$ = makeDefElem("createdb", (Node *)makeInteger(FALSE));
668 $$ = makeDefElem("createuser", (Node *)makeInteger(TRUE));
672 $$ = makeDefElem("createuser", (Node *)makeInteger(FALSE));
674 | IN_P GROUP_P user_list
676 $$ = makeDefElem("groupElts", (Node *)$3);
680 $$ = makeDefElem("validUntil", (Node *)makeString($3));
684 user_list: user_list ',' UserId { $$ = lappend($1, makeString($3)); }
685 | UserId { $$ = makeList1(makeString($1)); }
690 /*****************************************************************************
692 * Create a postgresql group
695 *****************************************************************************/
698 CREATE GROUP_P UserId opt_with OptGroupList
700 CreateGroupStmt *n = makeNode(CreateGroupStmt);
708 * Options for CREATE GROUP
711 OptGroupList OptGroupElem { $$ = lappend($1, $2); }
712 | /* EMPTY */ { $$ = NIL; }
718 $$ = makeDefElem("userElts", (Node *)$2);
722 $$ = makeDefElem("sysid", (Node *)makeInteger($2));
727 /*****************************************************************************
729 * Alter a postgresql group
732 *****************************************************************************/
735 ALTER GROUP_P UserId add_drop USER user_list
737 AlterGroupStmt *n = makeNode(AlterGroupStmt);
745 add_drop: ADD { $$ = +1; }
750 /*****************************************************************************
752 * Drop a postgresql group
754 * XXX see above notes about cascading DROP USER; groups have same problem.
755 *****************************************************************************/
760 DropGroupStmt *n = makeNode(DropGroupStmt);
767 /*****************************************************************************
769 * Manipulate a schema
771 *****************************************************************************/
774 CREATE SCHEMA OptSchemaName AUTHORIZATION UserId OptSchemaEltList
776 CreateSchemaStmt *n = makeNode(CreateSchemaStmt);
777 /* One can omit the schema name or the authorization id. */
786 | CREATE SCHEMA ColId OptSchemaEltList
788 CreateSchemaStmt *n = makeNode(CreateSchemaStmt);
789 /* ...but not both */
799 | /* EMPTY */ { $$ = NULL; }
803 OptSchemaEltList schema_stmt { $$ = lappend($1, $2); }
804 | /* EMPTY */ { $$ = NIL; }
808 * schema_stmt are the ones that can show up inside a CREATE SCHEMA
809 * statement (in addition to by themselves).
818 /*****************************************************************************
820 * Set PG internal variable
821 * SET name TO 'var_value'
822 * Include SQL92 syntax (thomas 1997-10-22):
823 * SET TIME ZONE 'var_value'
825 *****************************************************************************/
830 VariableSetStmt *n = $2;
836 VariableSetStmt *n = $3;
840 | SET SESSION set_rest
842 VariableSetStmt *n = $3;
848 set_rest: ColId TO var_list_or_default
850 VariableSetStmt *n = makeNode(VariableSetStmt);
855 | ColId '=' var_list_or_default
857 VariableSetStmt *n = makeNode(VariableSetStmt);
862 | TIME ZONE zone_value
864 VariableSetStmt *n = makeNode(VariableSetStmt);
865 n->name = "timezone";
867 n->args = makeList1($3);
870 | TRANSACTION transaction_mode_list
872 VariableSetStmt *n = makeNode(VariableSetStmt);
873 n->name = "TRANSACTION";
877 | SESSION CHARACTERISTICS AS TRANSACTION transaction_mode_list
879 VariableSetStmt *n = makeNode(VariableSetStmt);
880 n->name = "SESSION CHARACTERISTICS";
886 VariableSetStmt *n = makeNode(VariableSetStmt);
887 n->name = "client_encoding";
889 n->args = makeList1(makeStringConst($2, NULL));
892 | SESSION AUTHORIZATION ColId_or_Sconst
894 VariableSetStmt *n = makeNode(VariableSetStmt);
895 n->name = "session_authorization";
896 n->args = makeList1(makeStringConst($3, NULL));
899 | SESSION AUTHORIZATION DEFAULT
901 VariableSetStmt *n = makeNode(VariableSetStmt);
902 n->name = "session_authorization";
909 var_list { $$ = $1; }
910 | DEFAULT { $$ = NIL; }
913 var_list: var_value { $$ = makeList1($1); }
914 | var_list ',' var_value { $$ = lappend($1, $3); }
917 var_value: opt_boolean
918 { $$ = makeStringConst($1, NULL); }
920 { $$ = makeStringConst($1, NULL); }
922 { $$ = makeAConst($1); }
925 iso_level: READ COMMITTED { $$ = "read committed"; }
926 | SERIALIZABLE { $$ = "serializable"; }
930 TRUE_P { $$ = "true"; }
931 | FALSE_P { $$ = "false"; }
933 | OFF { $$ = "off"; }
936 /* Timezone values can be:
937 * - a string such as 'pst8pdt'
938 * - an identifier such as "pst8pdt"
939 * - an integer or floating point number
940 * - a time interval per SQL99
941 * ColId gives reduce/reduce errors against ConstInterval and LOCAL,
942 * so use IDENT and reject anything which is a reserved word.
947 $$ = makeStringConst($1, NULL);
951 $$ = makeStringConst($1, NULL);
953 | ConstInterval Sconst opt_interval
955 A_Const *n = (A_Const *) makeStringConst($2, $1);
956 if ($3 != INTERVAL_FULL_RANGE)
958 if (($3 & ~(INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE))) != 0)
960 (errcode(ERRCODE_SYNTAX_ERROR),
961 errmsg("time zone interval must be HOUR or HOUR TO MINUTE")));
962 n->typename->typmod = INTERVAL_TYPMOD(INTERVAL_FULL_PRECISION, $3);
966 | ConstInterval '(' Iconst ')' Sconst opt_interval
968 A_Const *n = (A_Const *) makeStringConst($5, $1);
971 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
972 errmsg("INTERVAL(%d) precision must not be negative",
974 if ($3 > MAX_INTERVAL_PRECISION)
977 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
978 errmsg("INTERVAL(%d) precision reduced to maximum allowed, %d",
979 $3, MAX_INTERVAL_PRECISION)));
980 $3 = MAX_INTERVAL_PRECISION;
983 if (($6 != INTERVAL_FULL_RANGE)
984 && (($6 & ~(INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE))) != 0))
986 (errcode(ERRCODE_SYNTAX_ERROR),
987 errmsg("time zone interval must be HOUR or HOUR TO MINUTE")));
989 n->typename->typmod = INTERVAL_TYPMOD($3, $6);
993 | NumericOnly { $$ = makeAConst($1); }
994 | DEFAULT { $$ = NULL; }
995 | LOCAL { $$ = NULL; }
1000 | DEFAULT { $$ = NULL; }
1001 | /*EMPTY*/ { $$ = NULL; }
1006 | SCONST { $$ = $1; }
1013 VariableShowStmt *n = makeNode(VariableShowStmt);
1019 VariableShowStmt *n = makeNode(VariableShowStmt);
1020 n->name = "timezone";
1023 | SHOW TRANSACTION ISOLATION LEVEL
1025 VariableShowStmt *n = makeNode(VariableShowStmt);
1026 n->name = "transaction_isolation";
1029 | SHOW SESSION AUTHORIZATION
1031 VariableShowStmt *n = makeNode(VariableShowStmt);
1032 n->name = "session_authorization";
1037 VariableShowStmt *n = makeNode(VariableShowStmt);
1046 VariableResetStmt *n = makeNode(VariableResetStmt);
1052 VariableResetStmt *n = makeNode(VariableResetStmt);
1053 n->name = "timezone";
1056 | RESET TRANSACTION ISOLATION LEVEL
1058 VariableResetStmt *n = makeNode(VariableResetStmt);
1059 n->name = "transaction_isolation";
1062 | RESET SESSION AUTHORIZATION
1064 VariableResetStmt *n = makeNode(VariableResetStmt);
1065 n->name = "session_authorization";
1070 VariableResetStmt *n = makeNode(VariableResetStmt);
1078 SET CONSTRAINTS constraints_set_list constraints_set_mode
1080 ConstraintsSetStmt *n = makeNode(ConstraintsSetStmt);
1081 n->constraints = $3;
1087 constraints_set_list:
1089 | name_list { $$ = $1; }
1092 constraints_set_mode:
1093 DEFERRED { $$ = TRUE; }
1094 | IMMEDIATE { $$ = FALSE; }
1099 * Checkpoint statement
1104 CheckPointStmt *n = makeNode(CheckPointStmt);
1110 /*****************************************************************************
1112 * ALTER TABLE variations
1114 *****************************************************************************/
1117 /* ALTER TABLE <relation> ADD [COLUMN] <coldef> */
1118 ALTER TABLE relation_expr ADD opt_column columnDef
1120 AlterTableStmt *n = makeNode(AlterTableStmt);
1126 /* ALTER TABLE <relation> ALTER [COLUMN] <colname> {SET DEFAULT <expr>|DROP DEFAULT} */
1127 | ALTER TABLE relation_expr ALTER opt_column ColId alter_column_default
1129 AlterTableStmt *n = makeNode(AlterTableStmt);
1136 /* ALTER TABLE <relation> ALTER [COLUMN] <colname> DROP NOT NULL */
1137 | ALTER TABLE relation_expr ALTER opt_column ColId DROP NOT NULL_P
1139 AlterTableStmt *n = makeNode(AlterTableStmt);
1145 /* ALTER TABLE <relation> ALTER [COLUMN] <colname> SET NOT NULL */
1146 | ALTER TABLE relation_expr ALTER opt_column ColId SET NOT NULL_P
1148 AlterTableStmt *n = makeNode(AlterTableStmt);
1154 /* ALTER TABLE <relation> ALTER [COLUMN] <colname> SET STATISTICS <IntegerOnly> */
1155 | ALTER TABLE relation_expr ALTER opt_column ColId SET STATISTICS IntegerOnly
1157 AlterTableStmt *n = makeNode(AlterTableStmt);
1161 n->def = (Node *) $9;
1164 /* ALTER TABLE <relation> ALTER [COLUMN] <colname> SET STORAGE <storagemode> */
1165 | ALTER TABLE relation_expr ALTER opt_column ColId
1168 AlterTableStmt *n = makeNode(AlterTableStmt);
1172 n->def = (Node *) makeString($9);
1175 /* ALTER TABLE <relation> DROP [COLUMN] <colname> [RESTRICT|CASCADE] */
1176 | ALTER TABLE relation_expr DROP opt_column ColId opt_drop_behavior
1178 AlterTableStmt *n = makeNode(AlterTableStmt);
1185 /* ALTER TABLE <relation> ADD CONSTRAINT ... */
1186 | ALTER TABLE relation_expr ADD TableConstraint
1188 AlterTableStmt *n = makeNode(AlterTableStmt);
1194 /* ALTER TABLE <relation> DROP CONSTRAINT <name> [RESTRICT|CASCADE] */
1195 | ALTER TABLE relation_expr DROP CONSTRAINT name opt_drop_behavior
1197 AlterTableStmt *n = makeNode(AlterTableStmt);
1204 /* ALTER TABLE <relation> SET WITHOUT OIDS */
1205 | ALTER TABLE relation_expr SET WITHOUT OIDS
1207 AlterTableStmt *n = makeNode(AlterTableStmt);
1212 /* ALTER TABLE <name> CREATE TOAST TABLE */
1213 | ALTER TABLE qualified_name CREATE TOAST TABLE
1215 AlterTableStmt *n = makeNode(AlterTableStmt);
1217 $3->inhOpt = INH_NO;
1221 /* ALTER TABLE <name> OWNER TO UserId */
1222 | ALTER TABLE qualified_name OWNER TO UserId
1224 AlterTableStmt *n = makeNode(AlterTableStmt);
1226 $3->inhOpt = INH_NO;
1231 /* ALTER TABLE <name> CLUSTER ON <indexname> */
1232 | ALTER TABLE qualified_name CLUSTER ON name
1234 AlterTableStmt *n = makeNode(AlterTableStmt);
1242 alter_column_default:
1245 /* Treat SET DEFAULT NULL the same as DROP DEFAULT */
1246 if (exprIsNullConstant($3))
1251 | DROP DEFAULT { $$ = NULL; }
1255 CASCADE { $$ = DROP_CASCADE; }
1256 | RESTRICT { $$ = DROP_RESTRICT; }
1257 | /* EMPTY */ { $$ = DROP_RESTRICT; /* default */ }
1261 /*****************************************************************************
1264 * close <portalname>
1266 *****************************************************************************/
1271 ClosePortalStmt *n = makeNode(ClosePortalStmt);
1278 /*****************************************************************************
1281 * COPY <relname> ['(' columnList ')'] FROM/TO [WITH options]
1283 * BINARY, OIDS, and DELIMITERS kept in old locations
1284 * for backward compatibility. 2002-06-18
1286 *****************************************************************************/
1288 CopyStmt: COPY opt_binary qualified_name opt_column_list opt_oids
1289 copy_from copy_file_name copy_delimiter opt_with copy_opt_list
1291 CopyStmt *n = makeNode(CopyStmt);
1298 /* Concatenate user-supplied flags */
1300 n->options = lappend(n->options, $2);
1302 n->options = lappend(n->options, $5);
1304 n->options = lappend(n->options, $8);
1306 n->options = nconc(n->options, $10);
1313 | TO { $$ = FALSE; }
1317 * copy_file_name NULL indicates stdio is used. Whether stdin or stdout is
1318 * used depends on the direction. (It really doesn't make sense to copy from
1319 * stdout. We silently correct the "typo". - AY 9/94
1323 | STDIN { $$ = NULL; }
1324 | STDOUT { $$ = NULL; }
1330 copy_opt_list copy_opt_item { $$ = lappend($1, $2); }
1331 | /* EMPTY */ { $$ = NIL; }
1338 $$ = makeDefElem("binary", (Node *)makeInteger(TRUE));
1342 $$ = makeDefElem("oids", (Node *)makeInteger(TRUE));
1344 | DELIMITER opt_as Sconst
1346 $$ = makeDefElem("delimiter", (Node *)makeString($3));
1348 | NULL_P opt_as Sconst
1350 $$ = makeDefElem("null", (Node *)makeString($3));
1354 /* The following exist for backward compatibility */
1359 $$ = makeDefElem("binary", (Node *)makeInteger(TRUE));
1361 | /*EMPTY*/ { $$ = NULL; }
1367 $$ = makeDefElem("oids", (Node *)makeInteger(TRUE));
1369 | /*EMPTY*/ { $$ = NULL; }
1373 /* USING DELIMITERS kept for backward compatibility. 2002-06-15 */
1374 opt_using DELIMITERS Sconst
1376 $$ = makeDefElem("delimiter", (Node *)makeString($3));
1378 | /*EMPTY*/ { $$ = NULL; }
1387 /*****************************************************************************
1390 * CREATE TABLE relname
1392 *****************************************************************************/
1394 CreateStmt: CREATE OptTemp TABLE qualified_name '(' OptTableElementList ')'
1395 OptInherit OptWithOids OnCommitOption
1397 CreateStmt *n = makeNode(CreateStmt);
1401 n->inhRelations = $8;
1402 n->constraints = NIL;
1407 | CREATE OptTemp TABLE qualified_name OF qualified_name
1408 '(' OptTableElementList ')' OptWithOids OnCommitOption
1410 /* SQL99 CREATE TABLE OF <UDT> (cols) seems to be satisfied
1411 * by our inheritance capabilities. Let's try it...
1413 CreateStmt *n = makeNode(CreateStmt);
1417 n->inhRelations = makeList1($6);
1418 n->constraints = NIL;
1426 * Redundancy here is needed to avoid shift/reduce conflicts,
1427 * since TEMP is not a reserved word. See also OptTempTableName.
1429 * NOTE: we accept both GLOBAL and LOCAL options; since we have no modules
1430 * the LOCAL keyword is really meaningless.
1432 OptTemp: TEMPORARY { $$ = TRUE; }
1433 | TEMP { $$ = TRUE; }
1434 | LOCAL TEMPORARY { $$ = TRUE; }
1435 | LOCAL TEMP { $$ = TRUE; }
1436 | GLOBAL TEMPORARY { $$ = TRUE; }
1437 | GLOBAL TEMP { $$ = TRUE; }
1438 | /*EMPTY*/ { $$ = FALSE; }
1441 OptTableElementList:
1442 TableElementList { $$ = $1; }
1443 | /*EMPTY*/ { $$ = NIL; }
1451 | TableElementList ',' TableElement
1453 $$ = lappend($1, $3);
1458 columnDef { $$ = $1; }
1459 | TableLikeClause { $$ = $1; }
1460 | TableConstraint { $$ = $1; }
1463 columnDef: ColId Typename ColQualList opt_collate
1465 ColumnDef *n = makeNode(ColumnDef);
1468 n->constraints = $3;
1473 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1474 errmsg("CREATE TABLE / COLLATE is not yet implemented; clause ignored")));
1481 ColQualList ColConstraint { $$ = lappend($1, $2); }
1482 | /*EMPTY*/ { $$ = NIL; }
1486 CONSTRAINT name ColConstraintElem
1488 switch (nodeTag($3))
1492 Constraint *n = (Constraint *)$3;
1496 case T_FkConstraint:
1498 FkConstraint *n = (FkConstraint *)$3;
1499 n->constr_name = $2;
1507 | ColConstraintElem { $$ = $1; }
1508 | ConstraintAttr { $$ = $1; }
1511 /* DEFAULT NULL is already the default for Postgres.
1512 * But define it here and carry it forward into the system
1513 * to make it explicit.
1514 * - thomas 1998-09-13
1516 * WITH NULL and NULL are not SQL92-standard syntax elements,
1517 * so leave them out. Use DEFAULT NULL to explicitly indicate
1518 * that a column may have that value. WITH NULL leads to
1519 * shift/reduce conflicts with WITH TIME ZONE anyway.
1520 * - thomas 1999-01-08
1522 * DEFAULT expression must be b_expr not a_expr to prevent shift/reduce
1523 * conflict on NOT (since NOT might start a subsequent NOT NULL constraint,
1524 * or be part of a_expr NOT LIKE or similar constructs).
1529 Constraint *n = makeNode(Constraint);
1530 n->contype = CONSTR_NOTNULL;
1533 n->cooked_expr = NULL;
1539 Constraint *n = makeNode(Constraint);
1540 n->contype = CONSTR_NULL;
1543 n->cooked_expr = NULL;
1549 Constraint *n = makeNode(Constraint);
1550 n->contype = CONSTR_UNIQUE;
1553 n->cooked_expr = NULL;
1559 Constraint *n = makeNode(Constraint);
1560 n->contype = CONSTR_PRIMARY;
1563 n->cooked_expr = NULL;
1567 | CHECK '(' a_expr ')'
1569 Constraint *n = makeNode(Constraint);
1570 n->contype = CONSTR_CHECK;
1573 n->cooked_expr = NULL;
1579 Constraint *n = makeNode(Constraint);
1580 n->contype = CONSTR_DEFAULT;
1582 if (exprIsNullConstant($2))
1584 /* DEFAULT NULL should be reported as empty expr */
1591 n->cooked_expr = NULL;
1595 | REFERENCES qualified_name opt_column_list key_match key_actions
1597 FkConstraint *n = makeNode(FkConstraint);
1598 n->constr_name = NULL;
1602 n->fk_matchtype = $4;
1603 n->fk_upd_action = (char) ($5 >> 8);
1604 n->fk_del_action = (char) ($5 & 0xFF);
1605 n->deferrable = FALSE;
1606 n->initdeferred = FALSE;
1612 * ConstraintAttr represents constraint attributes, which we parse as if
1613 * they were independent constraint clauses, in order to avoid shift/reduce
1614 * conflicts (since NOT might start either an independent NOT NULL clause
1615 * or an attribute). analyze.c is responsible for attaching the attribute
1616 * information to the preceding "real" constraint node, and for complaining
1617 * if attribute clauses appear in the wrong place or wrong combinations.
1619 * See also ConstraintAttributeSpec, which can be used in places where
1620 * there is no parsing conflict.
1625 Constraint *n = makeNode(Constraint);
1626 n->contype = CONSTR_ATTR_DEFERRABLE;
1631 Constraint *n = makeNode(Constraint);
1632 n->contype = CONSTR_ATTR_NOT_DEFERRABLE;
1635 | INITIALLY DEFERRED
1637 Constraint *n = makeNode(Constraint);
1638 n->contype = CONSTR_ATTR_DEFERRED;
1641 | INITIALLY IMMEDIATE
1643 Constraint *n = makeNode(Constraint);
1644 n->contype = CONSTR_ATTR_IMMEDIATE;
1651 * SQL99 supports wholesale borrowing of a table definition via the LIKE clause.
1652 * This seems to be a poor man's inheritance capability, with the resulting
1653 * tables completely decoupled except for the original commonality in definitions.
1655 * This is very similar to CREATE TABLE AS except for the INCLUDING DEFAULTS extension
1656 * which is a part of SQL 200N
1659 LIKE qualified_name like_including_defaults
1661 InhRelation *n = makeNode(InhRelation);
1663 n->including_defaults = $3;
1669 like_including_defaults:
1670 INCLUDING DEFAULTS { $$ = true; }
1671 | EXCLUDING DEFAULTS { $$ = false; }
1672 | /* EMPTY */ { $$ = false; }
1676 /* ConstraintElem specifies constraint syntax which is not embedded into
1677 * a column definition. ColConstraintElem specifies the embedded form.
1678 * - thomas 1997-12-03
1681 CONSTRAINT name ConstraintElem
1683 switch (nodeTag($3))
1687 Constraint *n = (Constraint *)$3;
1691 case T_FkConstraint:
1693 FkConstraint *n = (FkConstraint *)$3;
1694 n->constr_name = $2;
1702 | ConstraintElem { $$ = $1; }
1706 CHECK '(' a_expr ')'
1708 Constraint *n = makeNode(Constraint);
1709 n->contype = CONSTR_CHECK;
1712 n->cooked_expr = NULL;
1715 | UNIQUE '(' columnList ')'
1717 Constraint *n = makeNode(Constraint);
1718 n->contype = CONSTR_UNIQUE;
1721 n->cooked_expr = NULL;
1725 | PRIMARY KEY '(' columnList ')'
1727 Constraint *n = makeNode(Constraint);
1728 n->contype = CONSTR_PRIMARY;
1731 n->cooked_expr = NULL;
1735 | FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
1736 opt_column_list key_match key_actions ConstraintAttributeSpec
1738 FkConstraint *n = makeNode(FkConstraint);
1739 n->constr_name = NULL;
1743 n->fk_matchtype = $9;
1744 n->fk_upd_action = (char) ($10 >> 8);
1745 n->fk_del_action = (char) ($10 & 0xFF);
1746 n->deferrable = ($11 & 1) != 0;
1747 n->initdeferred = ($11 & 2) != 0;
1753 '(' columnList ')' { $$ = $2; }
1754 | /*EMPTY*/ { $$ = NIL; }
1758 columnElem { $$ = makeList1($1); }
1759 | columnList ',' columnElem { $$ = lappend($1, $3); }
1764 $$ = (Node *) makeString($1);
1768 key_match: MATCH FULL
1770 $$ = FKCONSTR_MATCH_FULL;
1775 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1776 errmsg("FOREIGN KEY/MATCH PARTIAL is not yet implemented")));
1777 $$ = FKCONSTR_MATCH_PARTIAL;
1781 $$ = FKCONSTR_MATCH_UNSPECIFIED;
1785 $$ = FKCONSTR_MATCH_UNSPECIFIED;
1790 * We combine the update and delete actions into one value temporarily
1791 * for simplicity of parsing, and then break them down again in the
1792 * calling production. update is in the left 8 bits, delete in the right.
1793 * Note that NOACTION is the default.
1797 { $$ = ($1 << 8) | (FKCONSTR_ACTION_NOACTION & 0xFF); }
1799 { $$ = (FKCONSTR_ACTION_NOACTION << 8) | ($1 & 0xFF); }
1800 | key_update key_delete
1801 { $$ = ($1 << 8) | ($2 & 0xFF); }
1802 | key_delete key_update
1803 { $$ = ($2 << 8) | ($1 & 0xFF); }
1805 { $$ = (FKCONSTR_ACTION_NOACTION << 8) | (FKCONSTR_ACTION_NOACTION & 0xFF); }
1808 key_update: ON UPDATE key_action { $$ = $3; }
1811 key_delete: ON DELETE_P key_action { $$ = $3; }
1815 NO ACTION { $$ = FKCONSTR_ACTION_NOACTION; }
1816 | RESTRICT { $$ = FKCONSTR_ACTION_RESTRICT; }
1817 | CASCADE { $$ = FKCONSTR_ACTION_CASCADE; }
1818 | SET NULL_P { $$ = FKCONSTR_ACTION_SETNULL; }
1819 | SET DEFAULT { $$ = FKCONSTR_ACTION_SETDEFAULT; }
1822 OptInherit: INHERITS '(' qualified_name_list ')' { $$ = $3; }
1823 | /*EMPTY*/ { $$ = NIL; }
1827 WITH OIDS { $$ = TRUE; }
1828 | WITHOUT OIDS { $$ = FALSE; }
1829 | /*EMPTY*/ { $$ = TRUE; }
1832 OnCommitOption: ON COMMIT DROP { $$ = ONCOMMIT_DROP; }
1833 | ON COMMIT DELETE_P ROWS { $$ = ONCOMMIT_DELETE_ROWS; }
1834 | ON COMMIT PRESERVE ROWS { $$ = ONCOMMIT_PRESERVE_ROWS; }
1835 | /*EMPTY*/ { $$ = ONCOMMIT_NOOP; }
1840 * Note: CREATE TABLE ... AS SELECT ... is just another spelling for
1845 CREATE OptTemp TABLE qualified_name OptCreateAs AS SelectStmt
1848 * When the SelectStmt is a set-operation tree, we must
1849 * stuff the INTO information into the leftmost component
1850 * Select, because that's where analyze.c will expect
1851 * to find it. Similarly, the output column names must
1852 * be attached to that Select's target list.
1854 SelectStmt *n = findLeftmostSelect((SelectStmt *) $7);
1855 if (n->into != NULL)
1857 (errcode(ERRCODE_SYNTAX_ERROR),
1858 errmsg("CREATE TABLE AS may not specify INTO")));
1861 n->intoColNames = $5;
1867 '(' CreateAsList ')' { $$ = $2; }
1868 | /*EMPTY*/ { $$ = NIL; }
1872 CreateAsElement { $$ = makeList1($1); }
1873 | CreateAsList ',' CreateAsElement { $$ = lappend($1, $3); }
1879 ColumnDef *n = makeNode(ColumnDef);
1884 n->is_not_null = false;
1885 n->raw_default = NULL;
1886 n->cooked_default = NULL;
1887 n->constraints = NIL;
1894 /*****************************************************************************
1897 * CREATE SEQUENCE seqname
1898 * ALTER SEQUENCE seqname
1900 *****************************************************************************/
1903 CREATE OptTemp SEQUENCE qualified_name OptSeqList
1905 CreateSeqStmt *n = makeNode(CreateSeqStmt);
1914 ALTER SEQUENCE qualified_name OptSeqList
1916 AlterSeqStmt *n = makeNode(AlterSeqStmt);
1923 OptSeqList: OptSeqList OptSeqElem { $$ = lappend($1, $2); }
1924 | /*EMPTY*/ { $$ = NIL; }
1927 OptSeqElem: CACHE NumericOnly
1929 $$ = makeDefElem("cache", (Node *)$2);
1933 $$ = makeDefElem("cycle", (Node *)true);
1937 $$ = makeDefElem("cycle", (Node *)false);
1939 | INCREMENT opt_by NumericOnly
1941 $$ = makeDefElem("increment", (Node *)$3);
1943 | MAXVALUE NumericOnly
1945 $$ = makeDefElem("maxvalue", (Node *)$2);
1947 | MINVALUE NumericOnly
1949 $$ = makeDefElem("minvalue", (Node *)$2);
1953 $$ = makeDefElem("maxvalue", (Node *)NULL);
1957 $$ = makeDefElem("minvalue", (Node *)NULL);
1959 | START opt_with NumericOnly
1961 $$ = makeDefElem("start", (Node *)$3);
1963 | RESTART opt_with NumericOnly
1965 $$ = makeDefElem("restart", (Node *)$3);
1974 FloatOnly { $$ = $1; }
1975 | IntegerOnly { $$ = $1; }
1978 FloatOnly: FCONST { $$ = makeFloat($1); }
1989 $$ = makeInteger($1);
1993 $$ = makeInteger($2);
1994 $$->val.ival = - $$->val.ival;
1998 /*****************************************************************************
2001 * CREATE PROCEDURAL LANGUAGE ...
2002 * DROP PROCEDURAL LANGUAGE ...
2004 *****************************************************************************/
2007 CREATE opt_trusted opt_procedural LANGUAGE ColId_or_Sconst
2008 HANDLER handler_name opt_validator opt_lancompiler
2010 CreatePLangStmt *n = makeNode(CreatePLangStmt);
2013 n->plvalidator = $8;
2020 TRUSTED { $$ = TRUE; }
2021 | /*EMPTY*/ { $$ = FALSE; }
2024 /* This ought to be just func_name, but that causes reduce/reduce conflicts
2025 * (CREATE LANGUAGE is the only place where func_name isn't followed by '(').
2026 * Work around by using name and dotted_name separately.
2030 { $$ = makeList1(makeString($1)); }
2031 | dotted_name { $$ = $1; }
2035 LANCOMPILER Sconst { $$ = $2; }
2036 | /*EMPTY*/ { $$ = ""; }
2040 VALIDATOR handler_name { $$ = $2; }
2041 | /*EMPTY*/ { $$ = NULL; }
2045 DROP opt_procedural LANGUAGE ColId_or_Sconst opt_drop_behavior
2047 DropPLangStmt *n = makeNode(DropPLangStmt);
2059 /*****************************************************************************
2062 * CREATE TRIGGER ...
2065 *****************************************************************************/
2068 CREATE TRIGGER name TriggerActionTime TriggerEvents ON
2069 qualified_name TriggerForSpec EXECUTE PROCEDURE
2070 func_name '(' TriggerFuncArgs ')'
2072 CreateTrigStmt *n = makeNode(CreateTrigStmt);
2079 memcpy(n->actions, $5, 4);
2080 n->isconstraint = FALSE;
2081 n->deferrable = FALSE;
2082 n->initdeferred = FALSE;
2083 n->constrrel = NULL;
2086 | CREATE CONSTRAINT TRIGGER name AFTER TriggerEvents ON
2087 qualified_name OptConstrFromTable
2088 ConstraintAttributeSpec
2089 FOR EACH ROW EXECUTE PROCEDURE
2090 func_name '(' TriggerFuncArgs ')'
2092 CreateTrigStmt *n = makeNode(CreateTrigStmt);
2099 memcpy(n->actions, $6, 4);
2100 n->isconstraint = TRUE;
2101 n->deferrable = ($10 & 1) != 0;
2102 n->initdeferred = ($10 & 2) != 0;
2110 BEFORE { $$ = TRUE; }
2111 | AFTER { $$ = FALSE; }
2117 char *e = palloc(4);
2118 e[0] = $1; e[1] = '\0';
2121 | TriggerOneEvent OR TriggerOneEvent
2123 char *e = palloc(4);
2124 e[0] = $1; e[1] = $3; e[2] = '\0';
2127 | TriggerOneEvent OR TriggerOneEvent OR TriggerOneEvent
2129 char *e = palloc(4);
2130 e[0] = $1; e[1] = $3; e[2] = $5; e[3] = '\0';
2136 INSERT { $$ = 'i'; }
2137 | DELETE_P { $$ = 'd'; }
2138 | UPDATE { $$ = 'u'; }
2142 FOR TriggerForOpt TriggerForType
2149 * If ROW/STATEMENT not specified, default to
2150 * STATEMENT, per SQL
2163 | STATEMENT { $$ = FALSE; }
2167 TriggerFuncArg { $$ = makeList1($1); }
2168 | TriggerFuncArgs ',' TriggerFuncArg { $$ = lappend($1, $3); }
2169 | /*EMPTY*/ { $$ = NIL; }
2176 snprintf(buf, sizeof(buf), "%d", $1);
2177 $$ = makeString(pstrdup(buf));
2179 | FCONST { $$ = makeString($1); }
2180 | Sconst { $$ = makeString($1); }
2181 | BCONST { $$ = makeString($1); }
2182 | XCONST { $$ = makeString($1); }
2183 | ColId { $$ = makeString($1); }
2187 FROM qualified_name { $$ = $2; }
2188 | /*EMPTY*/ { $$ = NULL; }
2191 ConstraintAttributeSpec:
2192 ConstraintDeferrabilitySpec
2194 | ConstraintDeferrabilitySpec ConstraintTimeSpec
2196 if ($1 == 0 && $2 != 0)
2198 (errcode(ERRCODE_SYNTAX_ERROR),
2199 errmsg("INITIALLY DEFERRED constraint must be DEFERRABLE")));
2202 | ConstraintTimeSpec
2209 | ConstraintTimeSpec ConstraintDeferrabilitySpec
2211 if ($2 == 0 && $1 != 0)
2213 (errcode(ERRCODE_SYNTAX_ERROR),
2214 errmsg("INITIALLY DEFERRED constraint must be DEFERRABLE")));
2221 ConstraintDeferrabilitySpec:
2222 NOT DEFERRABLE { $$ = 0; }
2223 | DEFERRABLE { $$ = 1; }
2227 INITIALLY IMMEDIATE { $$ = 0; }
2228 | INITIALLY DEFERRED { $$ = 2; }
2233 DROP TRIGGER name ON qualified_name opt_drop_behavior
2235 DropPropertyStmt *n = makeNode(DropPropertyStmt);
2239 n->removeType = OBJECT_TRIGGER;
2245 /*****************************************************************************
2248 * CREATE ASSERTION ...
2249 * DROP ASSERTION ...
2251 *****************************************************************************/
2254 CREATE ASSERTION name CHECK '(' a_expr ')'
2255 ConstraintAttributeSpec
2257 CreateTrigStmt *n = makeNode(CreateTrigStmt);
2259 n->args = makeList1($6);
2260 n->isconstraint = TRUE;
2261 n->deferrable = ($8 & 1) != 0;
2262 n->initdeferred = ($8 & 2) != 0;
2265 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2266 errmsg("CREATE ASSERTION is not yet implemented")));
2273 DROP ASSERTION name opt_drop_behavior
2275 DropPropertyStmt *n = makeNode(DropPropertyStmt);
2279 n->removeType = OBJECT_TRIGGER; /* XXX */
2281 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2282 errmsg("DROP ASSERTION is not yet implemented")));
2288 /*****************************************************************************
2291 * define (aggregate,operator,type)
2293 *****************************************************************************/
2296 CREATE AGGREGATE func_name definition
2298 DefineStmt *n = makeNode(DefineStmt);
2299 n->kind = OBJECT_AGGREGATE;
2304 | CREATE OPERATOR any_operator definition
2306 DefineStmt *n = makeNode(DefineStmt);
2307 n->kind = OBJECT_OPERATOR;
2312 | CREATE TYPE_P any_name definition
2314 DefineStmt *n = makeNode(DefineStmt);
2315 n->kind = OBJECT_TYPE;
2320 | CREATE TYPE_P any_name AS '(' TableFuncElementList ')'
2322 CompositeTypeStmt *n = makeNode(CompositeTypeStmt);
2323 RangeVar *r = makeNode(RangeVar);
2325 /* can't use qualified_name, sigh */
2329 r->catalogname = NULL;
2330 r->schemaname = NULL;
2331 r->relname = strVal(lfirst($3));
2334 r->catalogname = NULL;
2335 r->schemaname = strVal(lfirst($3));
2336 r->relname = strVal(lsecond($3));
2339 r->catalogname = strVal(lfirst($3));
2340 r->schemaname = strVal(lsecond($3));
2341 r->relname = strVal(lthird($3));
2345 (errcode(ERRCODE_SYNTAX_ERROR),
2346 errmsg("improper qualified name (too many dotted names): %s",
2347 NameListToString($3))));
2356 definition: '(' def_list ')' { $$ = $2; }
2359 def_list: def_elem { $$ = makeList1($1); }
2360 | def_list ',' def_elem { $$ = lappend($1, $3); }
2363 def_elem: ColLabel '=' def_arg
2365 $$ = makeDefElem($1, (Node *)$3);
2369 $$ = makeDefElem($1, (Node *)NULL);
2373 /* Note: any simple identifier will be returned as a type name! */
2374 def_arg: func_return { $$ = (Node *)$1; }
2375 | qual_all_Op { $$ = (Node *)$1; }
2376 | NumericOnly { $$ = (Node *)$1; }
2377 | Sconst { $$ = (Node *)makeString($1); }
2381 /*****************************************************************************
2384 * CREATE OPERATOR CLASS ...
2385 * DROP OPERATOR CLASS ...
2387 *****************************************************************************/
2390 CREATE OPERATOR CLASS any_name opt_default FOR TYPE_P Typename
2391 USING access_method AS opclass_item_list
2393 CreateOpClassStmt *n = makeNode(CreateOpClassStmt);
2394 n->opclassname = $4;
2404 opclass_item { $$ = makeList1($1); }
2405 | opclass_item_list ',' opclass_item { $$ = lappend($1, $3); }
2409 OPERATOR Iconst any_operator opt_recheck
2411 CreateOpClassItem *n = makeNode(CreateOpClassItem);
2412 n->itemtype = OPCLASS_ITEM_OPERATOR;
2419 | OPERATOR Iconst any_operator '(' oper_argtypes ')' opt_recheck
2421 CreateOpClassItem *n = makeNode(CreateOpClassItem);
2422 n->itemtype = OPCLASS_ITEM_OPERATOR;
2429 | FUNCTION Iconst func_name func_args
2431 CreateOpClassItem *n = makeNode(CreateOpClassItem);
2432 n->itemtype = OPCLASS_ITEM_FUNCTION;
2440 CreateOpClassItem *n = makeNode(CreateOpClassItem);
2441 n->itemtype = OPCLASS_ITEM_STORAGETYPE;
2447 opt_default: DEFAULT { $$ = TRUE; }
2448 | /*EMPTY*/ { $$ = FALSE; }
2451 opt_recheck: RECHECK { $$ = TRUE; }
2452 | /*EMPTY*/ { $$ = FALSE; }
2457 DROP OPERATOR CLASS any_name USING access_method opt_drop_behavior
2459 RemoveOpClassStmt *n = makeNode(RemoveOpClassStmt);
2460 n->opclassname = $4;
2468 /*****************************************************************************
2472 * DROP itemtype itemname [, itemname ...] [ RESTRICT | CASCADE ]
2474 *****************************************************************************/
2476 DropStmt: DROP drop_type any_name_list opt_drop_behavior
2478 DropStmt *n = makeNode(DropStmt);
2486 drop_type: TABLE { $$ = OBJECT_TABLE; }
2487 | SEQUENCE { $$ = OBJECT_SEQUENCE; }
2488 | VIEW { $$ = OBJECT_VIEW; }
2489 | INDEX { $$ = OBJECT_INDEX; }
2490 | TYPE_P { $$ = OBJECT_TYPE; }
2491 | DOMAIN_P { $$ = OBJECT_DOMAIN; }
2492 | CONVERSION_P { $$ = OBJECT_CONVERSION; }
2493 | SCHEMA { $$ = OBJECT_SCHEMA; }
2497 any_name { $$ = makeList1($1); }
2498 | any_name_list ',' any_name { $$ = lappend($1, $3); }
2501 any_name: ColId { $$ = makeList1(makeString($1)); }
2502 | dotted_name { $$ = $1; }
2505 /*****************************************************************************
2508 * truncate table relname
2510 *****************************************************************************/
2513 TRUNCATE opt_table qualified_name
2515 TruncateStmt *n = makeNode(TruncateStmt);
2521 /*****************************************************************************
2523 * The COMMENT ON statement can take different forms based upon the type of
2524 * the object associated with the comment. The form of the statement is:
2526 * COMMENT ON [ [ DATABASE | DOMAIN | INDEX | SEQUENCE | TABLE | TYPE | VIEW ]
2527 * <objname> | AGGREGATE <aggname> (<aggtype>) | FUNCTION
2528 * <funcname> (arg1, arg2, ...) | OPERATOR <op>
2529 * (leftoperand_typ rightoperand_typ) | TRIGGER <triggername> ON
2530 * <relname> | RULE <rulename> ON <relname> ] IS 'text'
2532 *****************************************************************************/
2535 COMMENT ON comment_type any_name IS comment_text
2537 CommentStmt *n = makeNode(CommentStmt);
2544 | COMMENT ON AGGREGATE func_name '(' aggr_argtype ')'
2547 CommentStmt *n = makeNode(CommentStmt);
2548 n->objtype = OBJECT_AGGREGATE;
2550 n->objargs = makeList1($6);
2554 | COMMENT ON FUNCTION func_name func_args IS comment_text
2556 CommentStmt *n = makeNode(CommentStmt);
2557 n->objtype = OBJECT_FUNCTION;
2563 | COMMENT ON OPERATOR any_operator '(' oper_argtypes ')'
2566 CommentStmt *n = makeNode(CommentStmt);
2567 n->objtype = OBJECT_OPERATOR;
2573 | COMMENT ON CONSTRAINT name ON any_name IS comment_text
2575 CommentStmt *n = makeNode(CommentStmt);
2576 n->objtype = OBJECT_CONSTRAINT;
2577 n->objname = lappend($6, makeString($4));
2582 | COMMENT ON RULE name ON any_name IS comment_text
2584 CommentStmt *n = makeNode(CommentStmt);
2585 n->objtype = OBJECT_RULE;
2586 n->objname = lappend($6, makeString($4));
2591 | COMMENT ON RULE name IS comment_text
2593 /* Obsolete syntax supported for awhile for compatibility */
2594 CommentStmt *n = makeNode(CommentStmt);
2595 n->objtype = OBJECT_RULE;
2596 n->objname = makeList1(makeString($4));
2601 | COMMENT ON TRIGGER name ON any_name IS comment_text
2603 CommentStmt *n = makeNode(CommentStmt);
2604 n->objtype = OBJECT_TRIGGER;
2605 n->objname = lappend($6, makeString($4));
2613 COLUMN { $$ = OBJECT_COLUMN; }
2614 | DATABASE { $$ = OBJECT_DATABASE; }
2615 | SCHEMA { $$ = OBJECT_SCHEMA; }
2616 | INDEX { $$ = OBJECT_INDEX; }
2617 | SEQUENCE { $$ = OBJECT_SEQUENCE; }
2618 | TABLE { $$ = OBJECT_TABLE; }
2619 | DOMAIN_P { $$ = OBJECT_TYPE; }
2620 | TYPE_P { $$ = OBJECT_TYPE; }
2621 | VIEW { $$ = OBJECT_VIEW; }
2626 | NULL_P { $$ = NULL; }
2629 /*****************************************************************************
2634 *****************************************************************************/
2636 FetchStmt: FETCH fetch_direction from_in name
2638 FetchStmt *n = (FetchStmt *) $2;
2645 FetchStmt *n = makeNode(FetchStmt);
2646 n->direction = FETCH_FORWARD;
2652 | MOVE fetch_direction from_in name
2654 FetchStmt *n = (FetchStmt *) $2;
2661 FetchStmt *n = makeNode(FetchStmt);
2662 n->direction = FETCH_FORWARD;
2673 FetchStmt *n = makeNode(FetchStmt);
2674 n->direction = FETCH_FORWARD;
2680 FetchStmt *n = makeNode(FetchStmt);
2681 n->direction = FETCH_FORWARD;
2687 FetchStmt *n = makeNode(FetchStmt);
2688 n->direction = FETCH_BACKWARD;
2694 FetchStmt *n = makeNode(FetchStmt);
2695 n->direction = FETCH_ABSOLUTE;
2701 FetchStmt *n = makeNode(FetchStmt);
2702 n->direction = FETCH_ABSOLUTE;
2706 | ABSOLUTE_P fetch_count
2708 FetchStmt *n = makeNode(FetchStmt);
2709 n->direction = FETCH_ABSOLUTE;
2713 | RELATIVE_P fetch_count
2715 FetchStmt *n = makeNode(FetchStmt);
2716 n->direction = FETCH_RELATIVE;
2722 FetchStmt *n = makeNode(FetchStmt);
2723 n->direction = FETCH_FORWARD;
2729 FetchStmt *n = makeNode(FetchStmt);
2730 n->direction = FETCH_FORWARD;
2731 n->howMany = FETCH_ALL;
2736 FetchStmt *n = makeNode(FetchStmt);
2737 n->direction = FETCH_FORWARD;
2741 | FORWARD fetch_count
2743 FetchStmt *n = makeNode(FetchStmt);
2744 n->direction = FETCH_FORWARD;
2750 FetchStmt *n = makeNode(FetchStmt);
2751 n->direction = FETCH_FORWARD;
2752 n->howMany = FETCH_ALL;
2757 FetchStmt *n = makeNode(FetchStmt);
2758 n->direction = FETCH_BACKWARD;
2762 | BACKWARD fetch_count
2764 FetchStmt *n = makeNode(FetchStmt);
2765 n->direction = FETCH_BACKWARD;
2771 FetchStmt *n = makeNode(FetchStmt);
2772 n->direction = FETCH_BACKWARD;
2773 n->howMany = FETCH_ALL;
2780 | '-' Iconst { $$ = - $2; }
2788 /*****************************************************************************
2790 * GRANT and REVOKE statements
2792 *****************************************************************************/
2794 GrantStmt: GRANT privileges ON privilege_target TO grantee_list
2795 opt_grant_grant_option
2797 GrantStmt *n = makeNode(GrantStmt);
2800 n->objtype = ($4)->objtype;
2801 n->objects = ($4)->objs;
2803 n->grant_option = $7;
2808 RevokeStmt: REVOKE opt_revoke_grant_option privileges ON privilege_target
2809 FROM grantee_list opt_drop_behavior
2811 GrantStmt *n = makeNode(GrantStmt);
2812 n->is_grant = false;
2814 n->objtype = ($5)->objtype;
2815 n->objects = ($5)->objs;
2817 n->grant_option = $2;
2825 /* either ALL [PRIVILEGES] or a list of individual privileges */
2826 privileges: privilege_list { $$ = $1; }
2827 | ALL { $$ = makeListi1(ACL_ALL_RIGHTS); }
2828 | ALL PRIVILEGES { $$ = makeListi1(ACL_ALL_RIGHTS); }
2832 privilege { $$ = makeListi1($1); }
2833 | privilege_list ',' privilege { $$ = lappendi($1, $3); }
2836 /* Not all of these privilege types apply to all objects, but that
2837 * gets sorted out later.
2839 privilege: SELECT { $$ = ACL_SELECT; }
2840 | INSERT { $$ = ACL_INSERT; }
2841 | UPDATE { $$ = ACL_UPDATE; }
2842 | DELETE_P { $$ = ACL_DELETE; }
2843 | RULE { $$ = ACL_RULE; }
2844 | REFERENCES { $$ = ACL_REFERENCES; }
2845 | TRIGGER { $$ = ACL_TRIGGER; }
2846 | EXECUTE { $$ = ACL_EXECUTE; }
2847 | USAGE { $$ = ACL_USAGE; }
2848 | CREATE { $$ = ACL_CREATE; }
2849 | TEMPORARY { $$ = ACL_CREATE_TEMP; }
2850 | TEMP { $$ = ACL_CREATE_TEMP; }
2854 /* Don't bother trying to fold the first two rules into one using
2855 opt_table. You're going to get conflicts. */
2859 PrivTarget *n = makeNode(PrivTarget);
2860 n->objtype = ACL_OBJECT_RELATION;
2864 | TABLE qualified_name_list
2866 PrivTarget *n = makeNode(PrivTarget);
2867 n->objtype = ACL_OBJECT_RELATION;
2871 | FUNCTION function_with_argtypes_list
2873 PrivTarget *n = makeNode(PrivTarget);
2874 n->objtype = ACL_OBJECT_FUNCTION;
2878 | DATABASE name_list
2880 PrivTarget *n = makeNode(PrivTarget);
2881 n->objtype = ACL_OBJECT_DATABASE;
2885 | LANGUAGE name_list
2887 PrivTarget *n = makeNode(PrivTarget);
2888 n->objtype = ACL_OBJECT_LANGUAGE;
2894 PrivTarget *n = makeNode(PrivTarget);
2895 n->objtype = ACL_OBJECT_NAMESPACE;
2903 grantee { $$ = makeList1($1); }
2904 | grantee_list ',' grantee { $$ = lappend($1, $3); }
2909 PrivGrantee *n = makeNode(PrivGrantee);
2910 /* This hack lets us avoid reserving PUBLIC as a keyword*/
2911 if (strcmp($1, "public") == 0)
2915 n->groupname = NULL;
2920 PrivGrantee *n = makeNode(PrivGrantee);
2921 /* Treat GROUP PUBLIC as a synonym for PUBLIC */
2922 if (strcmp($2, "public") == 0)
2923 n->groupname = NULL;
2932 opt_grant_grant_option:
2933 WITH GRANT OPTION { $$ = TRUE; }
2934 | /*EMPTY*/ { $$ = FALSE; }
2937 opt_revoke_grant_option:
2938 GRANT OPTION FOR { $$ = TRUE; }
2939 | /*EMPTY*/ { $$ = FALSE; }
2943 function_with_argtypes_list:
2944 function_with_argtypes { $$ = makeList1($1); }
2945 | function_with_argtypes_list ',' function_with_argtypes
2946 { $$ = lappend($1, $3); }
2949 function_with_argtypes:
2952 FuncWithArgs *n = makeNode(FuncWithArgs);
2960 /*****************************************************************************
2963 * create index <indexname> on <relname>
2964 * [ using <access> ] "(" ( <col> [ using <opclass> ] )+ ")"
2965 * [ where <predicate> ]
2967 *****************************************************************************/
2969 IndexStmt: CREATE index_opt_unique INDEX index_name ON qualified_name
2970 access_method_clause '(' index_params ')' where_clause
2972 IndexStmt *n = makeNode(IndexStmt);
2976 n->accessMethod = $7;
2977 n->indexParams = $9;
2978 n->whereClause = $11;
2984 UNIQUE { $$ = TRUE; }
2985 | /*EMPTY*/ { $$ = FALSE; }
2988 access_method_clause:
2989 USING access_method { $$ = $2; }
2990 | /*EMPTY*/ { $$ = DEFAULT_INDEX_TYPE; }
2993 index_params: index_elem { $$ = makeList1($1); }
2994 | index_params ',' index_elem { $$ = lappend($1, $3); }
2998 * Index attributes can be either simple column references, or arbitrary
2999 * expressions in parens. For backwards-compatibility reasons, we allow
3000 * an expression that's just a function call to be written without parens.
3002 index_elem: attr_name opt_class
3004 $$ = makeNode(IndexElem);
3009 | func_name '(' expr_list ')' opt_class
3011 FuncCall *n = makeNode(FuncCall);
3014 n->agg_star = FALSE;
3015 n->agg_distinct = FALSE;
3017 $$ = makeNode(IndexElem);
3019 $$->expr = (Node *)n;
3022 | '(' a_expr ')' opt_class
3024 $$ = makeNode(IndexElem);
3031 opt_class: any_name { $$ = $1; }
3032 | USING any_name { $$ = $2; }
3033 | /*EMPTY*/ { $$ = NIL; }
3036 /*****************************************************************************
3039 * create [or replace] function <fname>
3040 * [(<type-1> { , <type-n>})]
3042 * as <filename or code in language as appropriate>
3043 * language <lang> [with parameters]
3045 *****************************************************************************/
3048 CREATE opt_or_replace FUNCTION func_name func_args
3049 RETURNS func_return createfunc_opt_list opt_definition
3051 CreateFunctionStmt *n = makeNode(CreateFunctionStmt);
3063 OR REPLACE { $$ = TRUE; }
3064 | /*EMPTY*/ { $$ = FALSE; }
3067 func_args: '(' func_args_list ')' { $$ = $2; }
3068 | '(' ')' { $$ = NIL; }
3072 func_arg { $$ = makeList1($1); }
3073 | func_args_list ',' func_arg { $$ = lappend($1, $3); }
3076 func_arg: opt_arg func_type
3078 /* We can catch over-specified arguments here if we want to,
3079 * but for now better to silently swallow typmod, etc.
3080 * - thomas 2000-03-22
3084 | func_type { $$ = $1; }
3087 opt_arg: IN_P { $$ = FALSE; }
3091 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3092 errmsg("CREATE FUNCTION / OUT parameters are not implemented")));
3098 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3099 errmsg("CREATE FUNCTION / INOUT parameters are not implemented")));
3107 /* We can catch over-specified arguments here if we want to,
3108 * but for now better to silently swallow typmod, etc.
3109 * - thomas 2000-03-22
3116 * We would like to make the second production here be ColId attrs etc,
3117 * but that causes reduce/reduce conflicts. type_name is next best choice.
3119 func_type: Typename { $$ = $1; }
3120 | type_name attrs '%' TYPE_P
3122 $$ = makeNode(TypeName);
3123 $$->names = lcons(makeString($1), $2);
3124 $$->pct_type = true;
3130 createfunc_opt_list:
3131 /* Must be at least one to prevent conflict */
3132 createfunc_opt_item { $$ = makeList1($1); }
3133 | createfunc_opt_list createfunc_opt_item { $$ = lappend($1, $2); }
3136 createfunc_opt_item:
3139 $$ = makeDefElem("as", (Node *)$2);
3141 | LANGUAGE ColId_or_Sconst
3143 $$ = makeDefElem("language", (Node *)makeString($2));
3147 $$ = makeDefElem("volatility", (Node *)makeString("immutable"));
3151 $$ = makeDefElem("volatility", (Node *)makeString("stable"));
3155 $$ = makeDefElem("volatility", (Node *)makeString("volatile"));
3157 | CALLED ON NULL_P INPUT_P
3159 $$ = makeDefElem("strict", (Node *)makeInteger(FALSE));
3161 | RETURNS NULL_P ON NULL_P INPUT_P
3163 $$ = makeDefElem("strict", (Node *)makeInteger(TRUE));
3167 $$ = makeDefElem("strict", (Node *)makeInteger(TRUE));
3169 | EXTERNAL SECURITY DEFINER
3171 $$ = makeDefElem("security", (Node *)makeInteger(TRUE));
3173 | EXTERNAL SECURITY INVOKER
3175 $$ = makeDefElem("security", (Node *)makeInteger(FALSE));
3179 $$ = makeDefElem("security", (Node *)makeInteger(TRUE));
3183 $$ = makeDefElem("security", (Node *)makeInteger(FALSE));
3187 func_as: Sconst { $$ = makeList1(makeString($1)); }
3190 $$ = makeList2(makeString($1), makeString($3));
3195 WITH definition { $$ = $2; }
3196 | /*EMPTY*/ { $$ = NIL; }
3200 /*****************************************************************************
3204 * DROP FUNCTION funcname (arg1, arg2, ...) [ RESTRICT | CASCADE ]
3205 * DROP AGGREGATE aggname (aggtype) [ RESTRICT | CASCADE ]
3206 * DROP OPERATOR opname (leftoperand_typ, rightoperand_typ) [ RESTRICT | CASCADE ]
3208 *****************************************************************************/
3211 DROP FUNCTION func_name func_args opt_drop_behavior
3213 RemoveFuncStmt *n = makeNode(RemoveFuncStmt);
3222 DROP AGGREGATE func_name '(' aggr_argtype ')' opt_drop_behavior
3224 RemoveAggrStmt *n = makeNode(RemoveAggrStmt);
3233 Typename { $$ = $1; }
3234 | '*' { $$ = NULL; }
3238 DROP OPERATOR any_operator '(' oper_argtypes ')' opt_drop_behavior
3240 RemoveOperStmt *n = makeNode(RemoveOperStmt);
3252 (errcode(ERRCODE_SYNTAX_ERROR),
3253 errmsg("argument type missing (use NONE for unary operators)")));
3255 | Typename ',' Typename
3256 { $$ = makeList2($1, $3); }
3257 | NONE ',' Typename /* left unary */
3258 { $$ = makeList2(NULL, $3); }
3259 | Typename ',' NONE /* right unary */
3260 { $$ = makeList2($1, NULL); }
3265 { $$ = makeList1(makeString($1)); }
3266 | ColId '.' any_operator
3267 { $$ = lcons(makeString($1), $3); }
3271 /*****************************************************************************
3273 * CREATE CAST / DROP CAST
3275 *****************************************************************************/
3277 CreateCastStmt: CREATE CAST '(' Typename AS Typename ')'
3278 WITH FUNCTION function_with_argtypes cast_context
3280 CreateCastStmt *n = makeNode(CreateCastStmt);
3283 n->func = (FuncWithArgs *) $10;
3284 n->context = (CoercionContext) $11;
3287 | CREATE CAST '(' Typename AS Typename ')'
3288 WITHOUT FUNCTION cast_context
3290 CreateCastStmt *n = makeNode(CreateCastStmt);
3294 n->context = (CoercionContext) $10;
3299 cast_context: AS IMPLICIT_P { $$ = COERCION_IMPLICIT; }
3300 | AS ASSIGNMENT { $$ = COERCION_ASSIGNMENT; }
3301 | /*EMPTY*/ { $$ = COERCION_EXPLICIT; }
3305 DropCastStmt: DROP CAST '(' Typename AS Typename ')' opt_drop_behavior
3307 DropCastStmt *n = makeNode(DropCastStmt);
3317 /*****************************************************************************
3321 * REINDEX type <typename> [FORCE] [ALL]
3323 *****************************************************************************/
3326 REINDEX reindex_type qualified_name opt_force
3328 ReindexStmt *n = makeNode(ReindexStmt);
3335 | REINDEX DATABASE name opt_force
3337 ReindexStmt *n = makeNode(ReindexStmt);
3338 n->kind = OBJECT_DATABASE;
3347 INDEX { $$ = OBJECT_INDEX; }
3348 | TABLE { $$ = OBJECT_TABLE; }
3351 opt_force: FORCE { $$ = TRUE; }
3352 | /* EMPTY */ { $$ = FALSE; }
3356 /*****************************************************************************
3358 * ALTER THING name RENAME TO newname
3360 *****************************************************************************/
3362 RenameStmt: ALTER AGGREGATE func_name '(' aggr_argtype ')' RENAME TO name
3364 RenameStmt *n = makeNode(RenameStmt);
3365 n->renameType = OBJECT_AGGREGATE;
3367 n->objarg = makeList1($5);
3371 | ALTER CONVERSION_P any_name RENAME TO name
3373 RenameStmt *n = makeNode(RenameStmt);
3374 n->renameType = OBJECT_CONVERSION;
3379 | ALTER DATABASE database_name RENAME TO database_name
3381 RenameStmt *n = makeNode(RenameStmt);
3382 n->renameType = OBJECT_DATABASE;
3387 | ALTER FUNCTION func_name func_args RENAME TO name
3389 RenameStmt *n = makeNode(RenameStmt);
3390 n->renameType = OBJECT_FUNCTION;
3396 | ALTER GROUP_P UserId RENAME TO UserId
3398 RenameStmt *n = makeNode(RenameStmt);
3399 n->renameType = OBJECT_GROUP;
3404 | ALTER LANGUAGE name RENAME TO name
3406 RenameStmt *n = makeNode(RenameStmt);
3407 n->renameType = OBJECT_LANGUAGE;
3412 | ALTER OPERATOR CLASS any_name USING access_method RENAME TO name
3414 RenameStmt *n = makeNode(RenameStmt);
3415 n->renameType = OBJECT_OPCLASS;
3421 | ALTER SCHEMA name RENAME TO name
3423 RenameStmt *n = makeNode(RenameStmt);
3424 n->renameType = OBJECT_SCHEMA;
3429 | ALTER TABLE relation_expr RENAME opt_column opt_name TO name
3431 RenameStmt *n = makeNode(RenameStmt);
3436 n->renameType = OBJECT_TABLE;
3438 n->renameType = OBJECT_COLUMN;
3441 | ALTER TRIGGER name ON relation_expr RENAME TO name
3443 RenameStmt *n = makeNode(RenameStmt);
3447 n->renameType = OBJECT_TRIGGER;
3450 | ALTER USER UserId RENAME TO UserId
3452 RenameStmt *n = makeNode(RenameStmt);
3453 n->renameType = OBJECT_USER;
3460 opt_name: name { $$ = $1; }
3461 | /*EMPTY*/ { $$ = NULL; }
3464 opt_column: COLUMN { $$ = COLUMN; }
3465 | /*EMPTY*/ { $$ = 0; }
3469 /*****************************************************************************
3471 * QUERY: Define Rewrite Rule
3473 *****************************************************************************/
3475 RuleStmt: CREATE opt_or_replace RULE name AS
3476 { QueryIsRule=TRUE; }
3477 ON event TO qualified_name where_clause
3478 DO opt_instead RuleActionList
3480 RuleStmt *n = makeNode(RuleStmt);
3484 n->whereClause = $11;
3494 NOTHING { $$ = NIL; }
3495 | RuleActionStmt { $$ = makeList1($1); }
3496 | '(' RuleActionMulti ')' { $$ = $2; }
3499 /* the thrashing around here is to discard "empty" statements... */
3501 RuleActionMulti ';' RuleActionStmtOrEmpty
3502 { if ($3 != (Node *) NULL)
3503 $$ = lappend($1, $3);
3507 | RuleActionStmtOrEmpty
3508 { if ($1 != (Node *) NULL)
3523 RuleActionStmtOrEmpty:
3524 RuleActionStmt { $$ = $1; }
3525 | /*EMPTY*/ { $$ = (Node *)NULL; }
3528 /* change me to select, update, etc. some day */
3529 event: SELECT { $$ = CMD_SELECT; }
3530 | UPDATE { $$ = CMD_UPDATE; }
3531 | DELETE_P { $$ = CMD_DELETE; }
3532 | INSERT { $$ = CMD_INSERT; }
3536 INSTEAD { $$ = TRUE; }
3537 | /*EMPTY*/ { $$ = FALSE; }
3542 DROP RULE name ON qualified_name opt_drop_behavior
3544 DropPropertyStmt *n = makeNode(DropPropertyStmt);
3548 n->removeType = OBJECT_RULE;
3554 /*****************************************************************************
3557 * NOTIFY <qualified_name> can appear both in rule bodies and
3558 * as a query-level command
3560 *****************************************************************************/
3562 NotifyStmt: NOTIFY qualified_name
3564 NotifyStmt *n = makeNode(NotifyStmt);
3570 ListenStmt: LISTEN qualified_name
3572 ListenStmt *n = makeNode(ListenStmt);
3579 UNLISTEN qualified_name
3581 UnlistenStmt *n = makeNode(UnlistenStmt);
3587 UnlistenStmt *n = makeNode(UnlistenStmt);
3588 n->relation = makeNode(RangeVar);
3589 n->relation->relname = "*";
3590 n->relation->schemaname = NULL;
3596 /*****************************************************************************
3600 * BEGIN / COMMIT / ROLLBACK
3601 * (also older versions END / ABORT)
3603 *****************************************************************************/
3606 ABORT_P opt_transaction
3608 TransactionStmt *n = makeNode(TransactionStmt);
3609 n->kind = TRANS_STMT_ROLLBACK;
3613 | BEGIN_P opt_transaction
3615 TransactionStmt *n = makeNode(TransactionStmt);
3616 n->kind = TRANS_STMT_BEGIN;
3620 | START TRANSACTION transaction_mode_list_or_empty
3622 TransactionStmt *n = makeNode(TransactionStmt);
3623 n->kind = TRANS_STMT_START;
3627 | COMMIT opt_transaction
3629 TransactionStmt *n = makeNode(TransactionStmt);
3630 n->kind = TRANS_STMT_COMMIT;
3634 | END_P opt_transaction
3636 TransactionStmt *n = makeNode(TransactionStmt);
3637 n->kind = TRANS_STMT_COMMIT;
3641 | ROLLBACK opt_transaction
3643 TransactionStmt *n = makeNode(TransactionStmt);
3644 n->kind = TRANS_STMT_ROLLBACK;
3650 opt_transaction: WORK {}
3655 transaction_mode_list:
3656 ISOLATION LEVEL iso_level
3657 { $$ = makeList1(makeDefElem("transaction_isolation",
3658 makeStringConst($3, NULL))); }
3659 | transaction_access_mode
3660 { $$ = makeList1(makeDefElem("transaction_read_only",
3661 makeIntConst($1))); }
3662 | ISOLATION LEVEL iso_level transaction_access_mode
3664 $$ = makeList2(makeDefElem("transaction_isolation",
3665 makeStringConst($3, NULL)),
3666 makeDefElem("transaction_read_only",
3669 | transaction_access_mode ISOLATION LEVEL iso_level
3671 $$ = makeList2(makeDefElem("transaction_read_only",
3673 makeDefElem("transaction_isolation",
3674 makeStringConst($4, NULL)));
3678 transaction_mode_list_or_empty:
3679 transaction_mode_list
3684 transaction_access_mode:
3685 READ ONLY { $$ = TRUE; }
3686 | READ WRITE { $$ = FALSE; }
3690 /*****************************************************************************
3693 * create view <viewname> '('target-list ')' AS <query>
3695 *****************************************************************************/
3697 ViewStmt: CREATE opt_or_replace VIEW qualified_name opt_column_list
3700 ViewStmt *n = makeNode(ViewStmt);
3704 n->query = (Query *) $7;
3710 /*****************************************************************************
3715 *****************************************************************************/
3717 LoadStmt: LOAD file_name
3719 LoadStmt *n = makeNode(LoadStmt);
3726 /*****************************************************************************
3730 *****************************************************************************/
3733 CREATE DATABASE database_name opt_with createdb_opt_list
3735 CreatedbStmt *n = makeNode(CreatedbStmt);
3743 createdb_opt_list createdb_opt_item { $$ = lappend($1, $2); }
3744 | /* EMPTY */ { $$ = NIL; }
3748 LOCATION opt_equal Sconst
3750 $$ = makeDefElem("location", (Node *)makeString($3));
3752 | LOCATION opt_equal DEFAULT
3754 $$ = makeDefElem("location", NULL);
3756 | TEMPLATE opt_equal name
3758 $$ = makeDefElem("template", (Node *)makeString($3));
3760 | TEMPLATE opt_equal DEFAULT
3762 $$ = makeDefElem("template", NULL);
3764 | ENCODING opt_equal Sconst
3766 $$ = makeDefElem("encoding", (Node *)makeString($3));
3768 | ENCODING opt_equal Iconst
3770 $$ = makeDefElem("encoding", (Node *)makeInteger($3));
3772 | ENCODING opt_equal DEFAULT
3774 $$ = makeDefElem("encoding", NULL);
3776 | OWNER opt_equal name
3778 $$ = makeDefElem("owner", (Node *)makeString($3));
3780 | OWNER opt_equal DEFAULT
3782 $$ = makeDefElem("owner", NULL);
3787 * Though the equals sign doesn't match other WITH options, pg_dump uses
3788 * equals for backward compability, and it doesn't seem worth removing it.
3796 /*****************************************************************************
3800 *****************************************************************************/
3802 AlterDatabaseSetStmt:
3803 ALTER DATABASE database_name SET set_rest
3805 AlterDatabaseSetStmt *n = makeNode(AlterDatabaseSetStmt);
3807 n->variable = $5->name;
3808 n->value = $5->args;
3811 | ALTER DATABASE database_name VariableResetStmt
3813 AlterDatabaseSetStmt *n = makeNode(AlterDatabaseSetStmt);
3815 n->variable = ((VariableResetStmt *)$4)->name;
3822 /*****************************************************************************
3826 * This is implicitly CASCADE, no need for drop behavior
3827 *****************************************************************************/
3829 DropdbStmt: DROP DATABASE database_name
3831 DropdbStmt *n = makeNode(DropdbStmt);
3838 /*****************************************************************************
3840 * Manipulate a domain
3842 *****************************************************************************/
3845 CREATE DOMAIN_P any_name opt_as Typename ColQualList opt_collate
3847 CreateDomainStmt *n = makeNode(CreateDomainStmt);
3850 n->constraints = $6;
3854 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3855 errmsg("CREATE DOMAIN / COLLATE is not yet implemented; clause ignored")));
3861 /* ALTER DOMAIN <domain> {SET DEFAULT <expr>|DROP DEFAULT} */
3862 ALTER DOMAIN_P any_name alter_column_default
3864 AlterDomainStmt *n = makeNode(AlterDomainStmt);
3870 /* ALTER DOMAIN <domain> DROP NOT NULL */
3871 | ALTER DOMAIN_P any_name DROP NOT NULL_P
3873 AlterDomainStmt *n = makeNode(AlterDomainStmt);
3878 /* ALTER DOMAIN <domain> SET NOT NULL */
3879 | ALTER DOMAIN_P any_name SET NOT NULL_P
3881 AlterDomainStmt *n = makeNode(AlterDomainStmt);
3886 /* ALTER DOMAIN <domain> ADD CONSTRAINT ... */
3887 | ALTER DOMAIN_P any_name ADD TableConstraint
3889 AlterDomainStmt *n = makeNode(AlterDomainStmt);
3895 /* ALTER DOMAIN <domain> DROP CONSTRAINT <name> [RESTRICT|CASCADE] */
3896 | ALTER DOMAIN_P any_name DROP CONSTRAINT name opt_drop_behavior
3898 AlterDomainStmt *n = makeNode(AlterDomainStmt);
3905 /* ALTER DOMAIN <domain> OWNER TO UserId */
3906 | ALTER DOMAIN_P any_name OWNER TO UserId
3908 AlterDomainStmt *n = makeNode(AlterDomainStmt);
3921 /*****************************************************************************
3923 * Manipulate a conversion
3925 * CREATE [DEFAULT] CONVERSION <conversion_name>
3926 * FOR <encoding_name> TO <encoding_name> FROM <func_name>
3928 *****************************************************************************/
3930 CreateConversionStmt:
3931 CREATE opt_default CONVERSION_P any_name FOR Sconst
3932 TO Sconst FROM any_name
3934 CreateConversionStmt *n = makeNode(CreateConversionStmt);
3935 n->conversion_name = $4;
3936 n->for_encoding_name = $6;
3937 n->to_encoding_name = $8;
3944 /*****************************************************************************
3947 * cluster <index_name> on <qualified_name>
3948 * cluster <qualified_name>
3951 *****************************************************************************/
3954 CLUSTER index_name ON qualified_name
3956 ClusterStmt *n = makeNode(ClusterStmt);
3961 | CLUSTER qualified_name
3963 ClusterStmt *n = makeNode(ClusterStmt);
3965 n->indexname = NULL;
3970 ClusterStmt *n = makeNode(ClusterStmt);
3972 n->indexname = NULL;
3977 /*****************************************************************************
3983 *****************************************************************************/
3985 VacuumStmt: VACUUM opt_full opt_freeze opt_verbose
3987 VacuumStmt *n = makeNode(VacuumStmt);
3997 | VACUUM opt_full opt_freeze opt_verbose qualified_name
3999 VacuumStmt *n = makeNode(VacuumStmt);
4009 | VACUUM opt_full opt_freeze opt_verbose AnalyzeStmt
4011 VacuumStmt *n = (VacuumStmt *) $5;
4021 analyze_keyword opt_verbose
4023 VacuumStmt *n = makeNode(VacuumStmt);
4033 | analyze_keyword opt_verbose qualified_name opt_name_list
4035 VacuumStmt *n = makeNode(VacuumStmt);
4049 | ANALYSE /* British */ {}
4053 VERBOSE { $$ = TRUE; }
4054 | /*EMPTY*/ { $$ = FALSE; }
4057 opt_full: FULL { $$ = TRUE; }
4058 | /*EMPTY*/ { $$ = FALSE; }
4061 opt_freeze: FREEZE { $$ = TRUE; }
4062 | /*EMPTY*/ { $$ = FALSE; }
4066 '(' name_list ')' { $$ = $2; }
4067 | /*EMPTY*/ { $$ = NIL; }
4071 /*****************************************************************************
4074 * EXPLAIN [ANALYZE] [VERBOSE] query
4076 *****************************************************************************/
4078 ExplainStmt: EXPLAIN opt_analyze opt_verbose ExplainableStmt
4080 ExplainStmt *n = makeNode(ExplainStmt);
4083 n->query = (Query*)$4;
4094 | ExecuteStmt /* by default all are $$=$1 */
4098 analyze_keyword { $$ = TRUE; }
4099 | /* EMPTY */ { $$ = FALSE; }
4102 /*****************************************************************************
4105 * PREPARE <plan_name> [(args, ...)] AS <query>
4107 *****************************************************************************/
4109 PrepareStmt: PREPARE name prep_type_clause AS PreparableStmt
4111 PrepareStmt *n = makeNode(PrepareStmt);
4114 n->query = (Query *) $5;
4119 prep_type_clause: '(' prep_type_list ')' { $$ = $2; }
4120 | /* EMPTY */ { $$ = NIL; }
4123 prep_type_list: Typename { $$ = makeList1($1); }
4124 | prep_type_list ',' Typename
4125 { $$ = lappend($1, $3); }
4132 | DeleteStmt /* by default all are $$=$1 */
4135 /*****************************************************************************
4137 * EXECUTE <plan_name> [(params, ...)]
4138 * CREATE TABLE <name> AS EXECUTE <plan_name> [(params, ...)]
4140 *****************************************************************************/
4142 ExecuteStmt: EXECUTE name execute_param_clause
4144 ExecuteStmt *n = makeNode(ExecuteStmt);
4150 | CREATE OptTemp TABLE qualified_name OptCreateAs AS EXECUTE name execute_param_clause
4152 ExecuteStmt *n = makeNode(ExecuteStmt);
4159 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
4160 errmsg("column name list not allowed in CREATE TABLE / AS EXECUTE")));
4161 /* ... because it's not implemented, but it could be */
4166 execute_param_clause: '(' expr_list ')' { $$ = $2; }
4167 | /* EMPTY */ { $$ = NIL; }
4170 /*****************************************************************************
4173 * DEALLOCATE [PREPARE] <plan_name>
4175 *****************************************************************************/
4177 DeallocateStmt: DEALLOCATE name
4179 DeallocateStmt *n = makeNode(DeallocateStmt);
4183 | DEALLOCATE PREPARE name
4185 DeallocateStmt *n = makeNode(DeallocateStmt);
4191 /*****************************************************************************
4196 *****************************************************************************/
4199 INSERT INTO qualified_name insert_rest
4207 VALUES '(' insert_target_list ')'
4209 $$ = makeNode(InsertStmt);
4211 $$->targetList = $3;
4212 $$->selectStmt = NULL;
4216 $$ = makeNode(InsertStmt);
4218 $$->targetList = NIL;
4219 $$->selectStmt = NULL;
4223 $$ = makeNode(InsertStmt);
4225 $$->targetList = NIL;
4226 $$->selectStmt = $1;
4228 | '(' insert_column_list ')' VALUES '(' insert_target_list ')'
4230 $$ = makeNode(InsertStmt);
4232 $$->targetList = $6;
4233 $$->selectStmt = NULL;
4235 | '(' insert_column_list ')' SelectStmt
4237 $$ = makeNode(InsertStmt);
4239 $$->targetList = NIL;
4240 $$->selectStmt = $4;
4245 insert_column_item { $$ = makeList1($1); }
4246 | insert_column_list ',' insert_column_item
4247 { $$ = lappend($1, $3); }
4251 ColId opt_indirection
4253 ResTarget *n = makeNode(ResTarget);
4255 n->indirection = $2;
4262 /*****************************************************************************
4267 *****************************************************************************/
4269 DeleteStmt: DELETE_P FROM relation_expr where_clause
4271 DeleteStmt *n = makeNode(DeleteStmt);
4273 n->whereClause = $4;
4278 LockStmt: LOCK_P opt_table qualified_name_list opt_lock
4280 LockStmt *n = makeNode(LockStmt);
4288 opt_lock: IN_P lock_type MODE { $$ = $2; }
4289 | /*EMPTY*/ { $$ = AccessExclusiveLock; }
4292 lock_type: ACCESS SHARE { $$ = AccessShareLock; }
4293 | ROW SHARE { $$ = RowShareLock; }
4294 | ROW EXCLUSIVE { $$ = RowExclusiveLock; }
4295 | SHARE UPDATE EXCLUSIVE { $$ = ShareUpdateExclusiveLock; }
4296 | SHARE { $$ = ShareLock; }
4297 | SHARE ROW EXCLUSIVE { $$ = ShareRowExclusiveLock; }
4298 | EXCLUSIVE { $$ = ExclusiveLock; }
4299 | ACCESS EXCLUSIVE { $$ = AccessExclusiveLock; }
4303 /*****************************************************************************
4306 * UpdateStmt (UPDATE)
4308 *****************************************************************************/
4310 UpdateStmt: UPDATE relation_expr
4311 SET update_target_list
4315 UpdateStmt *n = makeNode(UpdateStmt);
4319 n->whereClause = $6;
4325 /*****************************************************************************
4330 *****************************************************************************/
4331 DeclareCursorStmt: DECLARE name cursor_options CURSOR opt_hold FOR SelectStmt
4333 DeclareCursorStmt *n = makeNode(DeclareCursorStmt);
4338 n->options |= CURSOR_OPT_HOLD;
4343 cursor_options: /*EMPTY*/ { $$ = 0; }
4344 | cursor_options NO SCROLL { $$ = $1 | CURSOR_OPT_NO_SCROLL; }
4345 | cursor_options SCROLL { $$ = $1 | CURSOR_OPT_SCROLL; }
4346 | cursor_options BINARY { $$ = $1 | CURSOR_OPT_BINARY; }
4347 | cursor_options INSENSITIVE { $$ = $1 | CURSOR_OPT_INSENSITIVE; }
4350 opt_hold: /* EMPTY */ { $$ = FALSE; }
4351 | WITH HOLD { $$ = TRUE; }
4352 | WITHOUT HOLD { $$ = FALSE; }
4355 /*****************************************************************************
4360 *****************************************************************************/
4362 /* A complete SELECT statement looks like this.
4364 * The rule returns either a single SelectStmt node or a tree of them,
4365 * representing a set-operation tree.
4367 * There is an ambiguity when a sub-SELECT is within an a_expr and there
4368 * are excess parentheses: do the parentheses belong to the sub-SELECT or
4369 * to the surrounding a_expr? We don't really care, but yacc wants to know.
4370 * To resolve the ambiguity, we are careful to define the grammar so that
4371 * the decision is staved off as long as possible: as long as we can keep
4372 * absorbing parentheses into the sub-SELECT, we will do so, and only when
4373 * it's no longer possible to do that will we decide that parens belong to
4374 * the expression. For example, in "SELECT (((SELECT 2)) + 3)" the extra
4375 * parentheses are treated as part of the sub-select. The necessity of doing
4376 * it that way is shown by "SELECT (((SELECT 2)) UNION SELECT 2)". Had we
4377 * parsed "((SELECT 2))" as an a_expr, it'd be too late to go back to the
4378 * SELECT viewpoint when we see the UNION.
4380 * This approach is implemented by defining a nonterminal select_with_parens,
4381 * which represents a SELECT with at least one outer layer of parentheses,
4382 * and being careful to use select_with_parens, never '(' SelectStmt ')',
4383 * in the expression grammar. We will then have shift-reduce conflicts
4384 * which we can resolve in favor of always treating '(' <select> ')' as
4385 * a select_with_parens. To resolve the conflicts, the productions that
4386 * conflict with the select_with_parens productions are manually given
4387 * precedences lower than the precedence of ')', thereby ensuring that we
4388 * shift ')' (and then reduce to select_with_parens) rather than trying to
4389 * reduce the inner <select> nonterminal to something else. We use UMINUS
4390 * precedence for this, which is a fairly arbitrary choice.
4392 * To be able to define select_with_parens itself without ambiguity, we need
4393 * a nonterminal select_no_parens that represents a SELECT structure with no
4394 * outermost parentheses. This is a little bit tedious, but it works.
4396 * In non-expression contexts, we use SelectStmt which can represent a SELECT
4397 * with or without outer parentheses.
4400 SelectStmt: select_no_parens %prec UMINUS
4401 | select_with_parens %prec UMINUS
4405 '(' select_no_parens ')' { $$ = $2; }
4406 | '(' select_with_parens ')' { $$ = $2; }
4410 * FOR UPDATE may be before or after LIMIT/OFFSET.
4411 * In <=7.2.X, LIMIT/OFFSET had to be after FOR UPDATE
4412 * We now support both orderings, but prefer LIMIT/OFFSET before FOR UPDATE
4416 simple_select { $$ = $1; }
4417 | select_clause sort_clause
4419 insertSelectOptions((SelectStmt *) $1, $2, NIL,
4423 | select_clause opt_sort_clause for_update_clause opt_select_limit
4425 insertSelectOptions((SelectStmt *) $1, $2, $3,
4426 nth(0, $4), nth(1, $4));
4429 | select_clause opt_sort_clause select_limit opt_for_update_clause
4431 insertSelectOptions((SelectStmt *) $1, $2, $4,
4432 nth(0, $3), nth(1, $3));
4438 simple_select { $$ = $1; }
4439 | select_with_parens { $$ = $1; }
4443 * This rule parses SELECT statements that can appear within set operations,
4444 * including UNION, INTERSECT and EXCEPT. '(' and ')' can be used to specify
4445 * the ordering of the set operations. Without '(' and ')' we want the
4446 * operations to be ordered per the precedence specs at the head of this file.
4448 * As with select_no_parens, simple_select cannot have outer parentheses,
4449 * but can have parenthesized subclauses.
4451 * Note that sort clauses cannot be included at this level --- SQL92 requires
4452 * SELECT foo UNION SELECT bar ORDER BY baz
4454 * (SELECT foo UNION SELECT bar) ORDER BY baz
4456 * SELECT foo UNION (SELECT bar ORDER BY baz)
4457 * Likewise FOR UPDATE and LIMIT. Therefore, those clauses are described
4458 * as part of the select_no_parens production, not simple_select.
4459 * This does not limit functionality, because you can reintroduce sort and
4460 * limit clauses inside parentheses.
4462 * NOTE: only the leftmost component SelectStmt should have INTO.
4463 * However, this is not checked by the grammar; parse analysis must check it.
4466 SELECT opt_distinct target_list
4467 into_clause from_clause where_clause
4468 group_clause having_clause
4470 SelectStmt *n = makeNode(SelectStmt);
4471 n->distinctClause = $2;
4474 n->intoColNames = NIL;
4476 n->whereClause = $6;
4477 n->groupClause = $7;
4478 n->havingClause = $8;
4481 | select_clause UNION opt_all select_clause
4483 $$ = makeSetOp(SETOP_UNION, $3, $1, $4);
4485 | select_clause INTERSECT opt_all select_clause
4487 $$ = makeSetOp(SETOP_INTERSECT, $3, $1, $4);
4489 | select_clause EXCEPT opt_all select_clause
4491 $$ = makeSetOp(SETOP_EXCEPT, $3, $1, $4);
4496 INTO OptTempTableName { $$ = $2; }
4497 | /*EMPTY*/ { $$ = NULL; }
4501 * Redundancy here is needed to avoid shift/reduce conflicts,
4502 * since TEMP is not a reserved word. See also OptTemp.
4505 TEMPORARY opt_table qualified_name
4510 | TEMP opt_table qualified_name
4515 | LOCAL TEMPORARY opt_table qualified_name
4520 | LOCAL TEMP opt_table qualified_name
4525 | GLOBAL TEMPORARY opt_table qualified_name
4530 | GLOBAL TEMP opt_table qualified_name
4535 | TABLE qualified_name
4551 opt_all: ALL { $$ = TRUE; }
4552 | DISTINCT { $$ = FALSE; }
4553 | /*EMPTY*/ { $$ = FALSE; }
4556 /* We use (NIL) as a placeholder to indicate that all target expressions
4557 * should be placed in the DISTINCT list during parsetree analysis.
4560 DISTINCT { $$ = makeList1(NIL); }
4561 | DISTINCT ON '(' expr_list ')' { $$ = $4; }
4563 | /*EMPTY*/ { $$ = NIL; }
4567 sort_clause { $$ = $1;}
4568 | /*EMPTY*/ { $$ = NIL; }
4572 ORDER BY sortby_list { $$ = $3; }
4576 sortby { $$ = makeList1($1); }
4577 | sortby_list ',' sortby { $$ = lappend($1, $3); }
4580 sortby: a_expr USING qual_all_Op
4582 $$ = makeNode(SortBy);
4584 $$->sortby_kind = SORTBY_USING;
4589 $$ = makeNode(SortBy);
4591 $$->sortby_kind = SORTBY_ASC;
4596 $$ = makeNode(SortBy);
4598 $$->sortby_kind = SORTBY_DESC;
4603 $$ = makeNode(SortBy);
4605 $$->sortby_kind = SORTBY_ASC; /* default */
4612 LIMIT select_limit_value OFFSET select_offset_value
4613 { $$ = makeList2($4, $2); }
4614 | OFFSET select_offset_value LIMIT select_limit_value
4615 { $$ = makeList2($2, $4); }
4616 | LIMIT select_limit_value
4617 { $$ = makeList2(NULL, $2); }
4618 | OFFSET select_offset_value
4619 { $$ = makeList2($2, NULL); }
4620 | LIMIT select_limit_value ',' select_offset_value
4622 /* Disabled because it was too confusing, bjm 2002-02-18 */
4624 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
4625 errmsg("LIMIT #,# syntax is not supported"),
4626 errhint("Use separate LIMIT and OFFSET clauses.")));
4631 select_limit { $$ = $1; }
4633 { $$ = makeList2(NULL,NULL); }
4640 /* LIMIT ALL is represented as a NULL constant */
4641 A_Const *n = makeNode(A_Const);
4642 n->val.type = T_Null;
4647 select_offset_value:
4652 * jimmy bell-style recursive queries aren't supported in the
4655 * ...however, recursive addattr and rename supported. make special
4660 GROUP_P BY expr_list { $$ = $3; }
4661 | /*EMPTY*/ { $$ = NIL; }
4665 HAVING a_expr { $$ = $2; }
4666 | /*EMPTY*/ { $$ = NULL; }
4670 FOR UPDATE update_list { $$ = $3; }
4671 | FOR READ ONLY { $$ = NULL; }
4674 opt_for_update_clause:
4675 for_update_clause { $$ = $1; }
4676 | /* EMPTY */ { $$ = NULL; }
4680 OF name_list { $$ = $2; }
4681 | /* EMPTY */ { $$ = makeList1(NULL); }
4684 /*****************************************************************************
4686 * clauses common to all Optimizable Stmts:
4687 * from_clause - allow list of both JOIN expressions and table names
4688 * where_clause - qualifications for joins or restrictions
4690 *****************************************************************************/
4693 FROM from_list { $$ = $2; }
4694 | /*EMPTY*/ { $$ = NIL; }
4698 table_ref { $$ = makeList1($1); }
4699 | from_list ',' table_ref { $$ = lappend($1, $3); }
4703 * table_ref is where an alias clause can be attached. Note we cannot make
4704 * alias_clause have an empty production because that causes parse conflicts
4705 * between table_ref := '(' joined_table ')' alias_clause
4706 * and joined_table := '(' joined_table ')'. So, we must have the
4707 * redundant-looking productions here instead.
4709 table_ref: relation_expr
4713 | relation_expr alias_clause
4720 RangeFunction *n = makeNode(RangeFunction);
4721 n->funccallnode = $1;
4722 n->coldeflist = NIL;
4725 | func_table alias_clause
4727 RangeFunction *n = makeNode(RangeFunction);
4728 n->funccallnode = $1;
4730 n->coldeflist = NIL;
4733 | func_table AS '(' TableFuncElementList ')'
4735 RangeFunction *n = makeNode(RangeFunction);
4736 n->funccallnode = $1;
4740 | func_table AS ColId '(' TableFuncElementList ')'
4742 RangeFunction *n = makeNode(RangeFunction);
4743 Alias *a = makeNode(Alias);
4744 n->funccallnode = $1;
4750 | func_table ColId '(' TableFuncElementList ')'
4752 RangeFunction *n = makeNode(RangeFunction);
4753 Alias *a = makeNode(Alias);
4754 n->funccallnode = $1;
4760 | select_with_parens
4763 * The SQL spec does not permit a subselect
4764 * (<derived_table>) without an alias clause,
4765 * so we don't either. This avoids the problem
4766 * of needing to invent a unique refname for it.
4767 * That could be surmounted if there's sufficient
4768 * popular demand, but for now let's just implement
4769 * the spec and see if anyone complains.
4770 * However, it does seem like a good idea to emit
4771 * an error message that's better than "syntax error".
4774 (errcode(ERRCODE_SYNTAX_ERROR),
4775 errmsg("sub-select in FROM must have an alias"),
4776 errhint("For example, FROM (SELECT ...) [AS] foo.")));
4779 | select_with_parens alias_clause
4781 RangeSubselect *n = makeNode(RangeSubselect);
4790 | '(' joined_table ')' alias_clause
4799 * It may seem silly to separate joined_table from table_ref, but there is
4800 * method in SQL92's madness: if you don't do it this way you get reduce-
4801 * reduce conflicts, because it's not clear to the parser generator whether
4802 * to expect alias_clause after ')' or not. For the same reason we must
4803 * treat 'JOIN' and 'join_type JOIN' separately, rather than allowing
4804 * join_type to expand to empty; if we try it, the parser generator can't
4805 * figure out when to reduce an empty join_type right after table_ref.
4807 * Note that a CROSS JOIN is the same as an unqualified
4808 * INNER JOIN, and an INNER JOIN/ON has the same shape
4809 * but a qualification expression to limit membership.
4810 * A NATURAL JOIN implicitly matches column names between
4811 * tables and the shape is determined by which columns are
4812 * in common. We'll collect columns during the later transformations.
4816 '(' joined_table ')'
4820 | table_ref CROSS JOIN table_ref
4822 /* CROSS JOIN is same as unqualified inner join */
4823 JoinExpr *n = makeNode(JoinExpr);
4824 n->jointype = JOIN_INNER;
4825 n->isNatural = FALSE;
4832 | table_ref UNIONJOIN table_ref
4834 /* UNION JOIN is made into 1 token to avoid shift/reduce
4835 * conflict against regular UNION keyword.
4837 JoinExpr *n = makeNode(JoinExpr);
4838 n->jointype = JOIN_UNION;
4839 n->isNatural = FALSE;
4846 | table_ref join_type JOIN table_ref join_qual
4848 JoinExpr *n = makeNode(JoinExpr);
4850 n->isNatural = FALSE;
4853 if ($5 != NULL && IsA($5, List))
4854 n->using = (List *) $5; /* USING clause */
4856 n->quals = $5; /* ON clause */
4859 | table_ref JOIN table_ref join_qual
4861 /* letting join_type reduce to empty doesn't work */
4862 JoinExpr *n = makeNode(JoinExpr);
4863 n->jointype = JOIN_INNER;
4864 n->isNatural = FALSE;
4867 if ($4 != NULL && IsA($4, List))
4868 n->using = (List *) $4; /* USING clause */
4870 n->quals = $4; /* ON clause */
4873 | table_ref NATURAL join_type JOIN table_ref
4875 JoinExpr *n = makeNode(JoinExpr);
4877 n->isNatural = TRUE;
4880 n->using = NIL; /* figure out which columns later... */
4881 n->quals = NULL; /* fill later */
4884 | table_ref NATURAL JOIN table_ref
4886 /* letting join_type reduce to empty doesn't work */
4887 JoinExpr *n = makeNode(JoinExpr);
4888 n->jointype = JOIN_INNER;
4889 n->isNatural = TRUE;
4892 n->using = NIL; /* figure out which columns later... */
4893 n->quals = NULL; /* fill later */
4899 AS ColId '(' name_list ')'
4901 $$ = makeNode(Alias);
4907 $$ = makeNode(Alias);
4910 | ColId '(' name_list ')'
4912 $$ = makeNode(Alias);
4918 $$ = makeNode(Alias);
4923 join_type: FULL join_outer { $$ = JOIN_FULL; }
4924 | LEFT join_outer { $$ = JOIN_LEFT; }
4925 | RIGHT join_outer { $$ = JOIN_RIGHT; }
4926 | INNER_P { $$ = JOIN_INNER; }
4929 /* OUTER is just noise... */
4930 join_outer: OUTER_P { $$ = NULL; }
4931 | /*EMPTY*/ { $$ = NULL; }
4934 /* JOIN qualification clauses
4935 * Possibilities are:
4936 * USING ( column list ) allows only unqualified column names,
4937 * which must match between tables.
4938 * ON expr allows more general qualifications.
4940 * We return USING as a List node, while an ON-expr will not be a List.
4943 join_qual: USING '(' name_list ')' { $$ = (Node *) $3; }
4944 | ON a_expr { $$ = $2; }
4951 /* default inheritance */
4953 $$->inhOpt = INH_DEFAULT;
4956 | qualified_name '*'
4958 /* inheritance query */
4960 $$->inhOpt = INH_YES;
4963 | ONLY qualified_name
4965 /* no inheritance */
4967 $$->inhOpt = INH_NO;
4970 | ONLY '(' qualified_name ')'
4972 /* no inheritance, SQL99-style syntax */
4974 $$->inhOpt = INH_NO;
4980 func_table: func_name '(' ')'
4982 FuncCall *n = makeNode(FuncCall);
4985 n->agg_star = FALSE;
4986 n->agg_distinct = FALSE;
4989 | func_name '(' expr_list ')'
4991 FuncCall *n = makeNode(FuncCall);
4994 n->agg_star = FALSE;
4995 n->agg_distinct = FALSE;
5002 WHERE a_expr { $$ = $2; }
5003 | /*EMPTY*/ { $$ = NULL; }
5007 TableFuncElementList:
5012 | TableFuncElementList ',' TableFuncElement
5014 $$ = lappend($1, $3);
5018 TableFuncElement: ColId Typename
5020 ColumnDef *n = makeNode(ColumnDef);
5023 n->constraints = NIL;
5029 /*****************************************************************************
5032 * SQL92 introduces a large amount of type-specific syntax.
5033 * Define individual clauses to handle these cases, and use
5034 * the generic case to handle regular type-extensible Postgres syntax.
5035 * - thomas 1997-10-10
5037 *****************************************************************************/
5039 Typename: SimpleTypename opt_array_bounds
5042 $$->arrayBounds = $2;
5044 | SETOF SimpleTypename opt_array_bounds
5047 $$->arrayBounds = $3;
5050 | SimpleTypename ARRAY '[' Iconst ']'
5052 /* SQL99's redundant syntax */
5054 $$->arrayBounds = makeList1(makeInteger($4));
5056 | SETOF SimpleTypename ARRAY '[' Iconst ']'
5058 /* SQL99's redundant syntax */
5060 $$->arrayBounds = makeList1(makeInteger($5));
5066 opt_array_bounds '[' ']'
5067 { $$ = lappend($1, makeInteger(-1)); }
5068 | opt_array_bounds '[' Iconst ']'
5069 { $$ = lappend($1, makeInteger($3)); }
5075 * XXX ideally, the production for a qualified typename should be ColId attrs
5076 * (there's no obvious reason why the first name should need to be restricted)
5077 * and should be an alternative of GenericType (so that it can be used to
5078 * specify a type for a literal in AExprConst). However doing either causes
5079 * reduce/reduce conflicts that I haven't been able to find a workaround
5083 GenericType { $$ = $1; }
5084 | Numeric { $$ = $1; }
5086 | Character { $$ = $1; }
5087 | ConstDatetime { $$ = $1; }
5088 | ConstInterval opt_interval
5091 if ($2 != INTERVAL_FULL_RANGE)
5092 $$->typmod = INTERVAL_TYPMOD(INTERVAL_FULL_PRECISION, $2);
5094 | ConstInterval '(' Iconst ')' opt_interval
5099 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5100 errmsg("INTERVAL(%d) precision must not be negative",
5102 if ($3 > MAX_INTERVAL_PRECISION)
5105 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5106 errmsg("INTERVAL(%d) precision reduced to maximum allowed, %d",
5107 $3, MAX_INTERVAL_PRECISION)));
5108 $3 = MAX_INTERVAL_PRECISION;
5110 $$->typmod = INTERVAL_TYPMOD($3, $5);
5114 $$ = makeNode(TypeName);
5115 $$->names = lcons(makeString($1), $2);
5120 /* We have a separate ConstTypename to allow defaulting fixed-length
5121 * types such as CHAR() and BIT() to an unspecified length.
5122 * SQL9x requires that these default to a length of one, but this
5123 * makes no sense for constructs like CHAR 'hi' and BIT '0101',
5124 * where there is an obvious better choice to make.
5125 * Note that ConstInterval is not included here since it must
5126 * be pushed up higher in the rules to accomodate the postfix
5127 * options (e.g. INTERVAL '1' YEAR).
5130 GenericType { $$ = $1; }
5131 | Numeric { $$ = $1; }
5132 | ConstBit { $$ = $1; }
5133 | ConstCharacter { $$ = $1; }
5134 | ConstDatetime { $$ = $1; }
5140 $$ = makeTypeName($1);
5144 /* SQL92 numeric data types
5145 * Check FLOAT() precision limits assuming IEEE floating types.
5146 * - thomas 1997-09-18
5147 * Provide real DECIMAL() and NUMERIC() implementations now - Jan 1998-12-30
5151 $$ = SystemTypeName("int4");
5155 $$ = SystemTypeName("int4");
5159 $$ = SystemTypeName("int2");
5163 $$ = SystemTypeName("int8");
5167 $$ = SystemTypeName("float4");
5173 | DOUBLE_P PRECISION
5175 $$ = SystemTypeName("float8");
5177 | DECIMAL_P opt_decimal
5179 $$ = SystemTypeName("numeric");
5184 $$ = SystemTypeName("numeric");
5187 | NUMERIC opt_numeric
5189 $$ = SystemTypeName("numeric");
5194 $$ = SystemTypeName("bool");
5198 opt_float: '(' Iconst ')'
5202 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5203 errmsg("precision for FLOAT must be at least 1 bit")));
5205 $$ = SystemTypeName("float4");
5207 $$ = SystemTypeName("float8");
5210 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5211 errmsg("precision for FLOAT must be less than 54 bits")));
5215 $$ = SystemTypeName("float8");
5220 '(' Iconst ',' Iconst ')'
5222 if ($2 < 1 || $2 > NUMERIC_MAX_PRECISION)
5224 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5225 errmsg("NUMERIC precision %d must be between 1 and %d",
5226 $2, NUMERIC_MAX_PRECISION)));
5227 if ($4 < 0 || $4 > $2)
5229 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5230 errmsg("NUMERIC scale %d must be between 0 and precision %d",
5233 $$ = (($2 << 16) | $4) + VARHDRSZ;
5237 if ($2 < 1 || $2 > NUMERIC_MAX_PRECISION)
5239 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5240 errmsg("NUMERIC precision %d must be between 1 and %d",
5241 $2, NUMERIC_MAX_PRECISION)));
5243 $$ = ($2 << 16) + VARHDRSZ;
5247 /* Insert "-1" meaning "no limit" */
5253 '(' Iconst ',' Iconst ')'
5255 if ($2 < 1 || $2 > NUMERIC_MAX_PRECISION)
5257 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5258 errmsg("DECIMAL precision %d must be between 1 and %d",
5259 $2, NUMERIC_MAX_PRECISION)));
5260 if ($4 < 0 || $4 > $2)
5262 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5263 errmsg("DECIMAL scale %d must be between 0 and precision %d",
5266 $$ = (($2 << 16) | $4) + VARHDRSZ;
5270 if ($2 < 1 || $2 > NUMERIC_MAX_PRECISION)
5272 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5273 errmsg("DECIMAL precision %d must be between 1 and %d",
5274 $2, NUMERIC_MAX_PRECISION)));
5276 $$ = ($2 << 16) + VARHDRSZ;
5280 /* Insert "-1" meaning "no limit" */
5287 * SQL92 bit-field data types
5288 * The following implements BIT() and BIT VARYING().
5300 /* ConstBit is like Bit except "BIT" defaults to unspecified length */
5301 /* See notes for ConstCharacter, which addresses same issue for "CHAR" */
5302 ConstBit: BitWithLength
5314 BIT opt_varying '(' Iconst ')'
5318 typname = $2 ? "varbit" : "bit";
5319 $$ = SystemTypeName(typname);
5322 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5323 errmsg("length for type %s must be at least 1",
5325 else if ($4 > (MaxAttrSize * BITS_PER_BYTE))
5327 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5328 errmsg("length for type %s cannot exceed %d",
5329 typname, MaxAttrSize * BITS_PER_BYTE)));
5337 /* bit defaults to bit(1), varbit to no limit */
5340 $$ = SystemTypeName("varbit");
5345 $$ = SystemTypeName("bit");
5353 * SQL92 character data types
5354 * The following implements CHAR() and VARCHAR().
5356 Character: CharacterWithLength
5360 | CharacterWithoutLength
5366 ConstCharacter: CharacterWithLength
5370 | CharacterWithoutLength
5372 /* Length was not specified so allow to be unrestricted.
5373 * This handles problems with fixed-length (bpchar) strings
5374 * which in column definitions must default to a length
5375 * of one, but should not be constrained if the length
5376 * was not specified.
5383 CharacterWithLength: character '(' Iconst ')' opt_charset
5385 if (($5 != NULL) && (strcmp($5, "sql_text") != 0))
5389 type = palloc(strlen($1) + 1 + strlen($5) + 1);
5396 $$ = SystemTypeName($1);
5400 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5401 errmsg("length for type %s must be at least 1",
5403 else if ($3 > MaxAttrSize)
5405 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5406 errmsg("length for type %s cannot exceed %d",
5409 /* we actually implement these like a varlen, so
5410 * the first 4 bytes is the length. (the difference
5411 * between these and "text" is that we blank-pad and
5412 * truncate where necessary)
5414 $$->typmod = VARHDRSZ + $3;
5418 CharacterWithoutLength: character opt_charset
5420 if (($2 != NULL) && (strcmp($2, "sql_text") != 0))
5424 type = palloc(strlen($1) + 1 + strlen($2) + 1);
5431 $$ = SystemTypeName($1);
5433 /* char defaults to char(1), varchar to no limit */
5434 if (strcmp($1, "bpchar") == 0)
5435 $$->typmod = VARHDRSZ + 1;
5441 character: CHARACTER opt_varying
5442 { $$ = $2 ? "varchar": "bpchar"; }
5443 | CHAR_P opt_varying
5444 { $$ = $2 ? "varchar": "bpchar"; }
5447 | NATIONAL CHARACTER opt_varying
5448 { $$ = $3 ? "varchar": "bpchar"; }
5449 | NATIONAL CHAR_P opt_varying
5450 { $$ = $3 ? "varchar": "bpchar"; }
5452 { $$ = $2 ? "varchar": "bpchar"; }
5456 VARYING { $$ = TRUE; }
5457 | /*EMPTY*/ { $$ = FALSE; }
5461 CHARACTER SET ColId { $$ = $3; }
5462 | /*EMPTY*/ { $$ = NULL; }
5466 COLLATE ColId { $$ = $2; }
5467 | /*EMPTY*/ { $$ = NULL; }
5471 TIMESTAMP '(' Iconst ')' opt_timezone
5474 $$ = SystemTypeName("timestamptz");
5476 $$ = SystemTypeName("timestamp");
5477 /* XXX the timezone field seems to be unused
5478 * - thomas 2001-09-06
5483 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5484 errmsg("TIMESTAMP(%d)%s precision must not be negative",
5485 $3, ($5 ? " WITH TIME ZONE": ""))));
5486 if ($3 > MAX_TIMESTAMP_PRECISION)
5489 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5490 errmsg("TIMESTAMP(%d)%s precision reduced to maximum allowed, %d",
5491 $3, ($5 ? " WITH TIME ZONE": ""),
5492 MAX_TIMESTAMP_PRECISION)));
5493 $3 = MAX_TIMESTAMP_PRECISION;
5497 | TIMESTAMP opt_timezone
5500 $$ = SystemTypeName("timestamptz");
5502 $$ = SystemTypeName("timestamp");
5503 /* XXX the timezone field seems to be unused
5504 * - thomas 2001-09-06
5507 /* SQL99 specified a default precision of six
5508 * for schema definitions. But for timestamp
5509 * literals we don't want to throw away precision
5510 * so leave this as unspecified for now.
5511 * Later, we may want a different production
5512 * for schemas. - thomas 2001-12-07
5516 | TIME '(' Iconst ')' opt_timezone
5519 $$ = SystemTypeName("timetz");
5521 $$ = SystemTypeName("time");
5524 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5525 errmsg("TIME(%d)%s precision must not be negative",
5526 $3, ($5 ? " WITH TIME ZONE": ""))));
5527 if ($3 > MAX_TIME_PRECISION)
5530 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5531 errmsg("TIME(%d)%s precision reduced to maximum allowed, %d",
5532 $3, ($5 ? " WITH TIME ZONE": ""),
5533 MAX_TIME_PRECISION)));
5534 $3 = MAX_TIME_PRECISION;
5541 $$ = SystemTypeName("timetz");
5543 $$ = SystemTypeName("time");
5544 /* SQL99 specified a default precision of zero.
5545 * See comments for timestamp above on why we will
5546 * leave this unspecified for now. - thomas 2001-12-07
5553 INTERVAL { $$ = SystemTypeName("interval"); }
5557 WITH TIME ZONE { $$ = TRUE; }
5558 | WITHOUT TIME ZONE { $$ = FALSE; }
5559 | /*EMPTY*/ { $$ = FALSE; }
5563 YEAR_P { $$ = INTERVAL_MASK(YEAR); }
5564 | MONTH_P { $$ = INTERVAL_MASK(MONTH); }
5565 | DAY_P { $$ = INTERVAL_MASK(DAY); }
5566 | HOUR_P { $$ = INTERVAL_MASK(HOUR); }
5567 | MINUTE_P { $$ = INTERVAL_MASK(MINUTE); }
5568 | SECOND_P { $$ = INTERVAL_MASK(SECOND); }
5570 { $$ = INTERVAL_MASK(YEAR) | INTERVAL_MASK(MONTH); }
5572 { $$ = INTERVAL_MASK(DAY) | INTERVAL_MASK(HOUR); }
5574 { $$ = INTERVAL_MASK(DAY) | INTERVAL_MASK(HOUR)
5575 | INTERVAL_MASK(MINUTE); }
5577 { $$ = INTERVAL_MASK(DAY) | INTERVAL_MASK(HOUR)
5578 | INTERVAL_MASK(MINUTE) | INTERVAL_MASK(SECOND); }
5579 | HOUR_P TO MINUTE_P
5580 { $$ = INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE); }
5581 | HOUR_P TO SECOND_P
5582 { $$ = INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE)
5583 | INTERVAL_MASK(SECOND); }
5584 | MINUTE_P TO SECOND_P
5585 { $$ = INTERVAL_MASK(MINUTE) | INTERVAL_MASK(SECOND); }
5586 | /*EMPTY*/ { $$ = INTERVAL_FULL_RANGE; }
5590 /*****************************************************************************
5592 * expression grammar
5594 *****************************************************************************/
5596 /* Expressions using row descriptors
5597 * Define row_descriptor to allow yacc to break the reduce/reduce conflict
5598 * with singleton expressions. Use SQL99's ROW keyword to allow rows of
5601 r_expr: row IN_P select_with_parens
5603 SubLink *n = makeNode(SubLink);
5604 n->subLinkType = ANY_SUBLINK;
5606 n->operName = makeList1(makeString("="));
5610 | row NOT IN_P select_with_parens
5612 /* Make an IN node */
5613 SubLink *n = makeNode(SubLink);
5614 n->subLinkType = ANY_SUBLINK;
5616 n->operName = makeList1(makeString("="));
5618 /* Stick a NOT on top */
5619 $$ = (Node *) makeA_Expr(AEXPR_NOT, NIL, NULL, (Node *) n);
5621 | row qual_all_Op sub_type select_with_parens
5624 SubLink *n = makeNode(SubLink);
5625 n->subLinkType = $3;
5631 | row qual_all_Op select_with_parens
5634 SubLink *n = makeNode(SubLink);
5635 n->subLinkType = MULTIEXPR_SUBLINK;
5641 | row qual_all_Op row
5644 $$ = makeRowExpr($2, $1, $3);
5648 $$ = makeRowNullTest(IS_NULL, $1);
5652 $$ = makeRowNullTest(IS_NOT_NULL, $1);
5656 $$ = (Node *)makeOverlaps($1, $3);
5658 | row IS DISTINCT FROM row
5661 /* IS DISTINCT FROM has the following rules for non-array types:
5662 * a) the row lengths must be equal
5663 * b) if both rows are zero-length, then they are not distinct
5664 * c) if any element is distinct, the rows are distinct
5665 * The rules for an element being distinct:
5666 * a) if the elements are both NULL, then they are not distinct
5667 * b) if the elements compare to be equal, then they are not distinct
5668 * c) otherwise, they are distinct
5672 /* lengths don't match? then complain */
5673 if (length(largs) != length(rargs))
5676 (errcode(ERRCODE_SYNTAX_ERROR),
5677 errmsg("unequal number of entries in row expression")));
5679 /* both are zero-length rows? then they are not distinct */
5680 else if (length(largs) <= 0)
5682 $$ = (Node *)makeBoolConst(FALSE);
5684 /* otherwise, we need to compare each element */
5687 $$ = (Node *)makeDistinctExpr(largs, rargs);
5692 /* Explicit row production.
5693 * SQL99 allows an optional ROW keyword, so we can now do single-element productions
5694 * without conflicting with the parenthesized a_expr production.
5696 row: ROW '(' row_descriptor ')' { $$ = $3; }
5697 | ROW '(' a_expr ')' { $$ = makeList1($3); }
5698 | ROW '(' ')' { $$ = NULL; }
5699 | '(' row_descriptor ')' { $$ = $2; }
5702 row_descriptor: expr_list ',' a_expr { $$ = lappend($1, $3); }
5705 sub_type: ANY { $$ = ANY_SUBLINK; }
5706 | SOME { $$ = ANY_SUBLINK; }
5707 | ALL { $$ = ALL_SUBLINK; }
5710 all_Op: Op { $$ = $1; }
5711 | MathOp { $$ = $1; }
5714 MathOp: '+' { $$ = "+"; }
5726 { $$ = makeList1(makeString($1)); }
5727 | OPERATOR '(' any_operator ')' { $$ = $3; }
5732 { $$ = makeList1(makeString($1)); }
5733 | OPERATOR '(' any_operator ')' { $$ = $3; }
5737 * General expressions
5738 * This is the heart of the expression syntax.
5740 * We have two expression types: a_expr is the unrestricted kind, and
5741 * b_expr is a subset that must be used in some places to avoid shift/reduce
5742 * conflicts. For example, we can't do BETWEEN as "BETWEEN a_expr AND a_expr"
5743 * because that use of AND conflicts with AND as a boolean operator. So,
5744 * b_expr is used in BETWEEN and we remove boolean keywords from b_expr.
5746 * Note that '(' a_expr ')' is a b_expr, so an unrestricted expression can
5747 * always be used by surrounding it with parens.
5749 * c_expr is all the productions that are common to a_expr and b_expr;
5750 * it's factored out just to eliminate redundant coding.
5752 a_expr: c_expr { $$ = $1; }
5753 | a_expr TYPECAST Typename
5754 { $$ = makeTypeCast($1, $3); }
5755 | a_expr COLLATE ColId
5757 FuncCall *n = makeNode(FuncCall);
5758 n->funcname = SystemFuncName($3);
5759 n->args = makeList1($1);
5760 n->agg_star = FALSE;
5761 n->agg_distinct = FALSE;
5764 | a_expr AT TIME ZONE c_expr
5766 FuncCall *n = makeNode(FuncCall);
5767 n->funcname = SystemFuncName("timezone");
5768 n->args = makeList2($5, $1);
5769 n->agg_star = FALSE;
5770 n->agg_distinct = FALSE;
5774 * These operators must be called out explicitly in order to make use
5775 * of yacc/bison's automatic operator-precedence handling. All other
5776 * operator names are handled by the generic productions using "Op",
5777 * below; and all those operators will have the same precedence.
5779 * If you add more explicitly-known operators, be sure to add them
5780 * also to b_expr and to the MathOp list above.
5782 | '+' a_expr %prec UMINUS
5783 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "+", NULL, $2); }
5784 | '-' a_expr %prec UMINUS
5785 { $$ = doNegate($2); }
5787 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "%", NULL, $2); }
5789 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "^", NULL, $2); }
5791 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "%", $1, NULL); }
5793 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "^", $1, NULL); }
5795 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "+", $1, $3); }
5797 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "-", $1, $3); }
5799 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "*", $1, $3); }
5801 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "/", $1, $3); }
5803 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "%", $1, $3); }
5805 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "^", $1, $3); }
5807 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "<", $1, $3); }
5809 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, ">", $1, $3); }
5811 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "=", $1, $3); }
5813 | a_expr qual_Op a_expr %prec Op
5814 { $$ = (Node *) makeA_Expr(AEXPR_OP, $2, $1, $3); }
5815 | qual_Op a_expr %prec Op
5816 { $$ = (Node *) makeA_Expr(AEXPR_OP, $1, NULL, $2); }
5817 | a_expr qual_Op %prec POSTFIXOP
5818 { $$ = (Node *) makeA_Expr(AEXPR_OP, $2, $1, NULL); }
5821 { $$ = (Node *) makeA_Expr(AEXPR_AND, NIL, $1, $3); }
5823 { $$ = (Node *) makeA_Expr(AEXPR_OR, NIL, $1, $3); }
5825 { $$ = (Node *) makeA_Expr(AEXPR_NOT, NIL, NULL, $2); }
5827 | a_expr LIKE a_expr
5828 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "~~", $1, $3); }
5829 | a_expr LIKE a_expr ESCAPE a_expr
5831 FuncCall *n = makeNode(FuncCall);
5832 n->funcname = SystemFuncName("like_escape");
5833 n->args = makeList2($3, $5);
5834 n->agg_star = FALSE;
5835 n->agg_distinct = FALSE;
5836 $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "~~", $1, (Node *) n);
5838 | a_expr NOT LIKE a_expr
5839 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "!~~", $1, $4); }
5840 | a_expr NOT LIKE a_expr ESCAPE a_expr
5842 FuncCall *n = makeNode(FuncCall);
5843 n->funcname = SystemFuncName("like_escape");
5844 n->args = makeList2($4, $6);
5845 n->agg_star = FALSE;
5846 n->agg_distinct = FALSE;
5847 $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "!~~", $1, (Node *) n);
5849 | a_expr ILIKE a_expr
5850 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "~~*", $1, $3); }
5851 | a_expr ILIKE a_expr ESCAPE a_expr
5853 FuncCall *n = makeNode(FuncCall);
5854 n->funcname = SystemFuncName("like_escape");
5855 n->args = makeList2($3, $5);
5856 n->agg_star = FALSE;
5857 n->agg_distinct = FALSE;
5858 $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "~~*", $1, (Node *) n);
5860 | a_expr NOT ILIKE a_expr
5861 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "!~~*", $1, $4); }
5862 | a_expr NOT ILIKE a_expr ESCAPE a_expr
5864 FuncCall *n = makeNode(FuncCall);
5865 n->funcname = SystemFuncName("like_escape");
5866 n->args = makeList2($4, $6);
5867 n->agg_star = FALSE;
5868 n->agg_distinct = FALSE;
5869 $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "!~~*", $1, (Node *) n);
5872 | a_expr SIMILAR TO a_expr %prec SIMILAR
5874 A_Const *c = makeNode(A_Const);
5875 FuncCall *n = makeNode(FuncCall);
5876 c->val.type = T_Null;
5877 n->funcname = SystemFuncName("similar_escape");
5878 n->args = makeList2($4, (Node *) c);
5879 n->agg_star = FALSE;
5880 n->agg_distinct = FALSE;
5881 $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "~", $1, (Node *) n);
5883 | a_expr SIMILAR TO a_expr ESCAPE a_expr
5885 FuncCall *n = makeNode(FuncCall);
5886 n->funcname = SystemFuncName("similar_escape");
5887 n->args = makeList2($4, $6);
5888 n->agg_star = FALSE;
5889 n->agg_distinct = FALSE;
5890 $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "~", $1, (Node *) n);
5892 | a_expr NOT SIMILAR TO a_expr %prec SIMILAR
5894 A_Const *c = makeNode(A_Const);
5895 FuncCall *n = makeNode(FuncCall);
5896 c->val.type = T_Null;
5897 n->funcname = SystemFuncName("similar_escape");
5898 n->args = makeList2($5, (Node *) c);
5899 n->agg_star = FALSE;
5900 n->agg_distinct = FALSE;
5901 $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "!~", $1, (Node *) n);
5903 | a_expr NOT SIMILAR TO a_expr ESCAPE a_expr
5905 FuncCall *n = makeNode(FuncCall);
5906 n->funcname = SystemFuncName("similar_escape");
5907 n->args = makeList2($5, $7);
5908 n->agg_star = FALSE;
5909 n->agg_distinct = FALSE;
5910 $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "!~", $1, (Node *) n);
5914 * Define SQL92-style Null test clause.
5915 * Allow two forms described in the standard:
5918 * Allow two SQL extensions
5924 NullTest *n = makeNode(NullTest);
5925 n->arg = (Expr *) $1;
5926 n->nulltesttype = IS_NULL;
5931 NullTest *n = makeNode(NullTest);
5932 n->arg = (Expr *) $1;
5933 n->nulltesttype = IS_NULL;
5938 NullTest *n = makeNode(NullTest);
5939 n->arg = (Expr *) $1;
5940 n->nulltesttype = IS_NOT_NULL;
5943 | a_expr IS NOT NULL_P
5945 NullTest *n = makeNode(NullTest);
5946 n->arg = (Expr *) $1;
5947 n->nulltesttype = IS_NOT_NULL;
5952 BooleanTest *b = makeNode(BooleanTest);
5953 b->arg = (Expr *) $1;
5954 b->booltesttype = IS_TRUE;
5957 | a_expr IS NOT TRUE_P
5959 BooleanTest *b = makeNode(BooleanTest);
5960 b->arg = (Expr *) $1;
5961 b->booltesttype = IS_NOT_TRUE;
5966 BooleanTest *b = makeNode(BooleanTest);
5967 b->arg = (Expr *) $1;
5968 b->booltesttype = IS_FALSE;
5971 | a_expr IS NOT FALSE_P
5973 BooleanTest *b = makeNode(BooleanTest);
5974 b->arg = (Expr *) $1;
5975 b->booltesttype = IS_NOT_FALSE;
5980 BooleanTest *b = makeNode(BooleanTest);
5981 b->arg = (Expr *) $1;
5982 b->booltesttype = IS_UNKNOWN;
5985 | a_expr IS NOT UNKNOWN
5987 BooleanTest *b = makeNode(BooleanTest);
5988 b->arg = (Expr *) $1;
5989 b->booltesttype = IS_NOT_UNKNOWN;
5992 | a_expr IS DISTINCT FROM a_expr %prec IS
5993 { $$ = (Node *) makeSimpleA_Expr(AEXPR_DISTINCT, "=", $1, $5); }
5994 | a_expr IS OF '(' type_list ')' %prec IS
5996 $$ = (Node *) makeSimpleA_Expr(AEXPR_OF, "=", $1, (Node *) $5);
5998 | a_expr IS NOT OF '(' type_list ')' %prec IS
6000 $$ = (Node *) makeSimpleA_Expr(AEXPR_OF, "!=", $1, (Node *) $6);
6002 | a_expr BETWEEN b_expr AND b_expr %prec BETWEEN
6004 $$ = (Node *) makeA_Expr(AEXPR_AND, NIL,
6005 (Node *) makeSimpleA_Expr(AEXPR_OP, ">=", $1, $3),
6006 (Node *) makeSimpleA_Expr(AEXPR_OP, "<=", $1, $5));
6008 | a_expr NOT BETWEEN b_expr AND b_expr %prec BETWEEN
6010 $$ = (Node *) makeA_Expr(AEXPR_OR, NIL,
6011 (Node *) makeSimpleA_Expr(AEXPR_OP, "<", $1, $4),
6012 (Node *) makeSimpleA_Expr(AEXPR_OP, ">", $1, $6));
6014 | a_expr IN_P in_expr
6016 /* in_expr returns a SubLink or a list of a_exprs */
6017 if (IsA($3, SubLink))
6019 SubLink *n = (SubLink *)$3;
6020 n->subLinkType = ANY_SUBLINK;
6021 n->lefthand = makeList1($1);
6022 n->operName = makeList1(makeString("="));
6029 foreach(l, (List *) $3)
6032 cmp = (Node *) makeSimpleA_Expr(AEXPR_OP, "=", $1, lfirst(l));
6036 n = (Node *) makeA_Expr(AEXPR_OR, NIL, n, cmp);
6041 | a_expr NOT IN_P in_expr
6043 /* in_expr returns a SubLink or a list of a_exprs */
6044 if (IsA($4, SubLink))
6046 /* Make an IN node */
6047 SubLink *n = (SubLink *)$4;
6048 n->subLinkType = ANY_SUBLINK;
6049 n->lefthand = makeList1($1);
6050 n->operName = makeList1(makeString("="));
6051 /* Stick a NOT on top */
6052 $$ = (Node *) makeA_Expr(AEXPR_NOT, NIL, NULL, (Node *) n);
6058 foreach(l, (List *) $4)
6061 cmp = (Node *) makeSimpleA_Expr(AEXPR_OP, "<>", $1, lfirst(l));
6065 n = (Node *) makeA_Expr(AEXPR_AND, NIL, n, cmp);
6070 | a_expr qual_all_Op sub_type select_with_parens %prec Op
6072 SubLink *n = makeNode(SubLink);
6073 n->subLinkType = $3;
6074 n->lefthand = makeList1($1);
6079 | a_expr qual_all_Op sub_type '(' a_expr ')' %prec Op
6081 if ($3 == ANY_SUBLINK)
6082 $$ = (Node *) makeA_Expr(AEXPR_OP_ANY, $2, $1, $5);
6084 $$ = (Node *) makeA_Expr(AEXPR_OP_ALL, $2, $1, $5);
6086 | UNIQUE select_with_parens %prec Op
6088 /* Not sure how to get rid of the parentheses
6089 * but there are lots of shift/reduce errors without them.
6091 * Should be able to implement this by plopping the entire
6092 * select into a node, then transforming the target expressions
6093 * from whatever they are into count(*), and testing the
6094 * entire result equal to one.
6095 * But, will probably implement a separate node in the executor.
6098 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
6099 errmsg("UNIQUE predicate is not yet implemented")));
6106 * Restricted expressions
6108 * b_expr is a subset of the complete expression syntax defined by a_expr.
6110 * Presently, AND, NOT, IS, and IN are the a_expr keywords that would
6111 * cause trouble in the places where b_expr is used. For simplicity, we
6112 * just eliminate all the boolean-keyword-operator productions from b_expr.
6116 | b_expr TYPECAST Typename
6117 { $$ = makeTypeCast($1, $3); }
6118 | '+' b_expr %prec UMINUS
6119 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "+", NULL, $2); }
6120 | '-' b_expr %prec UMINUS
6121 { $$ = doNegate($2); }
6123 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "%", NULL, $2); }
6125 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "^", NULL, $2); }
6127 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "%", $1, NULL); }
6129 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "^", $1, NULL); }
6131 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "+", $1, $3); }
6133 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "-", $1, $3); }
6135 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "*", $1, $3); }
6137 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "/", $1, $3); }
6139 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "%", $1, $3); }
6141 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "^", $1, $3); }
6143 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "<", $1, $3); }
6145 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, ">", $1, $3); }
6147 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "=", $1, $3); }
6148 | b_expr qual_Op b_expr %prec Op
6149 { $$ = (Node *) makeA_Expr(AEXPR_OP, $2, $1, $3); }
6150 | qual_Op b_expr %prec Op
6151 { $$ = (Node *) makeA_Expr(AEXPR_OP, $1, NULL, $2); }
6152 | b_expr qual_Op %prec POSTFIXOP
6153 { $$ = (Node *) makeA_Expr(AEXPR_OP, $2, $1, NULL); }
6154 | b_expr IS DISTINCT FROM b_expr %prec IS
6155 { $$ = (Node *) makeSimpleA_Expr(AEXPR_DISTINCT, "=", $1, $5); }
6156 | b_expr IS OF '(' type_list ')' %prec IS
6158 $$ = (Node *) makeSimpleA_Expr(AEXPR_OF, "=", $1, (Node *) $5);
6160 | b_expr IS NOT OF '(' type_list ')' %prec IS
6162 $$ = (Node *) makeSimpleA_Expr(AEXPR_OF, "!=", $1, (Node *) $6);
6167 * Productions that can be used in both a_expr and b_expr.
6169 * Note: productions that refer recursively to a_expr or b_expr mostly
6170 * cannot appear here. However, it's OK to refer to a_exprs that occur
6171 * inside parentheses, such as function arguments; that cannot introduce
6172 * ambiguity to the b_expr syntax.
6174 c_expr: columnref { $$ = (Node *) $1; }
6175 | AexprConst { $$ = $1; }
6176 | PARAM attrs opt_indirection
6179 * PARAM without field names is considered a constant,
6180 * but with 'em, it is not. Not very consistent ...
6182 ParamRef *n = makeNode(ParamRef);
6185 n->indirection = $3;
6188 | '(' a_expr ')' attrs opt_indirection
6190 ExprFieldSelect *n = makeNode(ExprFieldSelect);
6193 n->indirection = $5;
6196 | '(' a_expr ')' opt_indirection
6200 ExprFieldSelect *n = makeNode(ExprFieldSelect);
6203 n->indirection = $4;
6213 FuncCall *n = makeNode(FuncCall);
6216 n->agg_star = FALSE;
6217 n->agg_distinct = FALSE;
6220 | func_name '(' expr_list ')'
6222 FuncCall *n = makeNode(FuncCall);
6225 n->agg_star = FALSE;
6226 n->agg_distinct = FALSE;
6229 | func_name '(' ALL expr_list ')'
6231 FuncCall *n = makeNode(FuncCall);
6234 n->agg_star = FALSE;
6235 n->agg_distinct = FALSE;
6236 /* Ideally we'd mark the FuncCall node to indicate
6237 * "must be an aggregate", but there's no provision
6238 * for that in FuncCall at the moment.
6242 | func_name '(' DISTINCT expr_list ')'
6244 FuncCall *n = makeNode(FuncCall);
6247 n->agg_star = FALSE;
6248 n->agg_distinct = TRUE;
6251 | func_name '(' '*' ')'
6254 * For now, we transform AGGREGATE(*) into AGGREGATE(1).
6256 * This does the right thing for COUNT(*) (in fact,
6257 * any certainly-non-null expression would do for COUNT),
6258 * and there are no other aggregates in SQL92 that accept
6261 * The FuncCall node is also marked agg_star = true,
6262 * so that later processing can detect what the argument
6265 FuncCall *n = makeNode(FuncCall);
6266 A_Const *star = makeNode(A_Const);
6268 star->val.type = T_Integer;
6269 star->val.val.ival = 1;
6271 n->args = makeList1(star);
6273 n->agg_distinct = FALSE;
6279 * Translate as "'now'::text::date".
6281 * We cannot use "'now'::date" because coerce_type() will
6282 * immediately reduce that to a constant representing
6283 * today's date. We need to delay the conversion until
6284 * runtime, else the wrong things will happen when
6285 * CURRENT_DATE is used in a column default value or rule.
6287 * This could be simplified if we had a way to generate
6288 * an expression tree representing runtime application
6289 * of type-input conversion functions...
6291 A_Const *s = makeNode(A_Const);
6294 s->val.type = T_String;
6295 s->val.val.str = "now";
6296 s->typename = SystemTypeName("text");
6298 d = SystemTypeName("date");
6300 $$ = (Node *)makeTypeCast((Node *)s, d);
6305 * Translate as "'now'::text::timetz".
6306 * See comments for CURRENT_DATE.
6308 A_Const *s = makeNode(A_Const);
6311 s->val.type = T_String;
6312 s->val.val.str = "now";
6313 s->typename = SystemTypeName("text");
6315 d = SystemTypeName("timetz");
6316 /* SQL99 mandates a default precision of zero for TIME
6317 * fields in schemas. However, for CURRENT_TIME
6318 * let's preserve the microsecond precision we
6319 * might see from the system clock. - thomas 2001-12-07
6323 $$ = (Node *)makeTypeCast((Node *)s, d);
6325 | CURRENT_TIME '(' Iconst ')'
6328 * Translate as "'now'::text::timetz(n)".
6329 * See comments for CURRENT_DATE.
6331 A_Const *s = makeNode(A_Const);
6334 s->val.type = T_String;
6335 s->val.val.str = "now";
6336 s->typename = SystemTypeName("text");
6337 d = SystemTypeName("timetz");
6340 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
6341 errmsg("CURRENT_TIME(%d) precision must not be negative",
6343 if ($3 > MAX_TIME_PRECISION)
6346 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
6347 errmsg("CURRENT_TIME(%d) precision reduced to maximum allowed, %d",
6348 $3, MAX_TIME_PRECISION)));
6349 $3 = MAX_TIME_PRECISION;
6353 $$ = (Node *)makeTypeCast((Node *)s, d);
6358 * Translate as "'now'::text::timestamptz".
6359 * See comments for CURRENT_DATE.
6361 A_Const *s = makeNode(A_Const);
6364 s->val.type = T_String;
6365 s->val.val.str = "now";
6366 s->typename = SystemTypeName("text");
6368 d = SystemTypeName("timestamptz");
6369 /* SQL99 mandates a default precision of 6 for timestamp.
6370 * Also, that is about as precise as we will get since
6371 * we are using a microsecond time interface.
6372 * - thomas 2001-12-07
6376 $$ = (Node *)makeTypeCast((Node *)s, d);
6378 | CURRENT_TIMESTAMP '(' Iconst ')'
6381 * Translate as "'now'::text::timestamptz(n)".
6382 * See comments for CURRENT_DATE.
6384 A_Const *s = makeNode(A_Const);
6387 s->val.type = T_String;
6388 s->val.val.str = "now";
6389 s->typename = SystemTypeName("text");
6391 d = SystemTypeName("timestamptz");
6394 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
6395 errmsg("CURRENT_TIMESTAMP(%d) precision must not be negative",
6397 if ($3 > MAX_TIMESTAMP_PRECISION)
6400 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
6401 errmsg("CURRENT_TIMESTAMP(%d) precision reduced to maximum allowed, %d",
6402 $3, MAX_TIMESTAMP_PRECISION)));
6403 $3 = MAX_TIMESTAMP_PRECISION;
6407 $$ = (Node *)makeTypeCast((Node *)s, d);
6412 * Translate as "'now'::text::time".
6413 * See comments for CURRENT_DATE.
6415 A_Const *s = makeNode(A_Const);
6418 s->val.type = T_String;
6419 s->val.val.str = "now";
6420 s->typename = SystemTypeName("text");
6422 d = SystemTypeName("time");
6423 /* SQL99 mandates a default precision of zero for TIME
6424 * fields in schemas. However, for LOCALTIME
6425 * let's preserve the microsecond precision we
6426 * might see from the system clock. - thomas 2001-12-07
6430 $$ = (Node *)makeTypeCast((Node *)s, d);
6432 | LOCALTIME '(' Iconst ')'
6435 * Translate as "'now'::text::time(n)".
6436 * See comments for CURRENT_DATE.
6438 A_Const *s = makeNode(A_Const);
6441 s->val.type = T_String;
6442 s->val.val.str = "now";
6443 s->typename = SystemTypeName("text");
6444 d = SystemTypeName("time");
6447 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
6448 errmsg("LOCALTIME(%d) precision must not be negative",
6450 if ($3 > MAX_TIME_PRECISION)
6453 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
6454 errmsg("LOCALTIME(%d) precision reduced to maximum allowed, %d",
6455 $3, MAX_TIME_PRECISION)));
6456 $3 = MAX_TIME_PRECISION;
6460 $$ = (Node *)makeTypeCast((Node *)s, d);
6465 * Translate as "'now'::text::timestamp".
6466 * See comments for CURRENT_DATE.
6468 A_Const *s = makeNode(A_Const);
6471 s->val.type = T_String;
6472 s->val.val.str = "now";
6473 s->typename = SystemTypeName("text");
6475 d = SystemTypeName("timestamp");
6476 /* SQL99 mandates a default precision of 6 for timestamp.
6477 * Also, that is about as precise as we will get since
6478 * we are using a microsecond time interface.
6479 * - thomas 2001-12-07
6483 $$ = (Node *)makeTypeCast((Node *)s, d);
6485 | LOCALTIMESTAMP '(' Iconst ')'
6488 * Translate as "'now'::text::timestamp(n)".
6489 * See comments for CURRENT_DATE.
6491 A_Const *s = makeNode(A_Const);
6494 s->val.type = T_String;
6495 s->val.val.str = "now";
6496 s->typename = SystemTypeName("text");
6498 d = SystemTypeName("timestamp");
6501 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
6502 errmsg("LOCALTIMESTAMP(%d) precision must not be negative",
6504 if ($3 > MAX_TIMESTAMP_PRECISION)
6507 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
6508 errmsg("LOCALTIMESTAMP(%d) precision reduced to maximum allowed, %d",
6509 $3, MAX_TIMESTAMP_PRECISION)));
6510 $3 = MAX_TIMESTAMP_PRECISION;
6514 $$ = (Node *)makeTypeCast((Node *)s, d);
6518 FuncCall *n = makeNode(FuncCall);
6519 n->funcname = SystemFuncName("current_user");
6521 n->agg_star = FALSE;
6522 n->agg_distinct = FALSE;
6527 FuncCall *n = makeNode(FuncCall);
6528 n->funcname = SystemFuncName("session_user");
6530 n->agg_star = FALSE;
6531 n->agg_distinct = FALSE;
6536 FuncCall *n = makeNode(FuncCall);
6537 n->funcname = SystemFuncName("current_user");
6539 n->agg_star = FALSE;
6540 n->agg_distinct = FALSE;
6543 | CAST '(' a_expr AS Typename ')'
6544 { $$ = makeTypeCast($3, $5); }
6545 | EXTRACT '(' extract_list ')'
6547 FuncCall *n = makeNode(FuncCall);
6548 n->funcname = SystemFuncName("date_part");
6550 n->agg_star = FALSE;
6551 n->agg_distinct = FALSE;
6554 | OVERLAY '(' overlay_list ')'
6556 /* overlay(A PLACING B FROM C FOR D) is converted to
6557 * substring(A, 1, C-1) || B || substring(A, C+1, C+D)
6558 * overlay(A PLACING B FROM C) is converted to
6559 * substring(A, 1, C-1) || B || substring(A, C+1, C+char_length(B))
6561 FuncCall *n = makeNode(FuncCall);
6562 n->funcname = SystemFuncName("overlay");
6564 n->agg_star = FALSE;
6565 n->agg_distinct = FALSE;
6568 | POSITION '(' position_list ')'
6570 /* position(A in B) is converted to position(B, A) */
6571 FuncCall *n = makeNode(FuncCall);
6572 n->funcname = SystemFuncName("position");
6574 n->agg_star = FALSE;
6575 n->agg_distinct = FALSE;
6578 | SUBSTRING '(' substr_list ')'
6580 /* substring(A from B for C) is converted to
6581 * substring(A, B, C) - thomas 2000-11-28
6583 FuncCall *n = makeNode(FuncCall);
6584 n->funcname = SystemFuncName("substring");
6586 n->agg_star = FALSE;
6587 n->agg_distinct = FALSE;
6590 | TREAT '(' a_expr AS Typename ')'
6592 /* TREAT(expr AS target) converts expr of a particular type to target,
6593 * which is defined to be a subtype of the original expression.
6594 * In SQL99, this is intended for use with structured UDTs,
6595 * but let's make this a generally useful form allowing stronger
6596 * coersions than are handled by implicit casting.
6598 FuncCall *n = makeNode(FuncCall);
6599 /* Convert SystemTypeName() to SystemFuncName() even though
6600 * at the moment they result in the same thing.
6602 n->funcname = SystemFuncName(((Value *)llast($5->names))->val.str);
6603 n->args = makeList1($3);
6606 | TRIM '(' BOTH trim_list ')'
6608 /* various trim expressions are defined in SQL92
6609 * - thomas 1997-07-19
6611 FuncCall *n = makeNode(FuncCall);
6612 n->funcname = SystemFuncName("btrim");
6614 n->agg_star = FALSE;
6615 n->agg_distinct = FALSE;
6618 | TRIM '(' LEADING trim_list ')'
6620 FuncCall *n = makeNode(FuncCall);
6621 n->funcname = SystemFuncName("ltrim");
6623 n->agg_star = FALSE;
6624 n->agg_distinct = FALSE;
6627 | TRIM '(' TRAILING trim_list ')'
6629 FuncCall *n = makeNode(FuncCall);
6630 n->funcname = SystemFuncName("rtrim");
6632 n->agg_star = FALSE;
6633 n->agg_distinct = FALSE;
6636 | TRIM '(' trim_list ')'
6638 FuncCall *n = makeNode(FuncCall);
6639 n->funcname = SystemFuncName("btrim");
6641 n->agg_star = FALSE;
6642 n->agg_distinct = FALSE;
6645 | CONVERT '(' a_expr USING any_name ')'
6647 FuncCall *n = makeNode(FuncCall);
6648 A_Const *c = makeNode(A_Const);
6650 c->val.type = T_String;
6651 c->val.val.str = NameListToQuotedString($5);
6653 n->funcname = SystemFuncName("convert_using");
6654 n->args = makeList2($3, c);
6655 n->agg_star = FALSE;
6656 n->agg_distinct = FALSE;
6659 | CONVERT '(' expr_list ')'
6661 FuncCall *n = makeNode(FuncCall);
6662 n->funcname = SystemFuncName("convert");
6664 n->agg_star = FALSE;
6665 n->agg_distinct = FALSE;
6668 | select_with_parens %prec UMINUS
6670 SubLink *n = makeNode(SubLink);
6671 n->subLinkType = EXPR_SUBLINK;
6677 | EXISTS select_with_parens
6679 SubLink *n = makeNode(SubLink);
6680 n->subLinkType = EXISTS_SUBLINK;
6686 | ARRAY select_with_parens
6688 SubLink *n = makeNode(SubLink);
6689 n->subLinkType = ARRAY_SUBLINK;
6700 * Supporting nonterminals for expressions.
6704 opt_indirection '[' a_expr ']'
6706 A_Indices *ai = makeNode(A_Indices);
6709 $$ = lappend($1, ai);
6711 | opt_indirection '[' a_expr ':' a_expr ']'
6713 A_Indices *ai = makeNode(A_Indices);
6716 $$ = lappend($1, ai);
6722 expr_list: a_expr { $$ = makeList1($1); }
6723 | expr_list ',' a_expr { $$ = lappend($1, $3); }
6727 extract_arg FROM a_expr
6729 A_Const *n = makeNode(A_Const);
6730 n->val.type = T_String;
6731 n->val.val.str = $1;
6732 $$ = makeList2((Node *) n, $3);
6734 | /*EMPTY*/ { $$ = NIL; }
6737 type_list: type_list ',' Typename
6739 $$ = lappend($1, $3);
6747 array_expr_list: array_expr
6748 { $$ = makeList1($1); }
6749 | array_expr_list ',' array_expr
6750 { $$ = lappend($1, $3); }
6753 array_expr: '[' expr_list ']'
6755 ArrayExpr *n = makeNode(ArrayExpr);
6759 | '[' array_expr_list ']'
6761 ArrayExpr *n = makeNode(ArrayExpr);
6767 /* Allow delimited string SCONST in extract_arg as an SQL extension.
6768 * - thomas 2001-04-12
6773 | YEAR_P { $$ = "year"; }
6774 | MONTH_P { $$ = "month"; }
6775 | DAY_P { $$ = "day"; }
6776 | HOUR_P { $$ = "hour"; }
6777 | MINUTE_P { $$ = "minute"; }
6778 | SECOND_P { $$ = "second"; }
6779 | SCONST { $$ = $1; }
6782 /* OVERLAY() arguments
6783 * SQL99 defines the OVERLAY() function:
6784 * o overlay(text placing text from int for int)
6785 * o overlay(text placing text from int)
6788 a_expr overlay_placing substr_from substr_for
6790 $$ = makeList4($1, $2, $3, $4);
6792 | a_expr overlay_placing substr_from
6794 $$ = makeList3($1, $2, $3);
6803 /* position_list uses b_expr not a_expr to avoid conflict with general IN */
6806 b_expr IN_P b_expr { $$ = makeList2($3, $1); }
6807 | /*EMPTY*/ { $$ = NIL; }
6810 /* SUBSTRING() arguments
6811 * SQL9x defines a specific syntax for arguments to SUBSTRING():
6812 * o substring(text from int for int)
6813 * o substring(text from int) get entire string from starting point "int"
6814 * o substring(text from pattern) get entire string matching pattern
6815 * o substring(text for int) get first "int" characters of string
6816 * We also want to implement generic substring functions which accept
6817 * the usual generic list of arguments. So we will accept both styles
6818 * here, and convert the SQL9x style to the generic list for further
6819 * processing. - thomas 2000-11-28
6822 a_expr substr_from substr_for
6824 $$ = makeList3($1, $2, $3);
6826 | a_expr substr_for substr_from
6828 $$ = makeList3($1, $3, $2);
6830 | a_expr substr_from
6832 $$ = makeList2($1, $2);
6836 A_Const *n = makeNode(A_Const);
6837 n->val.type = T_Integer;
6838 n->val.val.ival = 1;
6839 $$ = makeList3($1, (Node *)n, $2);
6850 FROM a_expr { $$ = $2; }
6853 substr_for: FOR a_expr { $$ = $2; }
6856 trim_list: a_expr FROM expr_list { $$ = lappend($3, $1); }
6857 | FROM expr_list { $$ = $2; }
6858 | expr_list { $$ = $1; }
6861 in_expr: select_with_parens
6863 SubLink *n = makeNode(SubLink);
6865 /* other fields will be filled later */
6868 | '(' expr_list ')' { $$ = (Node *)$2; }
6872 * Define SQL92-style case clause.
6873 * Allow all four forms described in the standard:
6874 * - Full specification
6875 * CASE WHEN a = b THEN c ... ELSE d END
6876 * - Implicit argument
6877 * CASE a WHEN b THEN c ... ELSE d END
6878 * - Conditional NULL
6880 * same as CASE WHEN x = y THEN NULL ELSE x END
6881 * - Conditional substitution from list, use first non-null argument
6883 * same as CASE WHEN a IS NOT NULL THEN a WHEN b IS NOT NULL THEN b ... END
6884 * - thomas 1998-11-09
6886 * NULLIF and COALESCE have become first class nodes to
6887 * prevent double evaluation of arguments.
6888 * - Kris Jurka 2003-02-11
6890 case_expr: CASE case_arg when_clause_list case_default END_P
6892 CaseExpr *c = makeNode(CaseExpr);
6893 c->arg = (Expr *) $2;
6895 c->defresult = (Expr *) $4;
6898 | NULLIF '(' a_expr ',' a_expr ')'
6900 $$ = (Node *) makeSimpleA_Expr(AEXPR_NULLIF, "=", $3, $5);
6902 | COALESCE '(' expr_list ')'
6904 CoalesceExpr *c = makeNode(CoalesceExpr);
6911 /* There must be at least one */
6912 when_clause { $$ = makeList1($1); }
6913 | when_clause_list when_clause { $$ = lappend($1, $2); }
6917 WHEN a_expr THEN a_expr
6919 CaseWhen *w = makeNode(CaseWhen);
6920 w->expr = (Expr *) $2;
6921 w->result = (Expr *) $4;
6927 ELSE a_expr { $$ = $2; }
6928 | /*EMPTY*/ { $$ = NULL; }
6931 case_arg: a_expr { $$ = $1; }
6932 | /*EMPTY*/ { $$ = NULL; }
6936 * columnref starts with relation_name not ColId, so that OLD and NEW
6937 * references can be accepted. Note that when there are more than two
6938 * dotted names, the first name is not actually a relation name...
6940 columnref: relation_name opt_indirection
6942 $$ = makeNode(ColumnRef);
6943 $$->fields = makeList1(makeString($1));
6944 $$->indirection = $2;
6946 | dotted_name opt_indirection
6948 $$ = makeNode(ColumnRef);
6950 $$->indirection = $2;
6956 { $$ = lcons(makeString($1), $2); }
6959 attrs: '.' attr_name
6960 { $$ = makeList1(makeString($2)); }
6962 { $$ = makeList1(makeString("*")); }
6963 | '.' attr_name attrs
6964 { $$ = lcons(makeString($2), $3); }
6968 /*****************************************************************************
6972 *****************************************************************************/
6974 /* Target lists as found in SELECT ... and INSERT VALUES ( ... ) */
6977 target_el { $$ = makeList1($1); }
6978 | target_list ',' target_el { $$ = lappend($1, $3); }
6981 /* AS is not optional because shift/red conflict with unary ops */
6982 target_el: a_expr AS ColLabel
6984 $$ = makeNode(ResTarget);
6986 $$->indirection = NIL;
6987 $$->val = (Node *)$1;
6991 $$ = makeNode(ResTarget);
6993 $$->indirection = NIL;
6994 $$->val = (Node *)$1;
6998 ColumnRef *n = makeNode(ColumnRef);
6999 n->fields = makeList1(makeString("*"));
7000 n->indirection = NIL;
7001 $$ = makeNode(ResTarget);
7003 $$->indirection = NIL;
7004 $$->val = (Node *)n;
7008 /* Target list as found in UPDATE table SET ...
7009 | '(' row_ ')' = '(' row_ ')'
7015 update_target_el { $$ = makeList1($1); }
7016 | update_target_list ',' update_target_el { $$ = lappend($1,$3); }
7020 ColId opt_indirection '=' a_expr
7022 $$ = makeNode(ResTarget);
7024 $$->indirection = $2;
7025 $$->val = (Node *) $4;
7027 | ColId opt_indirection '=' DEFAULT
7029 $$ = makeNode(ResTarget);
7031 $$->indirection = $2;
7032 $$->val = (Node *) makeNode(SetToDefault);
7038 insert_target_el { $$ = makeList1($1); }
7039 | insert_target_list ',' insert_target_el { $$ = lappend($1, $3); }
7043 target_el { $$ = $1; }
7046 $$ = makeNode(ResTarget);
7048 $$->indirection = NIL;
7049 $$->val = (Node *) makeNode(SetToDefault);
7054 /*****************************************************************************
7056 * Names and constants
7058 *****************************************************************************/
7061 SpecialRuleRelation { $$ = $1; }
7062 | ColId { $$ = $1; }
7065 qualified_name_list:
7066 qualified_name { $$ = makeList1($1); }
7067 | qualified_name_list ',' qualified_name { $$ = lappend($1, $3); }
7073 $$ = makeNode(RangeVar);
7074 $$->catalogname = NULL;
7075 $$->schemaname = NULL;
7080 $$ = makeNode(RangeVar);
7084 $$->catalogname = NULL;
7085 $$->schemaname = strVal(lfirst($1));
7086 $$->relname = strVal(lsecond($1));
7089 $$->catalogname = strVal(lfirst($1));
7090 $$->schemaname = strVal(lsecond($1));
7091 $$->relname = strVal(lthird($1));
7095 (errcode(ERRCODE_SYNTAX_ERROR),
7096 errmsg("improper qualified name (too many dotted names): %s",
7097 NameListToString($1))));
7104 { $$ = makeList1(makeString($1)); }
7105 | name_list ',' name
7106 { $$ = lappend($1, makeString($3)); }
7110 name: ColId { $$ = $1; };
7118 attr_name: ColId { $$ = $1; };
7120 index_name: ColId { $$ = $1; };
7122 file_name: Sconst { $$ = $1; };
7124 func_name: function_name
7125 { $$ = makeList1(makeString($1)); }
7126 | dotted_name { $$ = $1; }
7135 A_Const *n = makeNode(A_Const);
7136 n->val.type = T_Integer;
7137 n->val.val.ival = $1;
7142 A_Const *n = makeNode(A_Const);
7143 n->val.type = T_Float;
7144 n->val.val.str = $1;
7149 A_Const *n = makeNode(A_Const);
7150 n->val.type = T_String;
7151 n->val.val.str = $1;
7156 A_Const *n = makeNode(A_Const);
7157 n->val.type = T_BitString;
7158 n->val.val.str = $1;
7163 /* This is a bit constant per SQL99:
7164 * Without Feature F511, "BIT data type",
7165 * a <general literal> shall not be a
7166 * <bit string literal> or a <hex string literal>.
7168 A_Const *n = makeNode(A_Const);
7169 n->val.type = T_BitString;
7170 n->val.val.str = $1;
7173 | ConstTypename Sconst
7175 A_Const *n = makeNode(A_Const);
7177 n->val.type = T_String;
7178 n->val.val.str = $2;
7181 | ConstInterval Sconst opt_interval
7183 A_Const *n = makeNode(A_Const);
7185 n->val.type = T_String;
7186 n->val.val.str = $2;
7187 /* precision is not specified, but fields may be... */
7188 if ($3 != INTERVAL_FULL_RANGE)
7189 n->typename->typmod = INTERVAL_TYPMOD(INTERVAL_FULL_PRECISION, $3);
7192 | ConstInterval '(' Iconst ')' Sconst opt_interval
7194 A_Const *n = makeNode(A_Const);
7196 n->val.type = T_String;
7197 n->val.val.str = $5;
7198 /* precision specified, and fields may be... */
7201 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
7202 errmsg("INTERVAL(%d) precision must not be negative",
7204 if ($3 > MAX_INTERVAL_PRECISION)
7207 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
7208 errmsg("INTERVAL(%d) precision reduced to maximum allowed, %d",
7209 $3, MAX_INTERVAL_PRECISION)));
7210 $3 = MAX_INTERVAL_PRECISION;
7212 n->typename->typmod = INTERVAL_TYPMOD($3, $6);
7215 | PARAM opt_indirection
7217 ParamRef *n = makeNode(ParamRef);
7220 n->indirection = $2;
7225 $$ = (Node *)makeBoolConst(TRUE);
7229 $$ = (Node *)makeBoolConst(FALSE);
7233 A_Const *n = makeNode(A_Const);
7234 n->val.type = T_Null;
7239 Iconst: ICONST { $$ = $1; };
7240 Sconst: SCONST { $$ = $1; };
7241 UserId: ColId { $$ = $1; };
7244 * Name classification hierarchy.
7246 * IDENT is the lexeme returned by the lexer for identifiers that match
7247 * no known keyword. In most cases, we can accept certain keywords as
7248 * names, not only IDENTs. We prefer to accept as many such keywords
7249 * as possible to minimize the impact of "reserved words" on programmers.
7250 * So, we divide names into several possible classes. The classification
7251 * is chosen in part to make keywords acceptable as names wherever possible.
7254 /* Column identifier --- names that can be column, table, etc names.
7256 ColId: IDENT { $$ = $1; }
7257 | unreserved_keyword { $$ = pstrdup($1); }
7258 | col_name_keyword { $$ = pstrdup($1); }
7261 /* Type identifier --- names that can be type names.
7263 type_name: IDENT { $$ = $1; }
7264 | unreserved_keyword { $$ = pstrdup($1); }
7267 /* Function identifier --- names that can be function names.
7271 | unreserved_keyword { $$ = pstrdup($1); }
7272 | func_name_keyword { $$ = pstrdup($1); }
7275 /* Column label --- allowed labels in "AS" clauses.
7276 * This presently includes *all* Postgres keywords.
7278 ColLabel: IDENT { $$ = $1; }
7279 | unreserved_keyword { $$ = pstrdup($1); }
7280 | col_name_keyword { $$ = pstrdup($1); }
7281 | func_name_keyword { $$ = pstrdup($1); }
7282 | reserved_keyword { $$ = pstrdup($1); }
7287 * Keyword classification lists. Generally, every keyword present in
7288 * the Postgres grammar should appear in exactly one of these lists.
7290 * Put a new keyword into the first list that it can go into without causing
7291 * shift or reduce conflicts. The earlier lists define "less reserved"
7292 * categories of keywords.
7295 /* "Unreserved" keywords --- available for use as any kind of name.
7484 /* Column identifier --- keywords that can be column, table, etc names.
7486 * Many of these keywords will in fact be recognized as type or function
7487 * names too; but they have special productions for the purpose, and so
7488 * can't be treated as "generic" type or function names.
7490 * The type names appearing here are not usable as function names
7491 * because they can be followed by '(' in typename productions, which
7492 * looks too much like a function call for an LR(1) parser.
7528 /* Function identifier --- keywords that can be function names.
7530 * Most of these are keywords that are used as operators in expressions;
7531 * in general such keywords can't be column names because they would be
7532 * ambiguous with variables, but they are unambiguous as function identifiers.
7534 * Do not include POSITION, SUBSTRING, etc here since they have explicit
7535 * productions in a_expr to support the goofy SQL9x argument syntax.
7536 * - thomas 2000-11-28
7562 /* Reserved keyword --- these keywords are usable only as a ColLabel.
7564 * Keywords appear here if they could not be distinguished from variable,
7565 * type, or function names in some contexts. Don't put things here unless
7641 SpecialRuleRelation:
7648 (errcode(ERRCODE_SYNTAX_ERROR),
7649 errmsg("OLD used in non-rule query")));
7657 (errcode(ERRCODE_SYNTAX_ERROR),
7658 errmsg("NEW used in non-rule query")));
7665 makeTypeCast(Node *arg, TypeName *typename)
7668 * Simply generate a TypeCast node.
7670 * Earlier we would determine whether an A_Const would
7671 * be acceptable, however Domains require coerce_type()
7672 * to process them -- applying constraints as required.
7674 TypeCast *n = makeNode(TypeCast);
7676 n->typename = typename;
7681 makeStringConst(char *str, TypeName *typename)
7683 A_Const *n = makeNode(A_Const);
7685 n->val.type = T_String;
7686 n->val.val.str = str;
7687 n->typename = typename;
7693 makeIntConst(int val)
7695 A_Const *n = makeNode(A_Const);
7696 n->val.type = T_Integer;
7697 n->val.val.ival = val;
7698 n->typename = SystemTypeName("int4");
7704 makeFloatConst(char *str)
7706 A_Const *n = makeNode(A_Const);
7708 n->val.type = T_Float;
7709 n->val.val.str = str;
7710 n->typename = SystemTypeName("float8");
7716 makeAConst(Value *v)
7723 n = makeFloatConst(v->val.str);
7727 n = makeIntConst(v->val.ival);
7732 n = makeStringConst(v->val.str, NULL);
7740 * Create a DefElem node and set contents.
7741 * Could be moved to nodes/makefuncs.c if this is useful elsewhere.
7744 makeDefElem(char *name, Node *arg)
7746 DefElem *f = makeNode(DefElem);
7753 * Create an A_Const node and initialize to a boolean constant.
7756 makeBoolConst(bool state)
7758 A_Const *n = makeNode(A_Const);
7759 n->val.type = T_String;
7760 n->val.val.str = (state? "t": "f");
7761 n->typename = SystemTypeName("bool");
7766 * Generate separate operator nodes for a single row descriptor expression.
7767 * Perhaps this should go deeper in the parser someday...
7768 * - thomas 1997-12-22
7771 makeRowExpr(List *opr, List *largs, List *rargs)
7777 if (length(largs) != length(rargs))
7779 (errcode(ERRCODE_SYNTAX_ERROR),
7780 errmsg("unequal number of entries in row expression")));
7782 if (lnext(largs) != NIL)
7783 expr = makeRowExpr(opr, lnext(largs), lnext(rargs));
7785 larg = lfirst(largs);
7786 rarg = lfirst(rargs);
7788 oprname = strVal(llast(opr));
7790 if ((strcmp(oprname, "=") == 0) ||
7791 (strcmp(oprname, "<") == 0) ||
7792 (strcmp(oprname, "<=") == 0) ||
7793 (strcmp(oprname, ">") == 0) ||
7794 (strcmp(oprname, ">=") == 0))
7797 expr = (Node *) makeA_Expr(AEXPR_OP, opr, larg, rarg);
7799 expr = (Node *) makeA_Expr(AEXPR_AND, NIL, expr,
7800 (Node *) makeA_Expr(AEXPR_OP, opr,
7803 else if (strcmp(oprname, "<>") == 0)
7806 expr = (Node *) makeA_Expr(AEXPR_OP, opr, larg, rarg);
7808 expr = (Node *) makeA_Expr(AEXPR_OR, NIL, expr,
7809 (Node *) makeA_Expr(AEXPR_OP, opr,
7815 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
7816 errmsg("operator %s is not supported for row expressions",
7823 /* makeDistinctExpr()
7824 * Generate separate operator nodes for a single row descriptor expression.
7825 * Same comments as for makeRowExpr().
7828 makeDistinctExpr(List *largs, List *rargs)
7833 if (length(largs) != length(rargs))
7835 (errcode(ERRCODE_SYNTAX_ERROR),
7836 errmsg("unequal number of entries in row expression")));
7838 if (lnext(largs) != NIL)
7839 expr = makeDistinctExpr(lnext(largs), lnext(rargs));
7841 larg = lfirst(largs);
7842 rarg = lfirst(rargs);
7845 expr = (Node *) makeSimpleA_Expr(AEXPR_DISTINCT, "=", larg, rarg);
7847 expr = (Node *) makeA_Expr(AEXPR_OR, NIL, expr,
7848 (Node *) makeSimpleA_Expr(AEXPR_DISTINCT, "=",
7854 /* makeRowNullTest()
7855 * Generate separate operator nodes for a single row descriptor test.
7858 makeRowNullTest(NullTestType test, List *args)
7863 if (lnext(args) != NIL)
7864 expr = makeRowNullTest(test, lnext(args));
7866 n = makeNode(NullTest);
7867 n->arg = (Expr *) lfirst(args);
7868 n->nulltesttype = test;
7872 else if (test == IS_NOT_NULL)
7873 expr = (Node *) makeA_Expr(AEXPR_OR, NIL, expr, (Node *)n);
7875 expr = (Node *) makeA_Expr(AEXPR_AND, NIL, expr, (Node *)n);
7881 * Create and populate a FuncCall node to support the OVERLAPS operator.
7884 makeOverlaps(List *largs, List *rargs)
7886 FuncCall *n = makeNode(FuncCall);
7887 n->funcname = SystemFuncName("overlaps");
7888 if (length(largs) == 1)
7889 largs = lappend(largs, largs);
7890 else if (length(largs) != 2)
7892 (errcode(ERRCODE_SYNTAX_ERROR),
7893 errmsg("wrong number of parameters on left side of OVERLAPS expression")));
7894 if (length(rargs) == 1)
7895 rargs = lappend(rargs, rargs);
7896 else if (length(rargs) != 2)
7898 (errcode(ERRCODE_SYNTAX_ERROR),
7899 errmsg("wrong number of parameters on right side of OVERLAPS expression")));
7900 n->args = nconc(largs, rargs);
7901 n->agg_star = FALSE;
7902 n->agg_distinct = FALSE;
7906 /* findLeftmostSelect()
7907 * Find the leftmost component SelectStmt in a set-operation parsetree.
7910 findLeftmostSelect(SelectStmt *node)
7912 while (node && node->op != SETOP_NONE)
7914 Assert(node && IsA(node, SelectStmt) && node->larg == NULL);
7918 /* insertSelectOptions()
7919 * Insert ORDER BY, etc into an already-constructed SelectStmt.
7921 * This routine is just to avoid duplicating code in SelectStmt productions.
7924 insertSelectOptions(SelectStmt *stmt,
7925 List *sortClause, List *forUpdate,
7926 Node *limitOffset, Node *limitCount)
7929 * Tests here are to reject constructs like
7930 * (SELECT foo ORDER BY bar) ORDER BY baz
7934 if (stmt->sortClause)
7936 (errcode(ERRCODE_SYNTAX_ERROR),
7937 errmsg("multiple ORDER BY clauses not allowed")));
7938 stmt->sortClause = sortClause;
7942 if (stmt->forUpdate)
7944 (errcode(ERRCODE_SYNTAX_ERROR),
7945 errmsg("multiple FOR UPDATE clauses not allowed")));
7946 stmt->forUpdate = forUpdate;
7950 if (stmt->limitOffset)
7952 (errcode(ERRCODE_SYNTAX_ERROR),
7953 errmsg("multiple OFFSET clauses not allowed")));
7954 stmt->limitOffset = limitOffset;
7958 if (stmt->limitCount)
7960 (errcode(ERRCODE_SYNTAX_ERROR),
7961 errmsg("multiple LIMIT clauses not allowed")));
7962 stmt->limitCount = limitCount;
7967 makeSetOp(SetOperation op, bool all, Node *larg, Node *rarg)
7969 SelectStmt *n = makeNode(SelectStmt);
7973 n->larg = (SelectStmt *) larg;
7974 n->rarg = (SelectStmt *) rarg;
7979 * Build a properly-qualified reference to a built-in function.
7982 SystemFuncName(char *name)
7984 return makeList2(makeString("pg_catalog"), makeString(name));
7988 * Build a properly-qualified reference to a built-in type.
7990 * typmod is defaulted, but may be changed afterwards by caller.
7993 SystemTypeName(char *name)
7995 TypeName *n = makeNode(TypeName);
7997 n->names = makeList2(makeString("pg_catalog"), makeString(name));
8003 * Initialize to parse one query string
8008 QueryIsRule = FALSE;
8011 /* exprIsNullConstant()
8012 * Test whether an a_expr is a plain NULL constant or not.
8015 exprIsNullConstant(Node *arg)
8017 if (arg && IsA(arg, A_Const))
8019 A_Const *con = (A_Const *) arg;
8021 if (con->val.type == T_Null &&
8022 con->typename == NULL)
8029 * Handle negation of a numeric constant.
8031 * Formerly, we did this here because the optimizer couldn't cope with
8032 * indexquals that looked like "var = -4" --- it wants "var = const"
8033 * and a unary minus operator applied to a constant didn't qualify.
8034 * As of Postgres 7.0, that problem doesn't exist anymore because there
8035 * is a constant-subexpression simplifier in the optimizer. However,
8036 * there's still a good reason for doing this here, which is that we can
8037 * postpone committing to a particular internal representation for simple
8038 * negative constants. It's better to leave "-123.456" in string form
8039 * until we know what the desired type is.
8044 if (IsA(n, A_Const))
8046 A_Const *con = (A_Const *)n;
8048 if (con->val.type == T_Integer)
8050 con->val.val.ival = -con->val.val.ival;
8053 if (con->val.type == T_Float)
8055 doNegateFloat(&con->val);
8060 return (Node *) makeSimpleA_Expr(AEXPR_OP, "-", NULL, n);
8064 doNegateFloat(Value *v)
8066 char *oldval = v->val.str;
8068 Assert(IsA(v, Float));
8072 v->val.str = oldval+1; /* just strip the '-' */
8075 char *newval = (char *) palloc(strlen(oldval) + 2);
8078 strcpy(newval+1, oldval);
8079 v->val.str = newval;