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 * $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.447 2004/03/09 05:05:41 momjian 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 List *extractArgTypes(List *parameters);
90 static SelectStmt *findLeftmostSelect(SelectStmt *node);
91 static void insertSelectOptions(SelectStmt *stmt,
92 List *sortClause, List *forUpdate,
93 Node *limitOffset, Node *limitCount);
94 static Node *makeSetOp(SetOperation op, bool all, Node *larg, Node *rarg);
95 static Node *doNegate(Node *n);
96 static void doNegateFloat(Value *v);
109 DropBehavior dbehavior;
110 OnCommitAction oncommit;
111 ContainsOids withoids;
116 ColumnRef *columnref;
120 FunctionParameter *fun_param;
129 PrivTarget *privtarget;
132 VariableSetStmt *vsetstmt;
135 %type <node> stmt schema_stmt
136 AlterDatabaseSetStmt AlterDomainStmt AlterGroupStmt
137 AlterSeqStmt AlterTableStmt AlterUserStmt AlterUserSetStmt
138 AnalyzeStmt ClosePortalStmt ClusterStmt CommentStmt
139 ConstraintsSetStmt CopyStmt CreateAsStmt CreateCastStmt
140 CreateDomainStmt CreateGroupStmt CreateOpClassStmt CreatePLangStmt
141 CreateSchemaStmt CreateSeqStmt CreateStmt
142 CreateAssertStmt CreateTrigStmt CreateUserStmt
143 CreatedbStmt DeclareCursorStmt DefineStmt DeleteStmt
144 DropGroupStmt DropOpClassStmt DropPLangStmt DropStmt
145 DropAssertStmt DropTrigStmt DropRuleStmt DropCastStmt
146 DropUserStmt DropdbStmt ExplainStmt FetchStmt
147 GrantStmt IndexStmt InsertStmt ListenStmt LoadStmt
148 LockStmt NotifyStmt ExplainableStmt PreparableStmt
149 CreateFunctionStmt ReindexStmt RemoveAggrStmt
150 RemoveFuncStmt RemoveOperStmt RenameStmt RevokeStmt
151 RuleActionStmt RuleActionStmtOrEmpty RuleStmt
152 SelectStmt TransactionStmt TruncateStmt
153 UnlistenStmt UpdateStmt VacuumStmt
154 VariableResetStmt VariableSetStmt VariableShowStmt
155 ViewStmt CheckPointStmt CreateConversionStmt
156 DeallocateStmt PrepareStmt ExecuteStmt
158 %type <node> select_no_parens select_with_parens select_clause
161 %type <node> alter_column_default opclass_item
162 %type <ival> add_drop
164 %type <dbehavior> opt_drop_behavior
166 %type <list> createdb_opt_list copy_opt_list
167 %type <defelt> createdb_opt_item copy_opt_item
169 %type <ival> opt_lock lock_type cast_context
170 %type <boolean> opt_force opt_or_replace transaction_access_mode
171 opt_grant_grant_option opt_revoke_grant_option
173 %type <boolean> like_including_defaults
175 %type <list> user_list
177 %type <list> OptGroupList
178 %type <defelt> OptGroupElem
180 %type <list> OptUserList
181 %type <defelt> OptUserElem
183 %type <str> OptSchemaName
184 %type <list> OptSchemaEltList
186 %type <boolean> TriggerActionTime TriggerForSpec opt_trusted
187 %type <str> opt_lancompiler
189 %type <str> TriggerEvents
190 %type <value> TriggerFuncArg
192 %type <str> relation_name copy_file_name
193 database_name access_method_clause access_method attr_name
194 index_name name function_name file_name
196 %type <list> func_name handler_name qual_Op qual_all_Op
197 opt_class opt_validator
199 %type <range> qualified_name OptConstrFromTable
201 %type <str> all_Op MathOp opt_name SpecialRuleRelation
203 %type <str> iso_level opt_encoding
205 %type <list> grantee_list
206 %type <ival> privilege
207 %type <list> privileges privilege_list
208 %type <privtarget> privilege_target
209 %type <node> function_with_argtypes
210 %type <list> function_with_argtypes_list
211 %type <chr> TriggerOneEvent
213 %type <list> stmtblock stmtmulti
214 OptTableElementList TableElementList OptInherit definition
215 opt_distinct opt_definition func_args
216 func_args_list func_as createfunc_opt_list
217 oper_argtypes RuleActionList RuleActionMulti
218 opt_column_list columnList opt_name_list
219 sort_clause opt_sort_clause sortby_list index_params
220 name_list from_clause from_list opt_array_bounds
221 qualified_name_list any_name any_name_list
222 any_operator expr_list dotted_name attrs
223 target_list update_target_list insert_column_list
224 insert_target_list def_list opt_indirection
225 group_clause TriggerFuncArgs select_limit
226 opt_select_limit opclass_item_list transaction_mode_list
227 transaction_mode_list_or_empty
229 prep_type_clause prep_type_list
232 %type <range> into_clause OptTempTableName
234 %type <defelt> createfunc_opt_item
235 %type <fun_param> func_arg
236 %type <typnam> func_return func_type aggr_argtype
238 %type <boolean> arg_class TriggerForType OptTemp
239 %type <oncommit> OnCommitOption
240 %type <withoids> OptWithOids WithOidsAs
242 %type <list> for_update_clause opt_for_update_clause update_list
243 %type <boolean> opt_all
245 %type <node> join_outer join_qual
246 %type <jtype> join_type
248 %type <list> extract_list overlay_list position_list
249 %type <list> substr_list trim_list
250 %type <ival> opt_interval
251 %type <node> overlay_placing substr_from substr_for
253 %type <boolean> opt_instead opt_analyze
254 %type <boolean> index_opt_unique opt_verbose opt_full
255 %type <boolean> opt_freeze opt_default opt_recheck
256 %type <defelt> opt_binary opt_oids copy_delimiter
258 %type <boolean> copy_from opt_hold
260 %type <ival> fetch_count opt_column event cursor_options
261 %type <objtype> reindex_type drop_type comment_type
263 %type <node> fetch_direction select_limit_value select_offset_value
265 %type <list> OptSeqList
266 %type <defelt> OptSeqElem
268 %type <istmt> insert_rest
270 %type <vsetstmt> set_rest
272 %type <node> TableElement ConstraintElem TableFuncElement
273 %type <node> columnDef
274 %type <defelt> def_elem
275 %type <node> def_arg columnElem where_clause insert_column_item
276 a_expr b_expr c_expr r_expr AexprConst
277 in_expr having_clause func_table array_expr
278 %type <list> row row_descriptor type_list array_expr_list
279 %type <node> case_expr case_arg when_clause case_default
280 %type <list> when_clause_list
281 %type <ival> sub_type
282 %type <list> OptCreateAs CreateAsList
283 %type <node> CreateAsElement
284 %type <value> NumericOnly FloatOnly IntegerOnly
285 %type <columnref> columnref
286 %type <alias> alias_clause
287 %type <sortby> sortby
288 %type <ielem> index_elem
289 %type <node> table_ref
290 %type <jexpr> joined_table
291 %type <range> relation_expr
292 %type <target> target_el insert_target_el update_target_el
294 %type <typnam> Typename SimpleTypename ConstTypename
295 GenericType Numeric opt_float
296 Character ConstCharacter
297 CharacterWithLength CharacterWithoutLength
298 ConstDatetime ConstInterval
299 Bit ConstBit BitWithLength BitWithoutLength
300 %type <str> character
301 %type <str> extract_arg
302 %type <str> opt_charset
303 %type <ival> opt_numeric opt_decimal
304 %type <boolean> opt_varying opt_timezone
307 %type <str> Sconst comment_text
308 %type <str> UserId opt_boolean ColId_or_Sconst
309 %type <list> var_list var_list_or_default
310 %type <str> ColId ColLabel type_name param_name
311 %type <node> var_value zone_value
313 %type <keyword> unreserved_keyword func_name_keyword
314 %type <keyword> col_name_keyword reserved_keyword
316 %type <node> TableConstraint TableLikeClause
317 %type <list> ColQualList
318 %type <node> ColConstraint ColConstraintElem ConstraintAttr
319 %type <ival> key_actions key_delete key_match key_update key_action
320 %type <ival> ConstraintAttributeSpec ConstraintDeferrabilitySpec
323 %type <list> constraints_set_list
324 %type <boolean> constraints_set_mode
328 * If you make any token changes, update the keyword table in
329 * parser/keywords.c and add new keywords to the appropriate one of
330 * the reserved-or-not-so-reserved keyword lists, below.
333 /* ordinary key words in alphabetical order */
334 %token <keyword> ABORT_P ABSOLUTE_P ACCESS ACTION ADD AFTER
335 AGGREGATE ALL ALSO ALTER ANALYSE ANALYZE AND ANY ARRAY AS ASC
336 ASSERTION ASSIGNMENT AT AUTHORIZATION
338 BACKWARD BEFORE BEGIN_P BETWEEN BIGINT BINARY BIT
341 CACHE CALLED CASCADE CASE CAST CHAIN CHAR_P
342 CHARACTER CHARACTERISTICS CHECK CHECKPOINT CLASS CLOSE
343 CLUSTER COALESCE COLLATE COLUMN COMMENT COMMIT
344 COMMITTED CONSTRAINT CONSTRAINTS CONVERSION_P CONVERT COPY CREATE CREATEDB
345 CREATEUSER CROSS CURRENT_DATE CURRENT_TIME
346 CURRENT_TIMESTAMP CURRENT_USER CURSOR CYCLE
348 DATABASE DAY_P DEALLOCATE DEC DECIMAL_P DECLARE DEFAULT DEFAULTS
349 DEFERRABLE DEFERRED DEFINER DELETE_P DELIMITER DELIMITERS
350 DESC DISTINCT DO DOMAIN_P DOUBLE_P DROP
352 EACH ELSE ENCODING ENCRYPTED END_P ESCAPE EXCEPT EXCLUDING
353 EXCLUSIVE EXECUTE EXISTS EXPLAIN EXTERNAL EXTRACT
355 FALSE_P FETCH FIRST_P FLOAT_P FOR FORCE FOREIGN FORWARD
356 FREEZE FROM FULL FUNCTION
360 HANDLER HAVING HOLD HOUR_P
362 ILIKE IMMEDIATE IMMUTABLE IMPLICIT_P IN_P INCLUDING INCREMENT
363 INDEX INHERITS INITIALLY INNER_P INOUT INPUT_P
364 INSENSITIVE INSERT INSTEAD INT_P INTEGER INTERSECT
365 INTERVAL INTO INVOKER IS ISNULL ISOLATION
371 LANCOMPILER LANGUAGE LARGE_P LAST_P LEADING LEFT LEVEL LIKE LIMIT
372 LISTEN LOAD LOCAL LOCALTIME LOCALTIMESTAMP LOCATION
375 MATCH MAXVALUE MINUTE_P MINVALUE MODE MONTH_P MOVE
377 NAMES NATIONAL NATURAL NCHAR NEW NEXT NO NOCREATEDB
378 NOCREATEUSER NONE NOT NOTHING NOTIFY NOTNULL NULL_P
381 OBJECT_P OF OFF OFFSET OIDS OLD ON ONLY OPERATOR OPTION OR
382 ORDER OUT_P OUTER_P OVERLAPS OVERLAY OWNER
384 PARTIAL PASSWORD PATH_P PENDANT PLACING POSITION
385 PRECISION PRESERVE PREPARE PRIMARY
386 PRIOR PRIVILEGES PROCEDURAL PROCEDURE
388 READ REAL RECHECK REFERENCES REINDEX RELATIVE_P RENAME REPEATABLE REPLACE
389 RESET RESTART RESTRICT RETURNS REVOKE RIGHT ROLLBACK ROW ROWS
392 SCHEMA SCROLL SECOND_P SECURITY SELECT SEQUENCE
393 SERIALIZABLE SESSION SESSION_USER SET SETOF SHARE
394 SHOW SIMILAR SIMPLE SMALLINT SOME STABLE START STATEMENT
395 STATISTICS STDIN STDOUT STORAGE STRICT_P SUBSTRING SYSID
397 TABLE TEMP TEMPLATE TEMPORARY THEN TIME TIMESTAMP
398 TO TOAST TRAILING TRANSACTION TREAT TRIGGER TRIM TRUE_P
399 TRUNCATE TRUSTED TYPE_P
401 UNCOMMITTED UNENCRYPTED UNION UNIQUE UNKNOWN UNLISTEN UNTIL
402 UPDATE USAGE USER USING
404 VACUUM VALID VALIDATOR VALUES VARCHAR VARYING
405 VERBOSE VERSION VIEW VOLATILE
407 WHEN WHERE WITH WITHOUT WORK WRITE
413 /* The grammar thinks these are keywords, but they are not in the keywords.c
414 * list and so can never be entered directly. The filter in parser.c
415 * creates these tokens when required.
419 /* Special keywords, not in the query language - see the "lex" file */
420 %token <str> IDENT FCONST SCONST BCONST XCONST Op
421 %token <ival> ICONST PARAM
423 /* precedence: lowest to highest */
431 %nonassoc LIKE ILIKE SIMILAR
436 %left POSTFIXOP /* dummy for postfix Op rules */
437 %left Op OPERATOR /* multi-character ops and user-defined operators */
440 %nonassoc IS NULL_P TRUE_P FALSE_P UNKNOWN /* sets precedence for IS NULL, etc */
444 /* Unary Operators */
445 %left AT ZONE /* sets precedence for AT TIME ZONE */
452 * These might seem to be low-precedence, but actually they are not part
453 * of the arithmetic hierarchy at all in their use as JOIN operators.
454 * We make them high-precedence to support their use as function names.
455 * They wouldn't be given a precedence at all, were it not that we need
456 * left-associativity among the JOIN rules themselves.
458 %left JOIN UNIONJOIN CROSS LEFT FULL RIGHT INNER_P NATURAL
462 * Handle comment-only lines, and ;; SELECT * FROM pg_class ;;;
463 * psql already handles such cases, but other interfaces don't.
466 stmtblock: stmtmulti { parsetree = $1; }
469 /* the thrashing around here is to discard "empty" statements... */
470 stmtmulti: stmtmulti ';' stmt
472 $$ = lappend($1, $3);
502 | CreateConversionStmt
560 /*****************************************************************************
562 * Create a new Postgres DBMS user
565 *****************************************************************************/
568 CREATE USER UserId opt_with OptUserList
570 CreateUserStmt *n = makeNode(CreateUserStmt);
582 /*****************************************************************************
584 * Alter a postgresql DBMS user
587 *****************************************************************************/
590 ALTER USER UserId opt_with OptUserList
592 AlterUserStmt *n = makeNode(AlterUserStmt);
601 ALTER USER UserId SET set_rest
603 AlterUserSetStmt *n = makeNode(AlterUserSetStmt);
605 n->variable = $5->name;
609 | ALTER USER UserId VariableResetStmt
611 AlterUserSetStmt *n = makeNode(AlterUserSetStmt);
613 n->variable = ((VariableResetStmt *)$4)->name;
620 /*****************************************************************************
622 * Drop a postgresql DBMS user
624 * XXX Ideally this would have CASCADE/RESTRICT options, but since a user
625 * might own objects in multiple databases, there is presently no way to
626 * implement either cascading or restricting. Caveat DBA.
627 *****************************************************************************/
632 DropUserStmt *n = makeNode(DropUserStmt);
639 * Options for CREATE USER and ALTER USER
642 OptUserList OptUserElem { $$ = lappend($1, $2); }
643 | /* EMPTY */ { $$ = NIL; }
649 $$ = makeDefElem("password", (Node *)makeString($2));
651 | ENCRYPTED PASSWORD Sconst
653 $$ = makeDefElem("encryptedPassword", (Node *)makeString($3));
655 | UNENCRYPTED PASSWORD Sconst
657 $$ = makeDefElem("unencryptedPassword", (Node *)makeString($3));
661 $$ = makeDefElem("sysid", (Node *)makeInteger($2));
665 $$ = makeDefElem("createdb", (Node *)makeInteger(TRUE));
669 $$ = makeDefElem("createdb", (Node *)makeInteger(FALSE));
673 $$ = makeDefElem("createuser", (Node *)makeInteger(TRUE));
677 $$ = makeDefElem("createuser", (Node *)makeInteger(FALSE));
679 | IN_P GROUP_P user_list
681 $$ = makeDefElem("groupElts", (Node *)$3);
685 $$ = makeDefElem("validUntil", (Node *)makeString($3));
689 user_list: user_list ',' UserId { $$ = lappend($1, makeString($3)); }
690 | UserId { $$ = makeList1(makeString($1)); }
695 /*****************************************************************************
697 * Create a postgresql group
700 *****************************************************************************/
703 CREATE GROUP_P UserId opt_with OptGroupList
705 CreateGroupStmt *n = makeNode(CreateGroupStmt);
713 * Options for CREATE GROUP
716 OptGroupList OptGroupElem { $$ = lappend($1, $2); }
717 | /* EMPTY */ { $$ = NIL; }
723 $$ = makeDefElem("userElts", (Node *)$2);
727 $$ = makeDefElem("sysid", (Node *)makeInteger($2));
732 /*****************************************************************************
734 * Alter a postgresql group
737 *****************************************************************************/
740 ALTER GROUP_P UserId add_drop USER user_list
742 AlterGroupStmt *n = makeNode(AlterGroupStmt);
750 add_drop: ADD { $$ = +1; }
755 /*****************************************************************************
757 * Drop a postgresql group
759 * XXX see above notes about cascading DROP USER; groups have same problem.
760 *****************************************************************************/
765 DropGroupStmt *n = makeNode(DropGroupStmt);
772 /*****************************************************************************
774 * Manipulate a schema
776 *****************************************************************************/
779 CREATE SCHEMA OptSchemaName AUTHORIZATION UserId OptSchemaEltList
781 CreateSchemaStmt *n = makeNode(CreateSchemaStmt);
782 /* One can omit the schema name or the authorization id. */
791 | CREATE SCHEMA ColId OptSchemaEltList
793 CreateSchemaStmt *n = makeNode(CreateSchemaStmt);
794 /* ...but not both */
804 | /* EMPTY */ { $$ = NULL; }
808 OptSchemaEltList schema_stmt { $$ = lappend($1, $2); }
809 | /* EMPTY */ { $$ = NIL; }
813 * schema_stmt are the ones that can show up inside a CREATE SCHEMA
814 * statement (in addition to by themselves).
826 /*****************************************************************************
828 * Set PG internal variable
829 * SET name TO 'var_value'
830 * Include SQL92 syntax (thomas 1997-10-22):
831 * SET TIME ZONE 'var_value'
833 *****************************************************************************/
838 VariableSetStmt *n = $2;
844 VariableSetStmt *n = $3;
848 | SET SESSION set_rest
850 VariableSetStmt *n = $3;
856 set_rest: ColId TO var_list_or_default
858 VariableSetStmt *n = makeNode(VariableSetStmt);
863 | ColId '=' var_list_or_default
865 VariableSetStmt *n = makeNode(VariableSetStmt);
870 | TIME ZONE zone_value
872 VariableSetStmt *n = makeNode(VariableSetStmt);
873 n->name = "timezone";
875 n->args = makeList1($3);
878 | TRANSACTION transaction_mode_list
880 VariableSetStmt *n = makeNode(VariableSetStmt);
881 n->name = "TRANSACTION";
885 | SESSION CHARACTERISTICS AS TRANSACTION transaction_mode_list
887 VariableSetStmt *n = makeNode(VariableSetStmt);
888 n->name = "SESSION CHARACTERISTICS";
894 VariableSetStmt *n = makeNode(VariableSetStmt);
895 n->name = "client_encoding";
897 n->args = makeList1(makeStringConst($2, NULL));
900 | SESSION AUTHORIZATION ColId_or_Sconst
902 VariableSetStmt *n = makeNode(VariableSetStmt);
903 n->name = "session_authorization";
904 n->args = makeList1(makeStringConst($3, NULL));
907 | SESSION AUTHORIZATION DEFAULT
909 VariableSetStmt *n = makeNode(VariableSetStmt);
910 n->name = "session_authorization";
917 var_list { $$ = $1; }
918 | DEFAULT { $$ = NIL; }
921 var_list: var_value { $$ = makeList1($1); }
922 | var_list ',' var_value { $$ = lappend($1, $3); }
925 var_value: opt_boolean
926 { $$ = makeStringConst($1, NULL); }
928 { $$ = makeStringConst($1, NULL); }
930 { $$ = makeAConst($1); }
933 iso_level: READ UNCOMMITTED { $$ = "read uncommitted"; }
934 | READ COMMITTED { $$ = "read committed"; }
935 | REPEATABLE READ { $$ = "repeatable read"; }
936 | SERIALIZABLE { $$ = "serializable"; }
940 TRUE_P { $$ = "true"; }
941 | FALSE_P { $$ = "false"; }
943 | OFF { $$ = "off"; }
946 /* Timezone values can be:
947 * - a string such as 'pst8pdt'
948 * - an identifier such as "pst8pdt"
949 * - an integer or floating point number
950 * - a time interval per SQL99
951 * ColId gives reduce/reduce errors against ConstInterval and LOCAL,
952 * so use IDENT and reject anything which is a reserved word.
957 $$ = makeStringConst($1, NULL);
961 $$ = makeStringConst($1, NULL);
963 | ConstInterval Sconst opt_interval
965 A_Const *n = (A_Const *) makeStringConst($2, $1);
966 if ($3 != INTERVAL_FULL_RANGE)
968 if (($3 & ~(INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE))) != 0)
970 (errcode(ERRCODE_SYNTAX_ERROR),
971 errmsg("time zone interval must be HOUR or HOUR TO MINUTE")));
972 n->typename->typmod = INTERVAL_TYPMOD(INTERVAL_FULL_PRECISION, $3);
976 | ConstInterval '(' Iconst ')' Sconst opt_interval
978 A_Const *n = (A_Const *) makeStringConst($5, $1);
981 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
982 errmsg("INTERVAL(%d) precision must not be negative",
984 if ($3 > MAX_INTERVAL_PRECISION)
987 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
988 errmsg("INTERVAL(%d) precision reduced to maximum allowed, %d",
989 $3, MAX_INTERVAL_PRECISION)));
990 $3 = MAX_INTERVAL_PRECISION;
993 if (($6 != INTERVAL_FULL_RANGE)
994 && (($6 & ~(INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE))) != 0))
996 (errcode(ERRCODE_SYNTAX_ERROR),
997 errmsg("time zone interval must be HOUR or HOUR TO MINUTE")));
999 n->typename->typmod = INTERVAL_TYPMOD($3, $6);
1003 | NumericOnly { $$ = makeAConst($1); }
1004 | DEFAULT { $$ = NULL; }
1005 | LOCAL { $$ = NULL; }
1010 | DEFAULT { $$ = NULL; }
1011 | /*EMPTY*/ { $$ = NULL; }
1016 | SCONST { $$ = $1; }
1023 VariableShowStmt *n = makeNode(VariableShowStmt);
1029 VariableShowStmt *n = makeNode(VariableShowStmt);
1030 n->name = "timezone";
1033 | SHOW TRANSACTION ISOLATION LEVEL
1035 VariableShowStmt *n = makeNode(VariableShowStmt);
1036 n->name = "transaction_isolation";
1039 | SHOW SESSION AUTHORIZATION
1041 VariableShowStmt *n = makeNode(VariableShowStmt);
1042 n->name = "session_authorization";
1047 VariableShowStmt *n = makeNode(VariableShowStmt);
1056 VariableResetStmt *n = makeNode(VariableResetStmt);
1062 VariableResetStmt *n = makeNode(VariableResetStmt);
1063 n->name = "timezone";
1066 | RESET TRANSACTION ISOLATION LEVEL
1068 VariableResetStmt *n = makeNode(VariableResetStmt);
1069 n->name = "transaction_isolation";
1072 | RESET SESSION AUTHORIZATION
1074 VariableResetStmt *n = makeNode(VariableResetStmt);
1075 n->name = "session_authorization";
1080 VariableResetStmt *n = makeNode(VariableResetStmt);
1088 SET CONSTRAINTS constraints_set_list constraints_set_mode
1090 ConstraintsSetStmt *n = makeNode(ConstraintsSetStmt);
1091 n->constraints = $3;
1097 constraints_set_list:
1099 | name_list { $$ = $1; }
1102 constraints_set_mode:
1103 DEFERRED { $$ = TRUE; }
1104 | IMMEDIATE { $$ = FALSE; }
1109 * Checkpoint statement
1114 CheckPointStmt *n = makeNode(CheckPointStmt);
1120 /*****************************************************************************
1122 * ALTER TABLE variations
1124 *****************************************************************************/
1127 /* ALTER TABLE <relation> ADD [COLUMN] <coldef> */
1128 ALTER TABLE relation_expr ADD opt_column columnDef
1130 AlterTableStmt *n = makeNode(AlterTableStmt);
1136 /* ALTER TABLE <relation> ALTER [COLUMN] <colname> {SET DEFAULT <expr>|DROP DEFAULT} */
1137 | ALTER TABLE relation_expr ALTER opt_column ColId alter_column_default
1139 AlterTableStmt *n = makeNode(AlterTableStmt);
1146 /* ALTER TABLE <relation> ALTER [COLUMN] <colname> DROP NOT NULL */
1147 | ALTER TABLE relation_expr ALTER opt_column ColId DROP NOT NULL_P
1149 AlterTableStmt *n = makeNode(AlterTableStmt);
1155 /* ALTER TABLE <relation> ALTER [COLUMN] <colname> SET NOT NULL */
1156 | ALTER TABLE relation_expr ALTER opt_column ColId SET NOT NULL_P
1158 AlterTableStmt *n = makeNode(AlterTableStmt);
1164 /* ALTER TABLE <relation> ALTER [COLUMN] <colname> SET STATISTICS <IntegerOnly> */
1165 | ALTER TABLE relation_expr ALTER opt_column ColId SET STATISTICS IntegerOnly
1167 AlterTableStmt *n = makeNode(AlterTableStmt);
1171 n->def = (Node *) $9;
1174 /* ALTER TABLE <relation> ALTER [COLUMN] <colname> SET STORAGE <storagemode> */
1175 | ALTER TABLE relation_expr ALTER opt_column ColId
1178 AlterTableStmt *n = makeNode(AlterTableStmt);
1182 n->def = (Node *) makeString($9);
1185 /* ALTER TABLE <relation> DROP [COLUMN] <colname> [RESTRICT|CASCADE] */
1186 | ALTER TABLE relation_expr DROP opt_column ColId opt_drop_behavior
1188 AlterTableStmt *n = makeNode(AlterTableStmt);
1195 /* ALTER TABLE <relation> ADD CONSTRAINT ... */
1196 | ALTER TABLE relation_expr ADD TableConstraint
1198 AlterTableStmt *n = makeNode(AlterTableStmt);
1204 /* ALTER TABLE <relation> DROP CONSTRAINT <name> [RESTRICT|CASCADE] */
1205 | ALTER TABLE relation_expr DROP CONSTRAINT name opt_drop_behavior
1207 AlterTableStmt *n = makeNode(AlterTableStmt);
1214 /* ALTER TABLE <relation> SET WITHOUT OIDS */
1215 | ALTER TABLE relation_expr SET WITHOUT OIDS
1217 AlterTableStmt *n = makeNode(AlterTableStmt);
1222 /* ALTER TABLE <name> CREATE TOAST TABLE */
1223 | ALTER TABLE qualified_name CREATE TOAST TABLE
1225 AlterTableStmt *n = makeNode(AlterTableStmt);
1227 $3->inhOpt = INH_NO;
1231 /* ALTER TABLE <name> OWNER TO UserId */
1232 | ALTER TABLE qualified_name OWNER TO UserId
1234 AlterTableStmt *n = makeNode(AlterTableStmt);
1236 $3->inhOpt = INH_NO;
1241 /* ALTER TABLE <name> CLUSTER ON <indexname> */
1242 | ALTER TABLE qualified_name CLUSTER ON name
1244 AlterTableStmt *n = makeNode(AlterTableStmt);
1252 alter_column_default:
1255 /* Treat SET DEFAULT NULL the same as DROP DEFAULT */
1256 if (exprIsNullConstant($3))
1261 | DROP DEFAULT { $$ = NULL; }
1265 CASCADE { $$ = DROP_CASCADE; }
1266 | RESTRICT { $$ = DROP_RESTRICT; }
1267 | /* EMPTY */ { $$ = DROP_RESTRICT; /* default */ }
1271 /*****************************************************************************
1274 * close <portalname>
1276 *****************************************************************************/
1281 ClosePortalStmt *n = makeNode(ClosePortalStmt);
1288 /*****************************************************************************
1291 * COPY <relname> ['(' columnList ')'] FROM/TO [WITH options]
1293 * BINARY, OIDS, and DELIMITERS kept in old locations
1294 * for backward compatibility. 2002-06-18
1296 *****************************************************************************/
1298 CopyStmt: COPY opt_binary qualified_name opt_column_list opt_oids
1299 copy_from copy_file_name copy_delimiter opt_with copy_opt_list
1301 CopyStmt *n = makeNode(CopyStmt);
1308 /* Concatenate user-supplied flags */
1310 n->options = lappend(n->options, $2);
1312 n->options = lappend(n->options, $5);
1314 n->options = lappend(n->options, $8);
1316 n->options = nconc(n->options, $10);
1323 | TO { $$ = FALSE; }
1327 * copy_file_name NULL indicates stdio is used. Whether stdin or stdout is
1328 * used depends on the direction. (It really doesn't make sense to copy from
1329 * stdout. We silently correct the "typo". - AY 9/94
1333 | STDIN { $$ = NULL; }
1334 | STDOUT { $$ = NULL; }
1340 copy_opt_list copy_opt_item { $$ = lappend($1, $2); }
1341 | /* EMPTY */ { $$ = NIL; }
1348 $$ = makeDefElem("binary", (Node *)makeInteger(TRUE));
1352 $$ = makeDefElem("oids", (Node *)makeInteger(TRUE));
1354 | DELIMITER opt_as Sconst
1356 $$ = makeDefElem("delimiter", (Node *)makeString($3));
1358 | NULL_P opt_as Sconst
1360 $$ = makeDefElem("null", (Node *)makeString($3));
1364 /* The following exist for backward compatibility */
1369 $$ = makeDefElem("binary", (Node *)makeInteger(TRUE));
1371 | /*EMPTY*/ { $$ = NULL; }
1377 $$ = makeDefElem("oids", (Node *)makeInteger(TRUE));
1379 | /*EMPTY*/ { $$ = NULL; }
1383 /* USING DELIMITERS kept for backward compatibility. 2002-06-15 */
1384 opt_using DELIMITERS Sconst
1386 $$ = makeDefElem("delimiter", (Node *)makeString($3));
1388 | /*EMPTY*/ { $$ = NULL; }
1397 /*****************************************************************************
1400 * CREATE TABLE relname
1402 *****************************************************************************/
1404 CreateStmt: CREATE OptTemp TABLE qualified_name '(' OptTableElementList ')'
1405 OptInherit OptWithOids OnCommitOption
1407 CreateStmt *n = makeNode(CreateStmt);
1411 n->inhRelations = $8;
1412 n->constraints = NIL;
1417 | CREATE OptTemp TABLE qualified_name OF qualified_name
1418 '(' OptTableElementList ')' OptWithOids OnCommitOption
1420 /* SQL99 CREATE TABLE OF <UDT> (cols) seems to be satisfied
1421 * by our inheritance capabilities. Let's try it...
1423 CreateStmt *n = makeNode(CreateStmt);
1427 n->inhRelations = makeList1($6);
1428 n->constraints = NIL;
1436 * Redundancy here is needed to avoid shift/reduce conflicts,
1437 * since TEMP is not a reserved word. See also OptTempTableName.
1439 * NOTE: we accept both GLOBAL and LOCAL options; since we have no modules
1440 * the LOCAL keyword is really meaningless.
1442 OptTemp: TEMPORARY { $$ = TRUE; }
1443 | TEMP { $$ = TRUE; }
1444 | LOCAL TEMPORARY { $$ = TRUE; }
1445 | LOCAL TEMP { $$ = TRUE; }
1446 | GLOBAL TEMPORARY { $$ = TRUE; }
1447 | GLOBAL TEMP { $$ = TRUE; }
1448 | /*EMPTY*/ { $$ = FALSE; }
1451 OptTableElementList:
1452 TableElementList { $$ = $1; }
1453 | /*EMPTY*/ { $$ = NIL; }
1461 | TableElementList ',' TableElement
1463 $$ = lappend($1, $3);
1468 columnDef { $$ = $1; }
1469 | TableLikeClause { $$ = $1; }
1470 | TableConstraint { $$ = $1; }
1473 columnDef: ColId Typename ColQualList
1475 ColumnDef *n = makeNode(ColumnDef);
1478 n->constraints = $3;
1485 ColQualList ColConstraint { $$ = lappend($1, $2); }
1486 | /*EMPTY*/ { $$ = NIL; }
1490 CONSTRAINT name ColConstraintElem
1492 switch (nodeTag($3))
1496 Constraint *n = (Constraint *)$3;
1500 case T_FkConstraint:
1502 FkConstraint *n = (FkConstraint *)$3;
1503 n->constr_name = $2;
1511 | ColConstraintElem { $$ = $1; }
1512 | ConstraintAttr { $$ = $1; }
1515 /* DEFAULT NULL is already the default for Postgres.
1516 * But define it here and carry it forward into the system
1517 * to make it explicit.
1518 * - thomas 1998-09-13
1520 * WITH NULL and NULL are not SQL92-standard syntax elements,
1521 * so leave them out. Use DEFAULT NULL to explicitly indicate
1522 * that a column may have that value. WITH NULL leads to
1523 * shift/reduce conflicts with WITH TIME ZONE anyway.
1524 * - thomas 1999-01-08
1526 * DEFAULT expression must be b_expr not a_expr to prevent shift/reduce
1527 * conflict on NOT (since NOT might start a subsequent NOT NULL constraint,
1528 * or be part of a_expr NOT LIKE or similar constructs).
1533 Constraint *n = makeNode(Constraint);
1534 n->contype = CONSTR_NOTNULL;
1537 n->cooked_expr = NULL;
1543 Constraint *n = makeNode(Constraint);
1544 n->contype = CONSTR_NULL;
1547 n->cooked_expr = NULL;
1553 Constraint *n = makeNode(Constraint);
1554 n->contype = CONSTR_UNIQUE;
1557 n->cooked_expr = NULL;
1563 Constraint *n = makeNode(Constraint);
1564 n->contype = CONSTR_PRIMARY;
1567 n->cooked_expr = NULL;
1571 | CHECK '(' a_expr ')'
1573 Constraint *n = makeNode(Constraint);
1574 n->contype = CONSTR_CHECK;
1577 n->cooked_expr = NULL;
1583 Constraint *n = makeNode(Constraint);
1584 n->contype = CONSTR_DEFAULT;
1586 if (exprIsNullConstant($2))
1588 /* DEFAULT NULL should be reported as empty expr */
1595 n->cooked_expr = NULL;
1599 | REFERENCES qualified_name opt_column_list key_match key_actions
1601 FkConstraint *n = makeNode(FkConstraint);
1602 n->constr_name = NULL;
1606 n->fk_matchtype = $4;
1607 n->fk_upd_action = (char) ($5 >> 8);
1608 n->fk_del_action = (char) ($5 & 0xFF);
1609 n->deferrable = FALSE;
1610 n->initdeferred = FALSE;
1616 * ConstraintAttr represents constraint attributes, which we parse as if
1617 * they were independent constraint clauses, in order to avoid shift/reduce
1618 * conflicts (since NOT might start either an independent NOT NULL clause
1619 * or an attribute). analyze.c is responsible for attaching the attribute
1620 * information to the preceding "real" constraint node, and for complaining
1621 * if attribute clauses appear in the wrong place or wrong combinations.
1623 * See also ConstraintAttributeSpec, which can be used in places where
1624 * there is no parsing conflict.
1629 Constraint *n = makeNode(Constraint);
1630 n->contype = CONSTR_ATTR_DEFERRABLE;
1635 Constraint *n = makeNode(Constraint);
1636 n->contype = CONSTR_ATTR_NOT_DEFERRABLE;
1639 | INITIALLY DEFERRED
1641 Constraint *n = makeNode(Constraint);
1642 n->contype = CONSTR_ATTR_DEFERRED;
1645 | INITIALLY IMMEDIATE
1647 Constraint *n = makeNode(Constraint);
1648 n->contype = CONSTR_ATTR_IMMEDIATE;
1655 * SQL99 supports wholesale borrowing of a table definition via the LIKE clause.
1656 * This seems to be a poor man's inheritance capability, with the resulting
1657 * tables completely decoupled except for the original commonality in definitions.
1659 * This is very similar to CREATE TABLE AS except for the INCLUDING DEFAULTS extension
1660 * which is a part of SQL 200N
1663 LIKE qualified_name like_including_defaults
1665 InhRelation *n = makeNode(InhRelation);
1667 n->including_defaults = $3;
1673 like_including_defaults:
1674 INCLUDING DEFAULTS { $$ = true; }
1675 | EXCLUDING DEFAULTS { $$ = false; }
1676 | /* EMPTY */ { $$ = false; }
1680 /* ConstraintElem specifies constraint syntax which is not embedded into
1681 * a column definition. ColConstraintElem specifies the embedded form.
1682 * - thomas 1997-12-03
1685 CONSTRAINT name ConstraintElem
1687 switch (nodeTag($3))
1691 Constraint *n = (Constraint *)$3;
1695 case T_FkConstraint:
1697 FkConstraint *n = (FkConstraint *)$3;
1698 n->constr_name = $2;
1706 | ConstraintElem { $$ = $1; }
1710 CHECK '(' a_expr ')'
1712 Constraint *n = makeNode(Constraint);
1713 n->contype = CONSTR_CHECK;
1716 n->cooked_expr = NULL;
1719 | UNIQUE '(' columnList ')'
1721 Constraint *n = makeNode(Constraint);
1722 n->contype = CONSTR_UNIQUE;
1725 n->cooked_expr = NULL;
1729 | PRIMARY KEY '(' columnList ')'
1731 Constraint *n = makeNode(Constraint);
1732 n->contype = CONSTR_PRIMARY;
1735 n->cooked_expr = NULL;
1739 | FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
1740 opt_column_list key_match key_actions ConstraintAttributeSpec
1742 FkConstraint *n = makeNode(FkConstraint);
1743 n->constr_name = NULL;
1747 n->fk_matchtype = $9;
1748 n->fk_upd_action = (char) ($10 >> 8);
1749 n->fk_del_action = (char) ($10 & 0xFF);
1750 n->deferrable = ($11 & 1) != 0;
1751 n->initdeferred = ($11 & 2) != 0;
1757 '(' columnList ')' { $$ = $2; }
1758 | /*EMPTY*/ { $$ = NIL; }
1762 columnElem { $$ = makeList1($1); }
1763 | columnList ',' columnElem { $$ = lappend($1, $3); }
1768 $$ = (Node *) makeString($1);
1772 key_match: MATCH FULL
1774 $$ = FKCONSTR_MATCH_FULL;
1779 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1780 errmsg("MATCH PARTIAL not yet implemented")));
1781 $$ = FKCONSTR_MATCH_PARTIAL;
1785 $$ = FKCONSTR_MATCH_UNSPECIFIED;
1789 $$ = FKCONSTR_MATCH_UNSPECIFIED;
1794 * We combine the update and delete actions into one value temporarily
1795 * for simplicity of parsing, and then break them down again in the
1796 * calling production. update is in the left 8 bits, delete in the right.
1797 * Note that NOACTION is the default.
1801 { $$ = ($1 << 8) | (FKCONSTR_ACTION_NOACTION & 0xFF); }
1803 { $$ = (FKCONSTR_ACTION_NOACTION << 8) | ($1 & 0xFF); }
1804 | key_update key_delete
1805 { $$ = ($1 << 8) | ($2 & 0xFF); }
1806 | key_delete key_update
1807 { $$ = ($2 << 8) | ($1 & 0xFF); }
1809 { $$ = (FKCONSTR_ACTION_NOACTION << 8) | (FKCONSTR_ACTION_NOACTION & 0xFF); }
1812 key_update: ON UPDATE key_action { $$ = $3; }
1815 key_delete: ON DELETE_P key_action { $$ = $3; }
1819 NO ACTION { $$ = FKCONSTR_ACTION_NOACTION; }
1820 | RESTRICT { $$ = FKCONSTR_ACTION_RESTRICT; }
1821 | CASCADE { $$ = FKCONSTR_ACTION_CASCADE; }
1822 | SET NULL_P { $$ = FKCONSTR_ACTION_SETNULL; }
1823 | SET DEFAULT { $$ = FKCONSTR_ACTION_SETDEFAULT; }
1826 OptInherit: INHERITS '(' qualified_name_list ')' { $$ = $3; }
1827 | /*EMPTY*/ { $$ = NIL; }
1831 WITH OIDS { $$ = MUST_HAVE_OIDS; }
1832 | WITHOUT OIDS { $$ = MUST_NOT_HAVE_OIDS; }
1833 | /*EMPTY*/ { $$ = DEFAULT_OIDS; }
1836 OnCommitOption: ON COMMIT DROP { $$ = ONCOMMIT_DROP; }
1837 | ON COMMIT DELETE_P ROWS { $$ = ONCOMMIT_DELETE_ROWS; }
1838 | ON COMMIT PRESERVE ROWS { $$ = ONCOMMIT_PRESERVE_ROWS; }
1839 | /*EMPTY*/ { $$ = ONCOMMIT_NOOP; }
1844 * Note: CREATE TABLE ... AS SELECT ... is just another spelling for
1849 CREATE OptTemp TABLE qualified_name OptCreateAs WithOidsAs SelectStmt
1852 * When the SelectStmt is a set-operation tree, we must
1853 * stuff the INTO information into the leftmost component
1854 * Select, because that's where analyze.c will expect
1855 * to find it. Similarly, the output column names must
1856 * be attached to that Select's target list.
1858 SelectStmt *n = findLeftmostSelect((SelectStmt *) $7);
1859 if (n->into != NULL)
1861 (errcode(ERRCODE_SYNTAX_ERROR),
1862 errmsg("CREATE TABLE AS may not specify INTO")));
1865 n->intoColNames = $5;
1866 n->intoHasOids = $6;
1872 * To avoid a shift/reduce conflict in CreateAsStmt, we need to
1873 * include the 'AS' terminal in the parsing of WITH/WITHOUT
1874 * OIDS. Unfortunately that means this production is effectively a
1875 * duplicate of OptWithOids.
1878 WITH OIDS AS { $$ = MUST_HAVE_OIDS; }
1879 | WITHOUT OIDS AS { $$ = MUST_NOT_HAVE_OIDS; }
1880 | AS { $$ = DEFAULT_OIDS; }
1884 '(' CreateAsList ')' { $$ = $2; }
1885 | /*EMPTY*/ { $$ = NIL; }
1889 CreateAsElement { $$ = makeList1($1); }
1890 | CreateAsList ',' CreateAsElement { $$ = lappend($1, $3); }
1896 ColumnDef *n = makeNode(ColumnDef);
1901 n->is_not_null = false;
1902 n->raw_default = NULL;
1903 n->cooked_default = NULL;
1904 n->constraints = NIL;
1911 /*****************************************************************************
1914 * CREATE SEQUENCE seqname
1915 * ALTER SEQUENCE seqname
1917 *****************************************************************************/
1920 CREATE OptTemp SEQUENCE qualified_name OptSeqList
1922 CreateSeqStmt *n = makeNode(CreateSeqStmt);
1931 ALTER SEQUENCE qualified_name OptSeqList
1933 AlterSeqStmt *n = makeNode(AlterSeqStmt);
1940 OptSeqList: OptSeqList OptSeqElem { $$ = lappend($1, $2); }
1941 | /*EMPTY*/ { $$ = NIL; }
1944 OptSeqElem: CACHE NumericOnly
1946 $$ = makeDefElem("cache", (Node *)$2);
1950 $$ = makeDefElem("cycle", (Node *)makeInteger(TRUE));
1954 $$ = makeDefElem("cycle", (Node *)makeInteger(FALSE));
1956 | INCREMENT opt_by NumericOnly
1958 $$ = makeDefElem("increment", (Node *)$3);
1960 | MAXVALUE NumericOnly
1962 $$ = makeDefElem("maxvalue", (Node *)$2);
1964 | MINVALUE NumericOnly
1966 $$ = makeDefElem("minvalue", (Node *)$2);
1970 $$ = makeDefElem("maxvalue", NULL);
1974 $$ = makeDefElem("minvalue", NULL);
1976 | START opt_with NumericOnly
1978 $$ = makeDefElem("start", (Node *)$3);
1980 | RESTART opt_with NumericOnly
1982 $$ = makeDefElem("restart", (Node *)$3);
1991 FloatOnly { $$ = $1; }
1992 | IntegerOnly { $$ = $1; }
1995 FloatOnly: FCONST { $$ = makeFloat($1); }
2006 $$ = makeInteger($1);
2010 $$ = makeInteger($2);
2011 $$->val.ival = - $$->val.ival;
2015 /*****************************************************************************
2018 * CREATE PROCEDURAL LANGUAGE ...
2019 * DROP PROCEDURAL LANGUAGE ...
2021 *****************************************************************************/
2024 CREATE opt_trusted opt_procedural LANGUAGE ColId_or_Sconst
2025 HANDLER handler_name opt_validator opt_lancompiler
2027 CreatePLangStmt *n = makeNode(CreatePLangStmt);
2030 n->plvalidator = $8;
2037 TRUSTED { $$ = TRUE; }
2038 | /*EMPTY*/ { $$ = FALSE; }
2041 /* This ought to be just func_name, but that causes reduce/reduce conflicts
2042 * (CREATE LANGUAGE is the only place where func_name isn't followed by '(').
2043 * Work around by using name and dotted_name separately.
2047 { $$ = makeList1(makeString($1)); }
2048 | dotted_name { $$ = $1; }
2052 LANCOMPILER Sconst { $$ = $2; }
2053 | /*EMPTY*/ { $$ = ""; }
2057 VALIDATOR handler_name { $$ = $2; }
2058 | /*EMPTY*/ { $$ = NULL; }
2062 DROP opt_procedural LANGUAGE ColId_or_Sconst opt_drop_behavior
2064 DropPLangStmt *n = makeNode(DropPLangStmt);
2076 /*****************************************************************************
2079 * CREATE TRIGGER ...
2082 *****************************************************************************/
2085 CREATE TRIGGER name TriggerActionTime TriggerEvents ON
2086 qualified_name TriggerForSpec EXECUTE PROCEDURE
2087 func_name '(' TriggerFuncArgs ')'
2089 CreateTrigStmt *n = makeNode(CreateTrigStmt);
2096 memcpy(n->actions, $5, 4);
2097 n->isconstraint = FALSE;
2098 n->deferrable = FALSE;
2099 n->initdeferred = FALSE;
2100 n->constrrel = NULL;
2103 | CREATE CONSTRAINT TRIGGER name AFTER TriggerEvents ON
2104 qualified_name OptConstrFromTable
2105 ConstraintAttributeSpec
2106 FOR EACH ROW EXECUTE PROCEDURE
2107 func_name '(' TriggerFuncArgs ')'
2109 CreateTrigStmt *n = makeNode(CreateTrigStmt);
2116 memcpy(n->actions, $6, 4);
2117 n->isconstraint = TRUE;
2118 n->deferrable = ($10 & 1) != 0;
2119 n->initdeferred = ($10 & 2) != 0;
2127 BEFORE { $$ = TRUE; }
2128 | AFTER { $$ = FALSE; }
2134 char *e = palloc(4);
2135 e[0] = $1; e[1] = '\0';
2138 | TriggerOneEvent OR TriggerOneEvent
2140 char *e = palloc(4);
2141 e[0] = $1; e[1] = $3; e[2] = '\0';
2144 | TriggerOneEvent OR TriggerOneEvent OR TriggerOneEvent
2146 char *e = palloc(4);
2147 e[0] = $1; e[1] = $3; e[2] = $5; e[3] = '\0';
2153 INSERT { $$ = 'i'; }
2154 | DELETE_P { $$ = 'd'; }
2155 | UPDATE { $$ = 'u'; }
2159 FOR TriggerForOpt TriggerForType
2166 * If ROW/STATEMENT not specified, default to
2167 * STATEMENT, per SQL
2180 | STATEMENT { $$ = FALSE; }
2184 TriggerFuncArg { $$ = makeList1($1); }
2185 | TriggerFuncArgs ',' TriggerFuncArg { $$ = lappend($1, $3); }
2186 | /*EMPTY*/ { $$ = NIL; }
2193 snprintf(buf, sizeof(buf), "%d", $1);
2194 $$ = makeString(pstrdup(buf));
2196 | FCONST { $$ = makeString($1); }
2197 | Sconst { $$ = makeString($1); }
2198 | BCONST { $$ = makeString($1); }
2199 | XCONST { $$ = makeString($1); }
2200 | ColId { $$ = makeString($1); }
2204 FROM qualified_name { $$ = $2; }
2205 | /*EMPTY*/ { $$ = NULL; }
2208 ConstraintAttributeSpec:
2209 ConstraintDeferrabilitySpec
2211 | ConstraintDeferrabilitySpec ConstraintTimeSpec
2213 if ($1 == 0 && $2 != 0)
2215 (errcode(ERRCODE_SYNTAX_ERROR),
2216 errmsg("constraint declared INITIALLY DEFERRED must be DEFERRABLE")));
2219 | ConstraintTimeSpec
2226 | ConstraintTimeSpec ConstraintDeferrabilitySpec
2228 if ($2 == 0 && $1 != 0)
2230 (errcode(ERRCODE_SYNTAX_ERROR),
2231 errmsg("constraint declared INITIALLY DEFERRED must be DEFERRABLE")));
2238 ConstraintDeferrabilitySpec:
2239 NOT DEFERRABLE { $$ = 0; }
2240 | DEFERRABLE { $$ = 1; }
2244 INITIALLY IMMEDIATE { $$ = 0; }
2245 | INITIALLY DEFERRED { $$ = 2; }
2250 DROP TRIGGER name ON qualified_name opt_drop_behavior
2252 DropPropertyStmt *n = makeNode(DropPropertyStmt);
2256 n->removeType = OBJECT_TRIGGER;
2262 /*****************************************************************************
2265 * CREATE ASSERTION ...
2266 * DROP ASSERTION ...
2268 *****************************************************************************/
2271 CREATE ASSERTION name CHECK '(' a_expr ')'
2272 ConstraintAttributeSpec
2274 CreateTrigStmt *n = makeNode(CreateTrigStmt);
2276 n->args = makeList1($6);
2277 n->isconstraint = TRUE;
2278 n->deferrable = ($8 & 1) != 0;
2279 n->initdeferred = ($8 & 2) != 0;
2282 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2283 errmsg("CREATE ASSERTION is not yet implemented")));
2290 DROP ASSERTION name opt_drop_behavior
2292 DropPropertyStmt *n = makeNode(DropPropertyStmt);
2296 n->removeType = OBJECT_TRIGGER; /* XXX */
2298 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2299 errmsg("DROP ASSERTION is not yet implemented")));
2305 /*****************************************************************************
2308 * define (aggregate,operator,type)
2310 *****************************************************************************/
2313 CREATE AGGREGATE func_name definition
2315 DefineStmt *n = makeNode(DefineStmt);
2316 n->kind = OBJECT_AGGREGATE;
2321 | CREATE OPERATOR any_operator definition
2323 DefineStmt *n = makeNode(DefineStmt);
2324 n->kind = OBJECT_OPERATOR;
2329 | CREATE TYPE_P any_name definition
2331 DefineStmt *n = makeNode(DefineStmt);
2332 n->kind = OBJECT_TYPE;
2337 | CREATE TYPE_P any_name AS '(' TableFuncElementList ')'
2339 CompositeTypeStmt *n = makeNode(CompositeTypeStmt);
2340 RangeVar *r = makeNode(RangeVar);
2342 /* can't use qualified_name, sigh */
2346 r->catalogname = NULL;
2347 r->schemaname = NULL;
2348 r->relname = strVal(lfirst($3));
2351 r->catalogname = NULL;
2352 r->schemaname = strVal(lfirst($3));
2353 r->relname = strVal(lsecond($3));
2356 r->catalogname = strVal(lfirst($3));
2357 r->schemaname = strVal(lsecond($3));
2358 r->relname = strVal(lthird($3));
2362 (errcode(ERRCODE_SYNTAX_ERROR),
2363 errmsg("improper qualified name (too many dotted names): %s",
2364 NameListToString($3))));
2373 definition: '(' def_list ')' { $$ = $2; }
2376 def_list: def_elem { $$ = makeList1($1); }
2377 | def_list ',' def_elem { $$ = lappend($1, $3); }
2380 def_elem: ColLabel '=' def_arg
2382 $$ = makeDefElem($1, (Node *)$3);
2386 $$ = makeDefElem($1, NULL);
2390 /* Note: any simple identifier will be returned as a type name! */
2391 def_arg: func_return { $$ = (Node *)$1; }
2392 | qual_all_Op { $$ = (Node *)$1; }
2393 | NumericOnly { $$ = (Node *)$1; }
2394 | Sconst { $$ = (Node *)makeString($1); }
2398 /*****************************************************************************
2401 * CREATE OPERATOR CLASS ...
2402 * DROP OPERATOR CLASS ...
2404 *****************************************************************************/
2407 CREATE OPERATOR CLASS any_name opt_default FOR TYPE_P Typename
2408 USING access_method AS opclass_item_list
2410 CreateOpClassStmt *n = makeNode(CreateOpClassStmt);
2411 n->opclassname = $4;
2421 opclass_item { $$ = makeList1($1); }
2422 | opclass_item_list ',' opclass_item { $$ = lappend($1, $3); }
2426 OPERATOR Iconst any_operator opt_recheck
2428 CreateOpClassItem *n = makeNode(CreateOpClassItem);
2429 n->itemtype = OPCLASS_ITEM_OPERATOR;
2436 | OPERATOR Iconst any_operator '(' oper_argtypes ')' opt_recheck
2438 CreateOpClassItem *n = makeNode(CreateOpClassItem);
2439 n->itemtype = OPCLASS_ITEM_OPERATOR;
2446 | FUNCTION Iconst func_name func_args
2448 CreateOpClassItem *n = makeNode(CreateOpClassItem);
2449 n->itemtype = OPCLASS_ITEM_FUNCTION;
2451 n->args = extractArgTypes($4);
2457 CreateOpClassItem *n = makeNode(CreateOpClassItem);
2458 n->itemtype = OPCLASS_ITEM_STORAGETYPE;
2464 opt_default: DEFAULT { $$ = TRUE; }
2465 | /*EMPTY*/ { $$ = FALSE; }
2468 opt_recheck: RECHECK { $$ = TRUE; }
2469 | /*EMPTY*/ { $$ = FALSE; }
2474 DROP OPERATOR CLASS any_name USING access_method opt_drop_behavior
2476 RemoveOpClassStmt *n = makeNode(RemoveOpClassStmt);
2477 n->opclassname = $4;
2485 /*****************************************************************************
2489 * DROP itemtype itemname [, itemname ...] [ RESTRICT | CASCADE ]
2491 *****************************************************************************/
2493 DropStmt: DROP drop_type any_name_list opt_drop_behavior
2495 DropStmt *n = makeNode(DropStmt);
2503 drop_type: TABLE { $$ = OBJECT_TABLE; }
2504 | SEQUENCE { $$ = OBJECT_SEQUENCE; }
2505 | VIEW { $$ = OBJECT_VIEW; }
2506 | INDEX { $$ = OBJECT_INDEX; }
2507 | TYPE_P { $$ = OBJECT_TYPE; }
2508 | DOMAIN_P { $$ = OBJECT_DOMAIN; }
2509 | CONVERSION_P { $$ = OBJECT_CONVERSION; }
2510 | SCHEMA { $$ = OBJECT_SCHEMA; }
2514 any_name { $$ = makeList1($1); }
2515 | any_name_list ',' any_name { $$ = lappend($1, $3); }
2518 any_name: ColId { $$ = makeList1(makeString($1)); }
2519 | dotted_name { $$ = $1; }
2522 /*****************************************************************************
2525 * truncate table relname
2527 *****************************************************************************/
2530 TRUNCATE opt_table qualified_name
2532 TruncateStmt *n = makeNode(TruncateStmt);
2538 /*****************************************************************************
2540 * The COMMENT ON statement can take different forms based upon the type of
2541 * the object associated with the comment. The form of the statement is:
2543 * COMMENT ON [ [ DATABASE | DOMAIN | INDEX | SEQUENCE | TABLE | TYPE | VIEW |
2544 * CONVERSION | LANGUAGE | OPERATOR CLASS | LARGE OBJECT |
2545 * CAST ] <objname> |
2546 * AGGREGATE <aggname> (<aggtype>) |
2547 * FUNCTION <funcname> (arg1, arg2, ...) |
2548 * OPERATOR <op> (leftoperand_typ, rightoperand_typ) |
2549 * TRIGGER <triggername> ON <relname> |
2550 * RULE <rulename> ON <relname> ]
2553 *****************************************************************************/
2556 COMMENT ON comment_type any_name IS comment_text
2558 CommentStmt *n = makeNode(CommentStmt);
2565 | COMMENT ON AGGREGATE func_name '(' aggr_argtype ')'
2568 CommentStmt *n = makeNode(CommentStmt);
2569 n->objtype = OBJECT_AGGREGATE;
2571 n->objargs = makeList1($6);
2575 | COMMENT ON FUNCTION func_name func_args IS comment_text
2577 CommentStmt *n = makeNode(CommentStmt);
2578 n->objtype = OBJECT_FUNCTION;
2580 n->objargs = extractArgTypes($5);
2584 | COMMENT ON OPERATOR any_operator '(' oper_argtypes ')'
2587 CommentStmt *n = makeNode(CommentStmt);
2588 n->objtype = OBJECT_OPERATOR;
2594 | COMMENT ON CONSTRAINT name ON any_name IS comment_text
2596 CommentStmt *n = makeNode(CommentStmt);
2597 n->objtype = OBJECT_CONSTRAINT;
2598 n->objname = lappend($6, makeString($4));
2603 | COMMENT ON RULE name ON any_name IS comment_text
2605 CommentStmt *n = makeNode(CommentStmt);
2606 n->objtype = OBJECT_RULE;
2607 n->objname = lappend($6, makeString($4));
2612 | COMMENT ON RULE name IS comment_text
2614 /* Obsolete syntax supported for awhile for compatibility */
2615 CommentStmt *n = makeNode(CommentStmt);
2616 n->objtype = OBJECT_RULE;
2617 n->objname = makeList1(makeString($4));
2622 | COMMENT ON TRIGGER name ON any_name IS comment_text
2624 CommentStmt *n = makeNode(CommentStmt);
2625 n->objtype = OBJECT_TRIGGER;
2626 n->objname = lappend($6, makeString($4));
2631 | COMMENT ON OPERATOR CLASS any_name USING access_method IS comment_text
2633 CommentStmt *n = makeNode(CommentStmt);
2634 n->objtype = OBJECT_OPCLASS;
2636 n->objargs = makeList1(makeString($7));
2640 | COMMENT ON LARGE_P OBJECT_P NumericOnly IS comment_text
2642 CommentStmt *n = makeNode(CommentStmt);
2643 n->objtype = OBJECT_LARGEOBJECT;
2644 n->objname = makeList1($5);
2649 | COMMENT ON CAST '(' Typename AS Typename ')' IS comment_text
2651 CommentStmt *n = makeNode(CommentStmt);
2652 n->objtype = OBJECT_CAST;
2653 n->objname = makeList1($5);
2654 n->objargs = makeList1($7);
2658 | COMMENT ON opt_procedural LANGUAGE any_name IS comment_text
2660 CommentStmt *n = makeNode(CommentStmt);
2661 n->objtype = OBJECT_LANGUAGE;
2670 COLUMN { $$ = OBJECT_COLUMN; }
2671 | DATABASE { $$ = OBJECT_DATABASE; }
2672 | SCHEMA { $$ = OBJECT_SCHEMA; }
2673 | INDEX { $$ = OBJECT_INDEX; }
2674 | SEQUENCE { $$ = OBJECT_SEQUENCE; }
2675 | TABLE { $$ = OBJECT_TABLE; }
2676 | DOMAIN_P { $$ = OBJECT_TYPE; }
2677 | TYPE_P { $$ = OBJECT_TYPE; }
2678 | VIEW { $$ = OBJECT_VIEW; }
2679 | CONVERSION_P { $$ = OBJECT_CONVERSION; }
2684 | NULL_P { $$ = NULL; }
2687 /*****************************************************************************
2692 *****************************************************************************/
2694 FetchStmt: FETCH fetch_direction from_in name
2696 FetchStmt *n = (FetchStmt *) $2;
2703 FetchStmt *n = makeNode(FetchStmt);
2704 n->direction = FETCH_FORWARD;
2710 | MOVE fetch_direction from_in name
2712 FetchStmt *n = (FetchStmt *) $2;
2719 FetchStmt *n = makeNode(FetchStmt);
2720 n->direction = FETCH_FORWARD;
2731 FetchStmt *n = makeNode(FetchStmt);
2732 n->direction = FETCH_FORWARD;
2738 FetchStmt *n = makeNode(FetchStmt);
2739 n->direction = FETCH_FORWARD;
2745 FetchStmt *n = makeNode(FetchStmt);
2746 n->direction = FETCH_BACKWARD;
2752 FetchStmt *n = makeNode(FetchStmt);
2753 n->direction = FETCH_ABSOLUTE;
2759 FetchStmt *n = makeNode(FetchStmt);
2760 n->direction = FETCH_ABSOLUTE;
2764 | ABSOLUTE_P fetch_count
2766 FetchStmt *n = makeNode(FetchStmt);
2767 n->direction = FETCH_ABSOLUTE;
2771 | RELATIVE_P fetch_count
2773 FetchStmt *n = makeNode(FetchStmt);
2774 n->direction = FETCH_RELATIVE;
2780 FetchStmt *n = makeNode(FetchStmt);
2781 n->direction = FETCH_FORWARD;
2787 FetchStmt *n = makeNode(FetchStmt);
2788 n->direction = FETCH_FORWARD;
2789 n->howMany = FETCH_ALL;
2794 FetchStmt *n = makeNode(FetchStmt);
2795 n->direction = FETCH_FORWARD;
2799 | FORWARD fetch_count
2801 FetchStmt *n = makeNode(FetchStmt);
2802 n->direction = FETCH_FORWARD;
2808 FetchStmt *n = makeNode(FetchStmt);
2809 n->direction = FETCH_FORWARD;
2810 n->howMany = FETCH_ALL;
2815 FetchStmt *n = makeNode(FetchStmt);
2816 n->direction = FETCH_BACKWARD;
2820 | BACKWARD fetch_count
2822 FetchStmt *n = makeNode(FetchStmt);
2823 n->direction = FETCH_BACKWARD;
2829 FetchStmt *n = makeNode(FetchStmt);
2830 n->direction = FETCH_BACKWARD;
2831 n->howMany = FETCH_ALL;
2838 | '-' Iconst { $$ = - $2; }
2846 /*****************************************************************************
2848 * GRANT and REVOKE statements
2850 *****************************************************************************/
2852 GrantStmt: GRANT privileges ON privilege_target TO grantee_list
2853 opt_grant_grant_option
2855 GrantStmt *n = makeNode(GrantStmt);
2858 n->objtype = ($4)->objtype;
2859 n->objects = ($4)->objs;
2861 n->grant_option = $7;
2866 RevokeStmt: REVOKE opt_revoke_grant_option privileges ON privilege_target
2867 FROM grantee_list opt_drop_behavior
2869 GrantStmt *n = makeNode(GrantStmt);
2870 n->is_grant = false;
2872 n->objtype = ($5)->objtype;
2873 n->objects = ($5)->objs;
2875 n->grant_option = $2;
2883 /* either ALL [PRIVILEGES] or a list of individual privileges */
2884 privileges: privilege_list { $$ = $1; }
2885 | ALL { $$ = makeListi1(ACL_ALL_RIGHTS); }
2886 | ALL PRIVILEGES { $$ = makeListi1(ACL_ALL_RIGHTS); }
2890 privilege { $$ = makeListi1($1); }
2891 | privilege_list ',' privilege { $$ = lappendi($1, $3); }
2894 /* Not all of these privilege types apply to all objects, but that
2895 * gets sorted out later.
2897 privilege: SELECT { $$ = ACL_SELECT; }
2898 | INSERT { $$ = ACL_INSERT; }
2899 | UPDATE { $$ = ACL_UPDATE; }
2900 | DELETE_P { $$ = ACL_DELETE; }
2901 | RULE { $$ = ACL_RULE; }
2902 | REFERENCES { $$ = ACL_REFERENCES; }
2903 | TRIGGER { $$ = ACL_TRIGGER; }
2904 | EXECUTE { $$ = ACL_EXECUTE; }
2905 | USAGE { $$ = ACL_USAGE; }
2906 | CREATE { $$ = ACL_CREATE; }
2907 | TEMPORARY { $$ = ACL_CREATE_TEMP; }
2908 | TEMP { $$ = ACL_CREATE_TEMP; }
2912 /* Don't bother trying to fold the first two rules into one using
2913 opt_table. You're going to get conflicts. */
2917 PrivTarget *n = makeNode(PrivTarget);
2918 n->objtype = ACL_OBJECT_RELATION;
2922 | TABLE qualified_name_list
2924 PrivTarget *n = makeNode(PrivTarget);
2925 n->objtype = ACL_OBJECT_RELATION;
2929 | FUNCTION function_with_argtypes_list
2931 PrivTarget *n = makeNode(PrivTarget);
2932 n->objtype = ACL_OBJECT_FUNCTION;
2936 | DATABASE name_list
2938 PrivTarget *n = makeNode(PrivTarget);
2939 n->objtype = ACL_OBJECT_DATABASE;
2943 | LANGUAGE name_list
2945 PrivTarget *n = makeNode(PrivTarget);
2946 n->objtype = ACL_OBJECT_LANGUAGE;
2952 PrivTarget *n = makeNode(PrivTarget);
2953 n->objtype = ACL_OBJECT_NAMESPACE;
2961 grantee { $$ = makeList1($1); }
2962 | grantee_list ',' grantee { $$ = lappend($1, $3); }
2967 PrivGrantee *n = makeNode(PrivGrantee);
2968 /* This hack lets us avoid reserving PUBLIC as a keyword*/
2969 if (strcmp($1, "public") == 0)
2973 n->groupname = NULL;
2978 PrivGrantee *n = makeNode(PrivGrantee);
2979 /* Treat GROUP PUBLIC as a synonym for PUBLIC */
2980 if (strcmp($2, "public") == 0)
2981 n->groupname = NULL;
2990 opt_grant_grant_option:
2991 WITH GRANT OPTION { $$ = TRUE; }
2992 | /*EMPTY*/ { $$ = FALSE; }
2995 opt_revoke_grant_option:
2996 GRANT OPTION FOR { $$ = TRUE; }
2997 | /*EMPTY*/ { $$ = FALSE; }
3001 function_with_argtypes_list:
3002 function_with_argtypes { $$ = makeList1($1); }
3003 | function_with_argtypes_list ',' function_with_argtypes
3004 { $$ = lappend($1, $3); }
3007 function_with_argtypes:
3010 FuncWithArgs *n = makeNode(FuncWithArgs);
3012 n->funcargs = extractArgTypes($2);
3018 /*****************************************************************************
3021 * create index <indexname> on <relname>
3022 * [ using <access> ] "(" ( <col> [ using <opclass> ] )+ ")"
3023 * [ where <predicate> ]
3025 *****************************************************************************/
3027 IndexStmt: CREATE index_opt_unique INDEX index_name ON qualified_name
3028 access_method_clause '(' index_params ')' where_clause
3030 IndexStmt *n = makeNode(IndexStmt);
3034 n->accessMethod = $7;
3035 n->indexParams = $9;
3036 n->whereClause = $11;
3042 UNIQUE { $$ = TRUE; }
3043 | /*EMPTY*/ { $$ = FALSE; }
3046 access_method_clause:
3047 USING access_method { $$ = $2; }
3048 | /*EMPTY*/ { $$ = DEFAULT_INDEX_TYPE; }
3051 index_params: index_elem { $$ = makeList1($1); }
3052 | index_params ',' index_elem { $$ = lappend($1, $3); }
3056 * Index attributes can be either simple column references, or arbitrary
3057 * expressions in parens. For backwards-compatibility reasons, we allow
3058 * an expression that's just a function call to be written without parens.
3060 index_elem: attr_name opt_class
3062 $$ = makeNode(IndexElem);
3067 | func_name '(' expr_list ')' opt_class
3069 FuncCall *n = makeNode(FuncCall);
3072 n->agg_star = FALSE;
3073 n->agg_distinct = FALSE;
3075 $$ = makeNode(IndexElem);
3077 $$->expr = (Node *)n;
3080 | '(' a_expr ')' opt_class
3082 $$ = makeNode(IndexElem);
3089 opt_class: any_name { $$ = $1; }
3090 | USING any_name { $$ = $2; }
3091 | /*EMPTY*/ { $$ = NIL; }
3094 /*****************************************************************************
3097 * create [or replace] function <fname>
3098 * [(<type-1> { , <type-n>})]
3100 * as <filename or code in language as appropriate>
3101 * language <lang> [with parameters]
3103 *****************************************************************************/
3106 CREATE opt_or_replace FUNCTION func_name func_args
3107 RETURNS func_return createfunc_opt_list opt_definition
3109 CreateFunctionStmt *n = makeNode(CreateFunctionStmt);
3121 OR REPLACE { $$ = TRUE; }
3122 | /*EMPTY*/ { $$ = FALSE; }
3125 func_args: '(' func_args_list ')' { $$ = $2; }
3126 | '(' ')' { $$ = NIL; }
3130 func_arg { $$ = makeList1($1); }
3131 | func_args_list ',' func_arg { $$ = lappend($1, $3); }
3134 /* We can catch over-specified arguments here if we want to,
3135 * but for now better to silently swallow typmod, etc.
3136 * - thomas 2000-03-22
3139 arg_class param_name func_type
3141 FunctionParameter *n = makeNode(FunctionParameter);
3146 | arg_class func_type
3148 FunctionParameter *n = makeNode(FunctionParameter);
3155 arg_class: IN_P { $$ = FALSE; }
3159 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3160 errmsg("CREATE FUNCTION / OUT parameters are not implemented")));
3166 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3167 errmsg("CREATE FUNCTION / INOUT parameters are not implemented")));
3170 | /*EMPTY*/ { $$ = FALSE; }
3174 * Ideally param_name should be ColId, but that causes too many conflicts.
3176 param_name: function_name
3182 /* We can catch over-specified arguments here if we want to,
3183 * but for now better to silently swallow typmod, etc.
3184 * - thomas 2000-03-22
3191 * We would like to make the second production here be ColId attrs etc,
3192 * but that causes reduce/reduce conflicts. type_name is next best choice.
3194 func_type: Typename { $$ = $1; }
3195 | type_name attrs '%' TYPE_P
3197 $$ = makeNode(TypeName);
3198 $$->names = lcons(makeString($1), $2);
3199 $$->pct_type = true;
3205 createfunc_opt_list:
3206 /* Must be at least one to prevent conflict */
3207 createfunc_opt_item { $$ = makeList1($1); }
3208 | createfunc_opt_list createfunc_opt_item { $$ = lappend($1, $2); }
3211 createfunc_opt_item:
3214 $$ = makeDefElem("as", (Node *)$2);
3216 | LANGUAGE ColId_or_Sconst
3218 $$ = makeDefElem("language", (Node *)makeString($2));
3222 $$ = makeDefElem("volatility", (Node *)makeString("immutable"));
3226 $$ = makeDefElem("volatility", (Node *)makeString("stable"));
3230 $$ = makeDefElem("volatility", (Node *)makeString("volatile"));
3232 | CALLED ON NULL_P INPUT_P
3234 $$ = makeDefElem("strict", (Node *)makeInteger(FALSE));
3236 | RETURNS NULL_P ON NULL_P INPUT_P
3238 $$ = makeDefElem("strict", (Node *)makeInteger(TRUE));
3242 $$ = makeDefElem("strict", (Node *)makeInteger(TRUE));
3244 | EXTERNAL SECURITY DEFINER
3246 $$ = makeDefElem("security", (Node *)makeInteger(TRUE));
3248 | EXTERNAL SECURITY INVOKER
3250 $$ = makeDefElem("security", (Node *)makeInteger(FALSE));
3254 $$ = makeDefElem("security", (Node *)makeInteger(TRUE));
3258 $$ = makeDefElem("security", (Node *)makeInteger(FALSE));
3262 func_as: Sconst { $$ = makeList1(makeString($1)); }
3265 $$ = makeList2(makeString($1), makeString($3));
3270 WITH definition { $$ = $2; }
3271 | /*EMPTY*/ { $$ = NIL; }
3275 /*****************************************************************************
3279 * DROP FUNCTION funcname (arg1, arg2, ...) [ RESTRICT | CASCADE ]
3280 * DROP AGGREGATE aggname (aggtype) [ RESTRICT | CASCADE ]
3281 * DROP OPERATOR opname (leftoperand_typ, rightoperand_typ) [ RESTRICT | CASCADE ]
3283 *****************************************************************************/
3286 DROP FUNCTION func_name func_args opt_drop_behavior
3288 RemoveFuncStmt *n = makeNode(RemoveFuncStmt);
3290 n->args = extractArgTypes($4);
3297 DROP AGGREGATE func_name '(' aggr_argtype ')' opt_drop_behavior
3299 RemoveAggrStmt *n = makeNode(RemoveAggrStmt);
3308 Typename { $$ = $1; }
3309 | '*' { $$ = NULL; }
3313 DROP OPERATOR any_operator '(' oper_argtypes ')' opt_drop_behavior
3315 RemoveOperStmt *n = makeNode(RemoveOperStmt);
3327 (errcode(ERRCODE_SYNTAX_ERROR),
3328 errmsg("missing argument"),
3329 errhint("Use NONE to denote the missing argument of a unary operator.")));
3331 | Typename ',' Typename
3332 { $$ = makeList2($1, $3); }
3333 | NONE ',' Typename /* left unary */
3334 { $$ = makeList2(NULL, $3); }
3335 | Typename ',' NONE /* right unary */
3336 { $$ = makeList2($1, NULL); }
3341 { $$ = makeList1(makeString($1)); }
3342 | ColId '.' any_operator
3343 { $$ = lcons(makeString($1), $3); }
3347 /*****************************************************************************
3349 * CREATE CAST / DROP CAST
3351 *****************************************************************************/
3353 CreateCastStmt: CREATE CAST '(' Typename AS Typename ')'
3354 WITH FUNCTION function_with_argtypes cast_context
3356 CreateCastStmt *n = makeNode(CreateCastStmt);
3359 n->func = (FuncWithArgs *) $10;
3360 n->context = (CoercionContext) $11;
3363 | CREATE CAST '(' Typename AS Typename ')'
3364 WITHOUT FUNCTION cast_context
3366 CreateCastStmt *n = makeNode(CreateCastStmt);
3370 n->context = (CoercionContext) $10;
3375 cast_context: AS IMPLICIT_P { $$ = COERCION_IMPLICIT; }
3376 | AS ASSIGNMENT { $$ = COERCION_ASSIGNMENT; }
3377 | /*EMPTY*/ { $$ = COERCION_EXPLICIT; }
3381 DropCastStmt: DROP CAST '(' Typename AS Typename ')' opt_drop_behavior
3383 DropCastStmt *n = makeNode(DropCastStmt);
3393 /*****************************************************************************
3397 * REINDEX type <typename> [FORCE] [ALL]
3399 *****************************************************************************/
3402 REINDEX reindex_type qualified_name opt_force
3404 ReindexStmt *n = makeNode(ReindexStmt);
3411 | REINDEX DATABASE name opt_force
3413 ReindexStmt *n = makeNode(ReindexStmt);
3414 n->kind = OBJECT_DATABASE;
3423 INDEX { $$ = OBJECT_INDEX; }
3424 | TABLE { $$ = OBJECT_TABLE; }
3427 opt_force: FORCE { $$ = TRUE; }
3428 | /* EMPTY */ { $$ = FALSE; }
3432 /*****************************************************************************
3434 * ALTER THING name RENAME TO newname
3436 *****************************************************************************/
3438 RenameStmt: ALTER AGGREGATE func_name '(' aggr_argtype ')' RENAME TO name
3440 RenameStmt *n = makeNode(RenameStmt);
3441 n->renameType = OBJECT_AGGREGATE;
3443 n->objarg = makeList1($5);
3447 | ALTER CONVERSION_P any_name RENAME TO name
3449 RenameStmt *n = makeNode(RenameStmt);
3450 n->renameType = OBJECT_CONVERSION;
3455 | ALTER DATABASE database_name RENAME TO database_name
3457 RenameStmt *n = makeNode(RenameStmt);
3458 n->renameType = OBJECT_DATABASE;
3463 | ALTER FUNCTION func_name func_args RENAME TO name
3465 RenameStmt *n = makeNode(RenameStmt);
3466 n->renameType = OBJECT_FUNCTION;
3468 n->objarg = extractArgTypes($4);
3472 | ALTER GROUP_P UserId RENAME TO UserId
3474 RenameStmt *n = makeNode(RenameStmt);
3475 n->renameType = OBJECT_GROUP;
3480 | ALTER LANGUAGE name RENAME TO name
3482 RenameStmt *n = makeNode(RenameStmt);
3483 n->renameType = OBJECT_LANGUAGE;
3488 | ALTER OPERATOR CLASS any_name USING access_method RENAME TO name
3490 RenameStmt *n = makeNode(RenameStmt);
3491 n->renameType = OBJECT_OPCLASS;
3497 | ALTER SCHEMA name RENAME TO name
3499 RenameStmt *n = makeNode(RenameStmt);
3500 n->renameType = OBJECT_SCHEMA;
3505 | ALTER TABLE relation_expr RENAME opt_column opt_name TO name
3507 RenameStmt *n = makeNode(RenameStmt);
3512 n->renameType = OBJECT_TABLE;
3514 n->renameType = OBJECT_COLUMN;
3517 | ALTER TRIGGER name ON relation_expr RENAME TO name
3519 RenameStmt *n = makeNode(RenameStmt);
3523 n->renameType = OBJECT_TRIGGER;
3526 | ALTER USER UserId RENAME TO UserId
3528 RenameStmt *n = makeNode(RenameStmt);
3529 n->renameType = OBJECT_USER;
3536 opt_name: name { $$ = $1; }
3537 | /*EMPTY*/ { $$ = NULL; }
3540 opt_column: COLUMN { $$ = COLUMN; }
3541 | /*EMPTY*/ { $$ = 0; }
3545 /*****************************************************************************
3547 * QUERY: Define Rewrite Rule
3549 *****************************************************************************/
3551 RuleStmt: CREATE opt_or_replace RULE name AS
3552 { QueryIsRule=TRUE; }
3553 ON event TO qualified_name where_clause
3554 DO opt_instead RuleActionList
3556 RuleStmt *n = makeNode(RuleStmt);
3560 n->whereClause = $11;
3570 NOTHING { $$ = NIL; }
3571 | RuleActionStmt { $$ = makeList1($1); }
3572 | '(' RuleActionMulti ')' { $$ = $2; }
3575 /* the thrashing around here is to discard "empty" statements... */
3577 RuleActionMulti ';' RuleActionStmtOrEmpty
3579 $$ = lappend($1, $3);
3583 | RuleActionStmtOrEmpty
3599 RuleActionStmtOrEmpty:
3600 RuleActionStmt { $$ = $1; }
3601 | /*EMPTY*/ { $$ = NULL; }
3604 /* change me to select, update, etc. some day */
3605 event: SELECT { $$ = CMD_SELECT; }
3606 | UPDATE { $$ = CMD_UPDATE; }
3607 | DELETE_P { $$ = CMD_DELETE; }
3608 | INSERT { $$ = CMD_INSERT; }
3612 INSTEAD { $$ = TRUE; }
3613 | ALSO { $$ = FALSE; }
3614 | /*EMPTY*/ { $$ = FALSE; }
3619 DROP RULE name ON qualified_name opt_drop_behavior
3621 DropPropertyStmt *n = makeNode(DropPropertyStmt);
3625 n->removeType = OBJECT_RULE;
3631 /*****************************************************************************
3634 * NOTIFY <qualified_name> can appear both in rule bodies and
3635 * as a query-level command
3637 *****************************************************************************/
3639 NotifyStmt: NOTIFY qualified_name
3641 NotifyStmt *n = makeNode(NotifyStmt);
3647 ListenStmt: LISTEN qualified_name
3649 ListenStmt *n = makeNode(ListenStmt);
3656 UNLISTEN qualified_name
3658 UnlistenStmt *n = makeNode(UnlistenStmt);
3664 UnlistenStmt *n = makeNode(UnlistenStmt);
3665 n->relation = makeNode(RangeVar);
3666 n->relation->relname = "*";
3667 n->relation->schemaname = NULL;
3673 /*****************************************************************************
3677 * BEGIN / COMMIT / ROLLBACK
3678 * (also older versions END / ABORT)
3680 *****************************************************************************/
3683 ABORT_P opt_transaction
3685 TransactionStmt *n = makeNode(TransactionStmt);
3686 n->kind = TRANS_STMT_ROLLBACK;
3690 | BEGIN_P opt_transaction transaction_mode_list_or_empty
3692 TransactionStmt *n = makeNode(TransactionStmt);
3693 n->kind = TRANS_STMT_BEGIN;
3697 | START TRANSACTION transaction_mode_list_or_empty
3699 TransactionStmt *n = makeNode(TransactionStmt);
3700 n->kind = TRANS_STMT_START;
3704 | COMMIT opt_transaction
3706 TransactionStmt *n = makeNode(TransactionStmt);
3707 n->kind = TRANS_STMT_COMMIT;
3711 | END_P opt_transaction
3713 TransactionStmt *n = makeNode(TransactionStmt);
3714 n->kind = TRANS_STMT_COMMIT;
3718 | ROLLBACK opt_transaction
3720 TransactionStmt *n = makeNode(TransactionStmt);
3721 n->kind = TRANS_STMT_ROLLBACK;
3727 opt_transaction: WORK {}
3732 transaction_mode_list:
3733 ISOLATION LEVEL iso_level
3734 { $$ = makeList1(makeDefElem("transaction_isolation",
3735 makeStringConst($3, NULL))); }
3736 | transaction_access_mode
3737 { $$ = makeList1(makeDefElem("transaction_read_only",
3738 makeIntConst($1))); }
3739 | ISOLATION LEVEL iso_level transaction_access_mode
3741 $$ = makeList2(makeDefElem("transaction_isolation",
3742 makeStringConst($3, NULL)),
3743 makeDefElem("transaction_read_only",
3746 | transaction_access_mode ISOLATION LEVEL iso_level
3748 $$ = makeList2(makeDefElem("transaction_read_only",
3750 makeDefElem("transaction_isolation",
3751 makeStringConst($4, NULL)));
3755 transaction_mode_list_or_empty:
3756 transaction_mode_list
3761 transaction_access_mode:
3762 READ ONLY { $$ = TRUE; }
3763 | READ WRITE { $$ = FALSE; }
3767 /*****************************************************************************
3770 * create view <viewname> '('target-list ')' AS <query>
3772 *****************************************************************************/
3774 ViewStmt: CREATE opt_or_replace VIEW qualified_name opt_column_list
3777 ViewStmt *n = makeNode(ViewStmt);
3781 n->query = (Query *) $7;
3787 /*****************************************************************************
3792 *****************************************************************************/
3794 LoadStmt: LOAD file_name
3796 LoadStmt *n = makeNode(LoadStmt);
3803 /*****************************************************************************
3807 *****************************************************************************/
3810 CREATE DATABASE database_name opt_with createdb_opt_list
3812 CreatedbStmt *n = makeNode(CreatedbStmt);
3820 createdb_opt_list createdb_opt_item { $$ = lappend($1, $2); }
3821 | /* EMPTY */ { $$ = NIL; }
3825 LOCATION opt_equal Sconst
3827 $$ = makeDefElem("location", (Node *)makeString($3));
3829 | LOCATION opt_equal DEFAULT
3831 $$ = makeDefElem("location", NULL);
3833 | TEMPLATE opt_equal name
3835 $$ = makeDefElem("template", (Node *)makeString($3));
3837 | TEMPLATE opt_equal DEFAULT
3839 $$ = makeDefElem("template", NULL);
3841 | ENCODING opt_equal Sconst
3843 $$ = makeDefElem("encoding", (Node *)makeString($3));
3845 | ENCODING opt_equal Iconst
3847 $$ = makeDefElem("encoding", (Node *)makeInteger($3));
3849 | ENCODING opt_equal DEFAULT
3851 $$ = makeDefElem("encoding", NULL);
3853 | OWNER opt_equal name
3855 $$ = makeDefElem("owner", (Node *)makeString($3));
3857 | OWNER opt_equal DEFAULT
3859 $$ = makeDefElem("owner", NULL);
3864 * Though the equals sign doesn't match other WITH options, pg_dump uses
3865 * equals for backward compability, and it doesn't seem worth removing it.
3873 /*****************************************************************************
3877 *****************************************************************************/
3879 AlterDatabaseSetStmt:
3880 ALTER DATABASE database_name SET set_rest
3882 AlterDatabaseSetStmt *n = makeNode(AlterDatabaseSetStmt);
3884 n->variable = $5->name;
3885 n->value = $5->args;
3888 | ALTER DATABASE database_name VariableResetStmt
3890 AlterDatabaseSetStmt *n = makeNode(AlterDatabaseSetStmt);
3892 n->variable = ((VariableResetStmt *)$4)->name;
3899 /*****************************************************************************
3903 * This is implicitly CASCADE, no need for drop behavior
3904 *****************************************************************************/
3906 DropdbStmt: DROP DATABASE database_name
3908 DropdbStmt *n = makeNode(DropdbStmt);
3915 /*****************************************************************************
3917 * Manipulate a domain
3919 *****************************************************************************/
3922 CREATE DOMAIN_P any_name opt_as Typename ColQualList
3924 CreateDomainStmt *n = makeNode(CreateDomainStmt);
3927 n->constraints = $6;
3933 /* ALTER DOMAIN <domain> {SET DEFAULT <expr>|DROP DEFAULT} */
3934 ALTER DOMAIN_P any_name alter_column_default
3936 AlterDomainStmt *n = makeNode(AlterDomainStmt);
3942 /* ALTER DOMAIN <domain> DROP NOT NULL */
3943 | ALTER DOMAIN_P any_name DROP NOT NULL_P
3945 AlterDomainStmt *n = makeNode(AlterDomainStmt);
3950 /* ALTER DOMAIN <domain> SET NOT NULL */
3951 | ALTER DOMAIN_P any_name SET NOT NULL_P
3953 AlterDomainStmt *n = makeNode(AlterDomainStmt);
3958 /* ALTER DOMAIN <domain> ADD CONSTRAINT ... */
3959 | ALTER DOMAIN_P any_name ADD TableConstraint
3961 AlterDomainStmt *n = makeNode(AlterDomainStmt);
3967 /* ALTER DOMAIN <domain> DROP CONSTRAINT <name> [RESTRICT|CASCADE] */
3968 | ALTER DOMAIN_P any_name DROP CONSTRAINT name opt_drop_behavior
3970 AlterDomainStmt *n = makeNode(AlterDomainStmt);
3977 /* ALTER DOMAIN <domain> OWNER TO UserId */
3978 | ALTER DOMAIN_P any_name OWNER TO UserId
3980 AlterDomainStmt *n = makeNode(AlterDomainStmt);
3993 /*****************************************************************************
3995 * Manipulate a conversion
3997 * CREATE [DEFAULT] CONVERSION <conversion_name>
3998 * FOR <encoding_name> TO <encoding_name> FROM <func_name>
4000 *****************************************************************************/
4002 CreateConversionStmt:
4003 CREATE opt_default CONVERSION_P any_name FOR Sconst
4004 TO Sconst FROM any_name
4006 CreateConversionStmt *n = makeNode(CreateConversionStmt);
4007 n->conversion_name = $4;
4008 n->for_encoding_name = $6;
4009 n->to_encoding_name = $8;
4016 /*****************************************************************************
4019 * cluster <index_name> on <qualified_name>
4020 * cluster <qualified_name>
4023 *****************************************************************************/
4026 CLUSTER index_name ON qualified_name
4028 ClusterStmt *n = makeNode(ClusterStmt);
4033 | CLUSTER qualified_name
4035 ClusterStmt *n = makeNode(ClusterStmt);
4037 n->indexname = NULL;
4042 ClusterStmt *n = makeNode(ClusterStmt);
4044 n->indexname = NULL;
4049 /*****************************************************************************
4055 *****************************************************************************/
4057 VacuumStmt: VACUUM opt_full opt_freeze opt_verbose
4059 VacuumStmt *n = makeNode(VacuumStmt);
4069 | VACUUM opt_full opt_freeze opt_verbose qualified_name
4071 VacuumStmt *n = makeNode(VacuumStmt);
4081 | VACUUM opt_full opt_freeze opt_verbose AnalyzeStmt
4083 VacuumStmt *n = (VacuumStmt *) $5;
4093 analyze_keyword opt_verbose
4095 VacuumStmt *n = makeNode(VacuumStmt);
4105 | analyze_keyword opt_verbose qualified_name opt_name_list
4107 VacuumStmt *n = makeNode(VacuumStmt);
4121 | ANALYSE /* British */ {}
4125 VERBOSE { $$ = TRUE; }
4126 | /*EMPTY*/ { $$ = FALSE; }
4129 opt_full: FULL { $$ = TRUE; }
4130 | /*EMPTY*/ { $$ = FALSE; }
4133 opt_freeze: FREEZE { $$ = TRUE; }
4134 | /*EMPTY*/ { $$ = FALSE; }
4138 '(' name_list ')' { $$ = $2; }
4139 | /*EMPTY*/ { $$ = NIL; }
4143 /*****************************************************************************
4146 * EXPLAIN [ANALYZE] [VERBOSE] query
4148 *****************************************************************************/
4150 ExplainStmt: EXPLAIN opt_analyze opt_verbose ExplainableStmt
4152 ExplainStmt *n = makeNode(ExplainStmt);
4155 n->query = (Query*)$4;
4166 | ExecuteStmt /* by default all are $$=$1 */
4170 analyze_keyword { $$ = TRUE; }
4171 | /* EMPTY */ { $$ = FALSE; }
4174 /*****************************************************************************
4177 * PREPARE <plan_name> [(args, ...)] AS <query>
4179 *****************************************************************************/
4181 PrepareStmt: PREPARE name prep_type_clause AS PreparableStmt
4183 PrepareStmt *n = makeNode(PrepareStmt);
4186 n->query = (Query *) $5;
4191 prep_type_clause: '(' prep_type_list ')' { $$ = $2; }
4192 | /* EMPTY */ { $$ = NIL; }
4195 prep_type_list: Typename { $$ = makeList1($1); }
4196 | prep_type_list ',' Typename
4197 { $$ = lappend($1, $3); }
4204 | DeleteStmt /* by default all are $$=$1 */
4207 /*****************************************************************************
4209 * EXECUTE <plan_name> [(params, ...)]
4210 * CREATE TABLE <name> AS EXECUTE <plan_name> [(params, ...)]
4212 *****************************************************************************/
4214 ExecuteStmt: EXECUTE name execute_param_clause
4216 ExecuteStmt *n = makeNode(ExecuteStmt);
4222 | CREATE OptTemp TABLE qualified_name OptCreateAs AS EXECUTE name execute_param_clause
4224 ExecuteStmt *n = makeNode(ExecuteStmt);
4231 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
4232 errmsg("column name list not allowed in CREATE TABLE / AS EXECUTE")));
4233 /* ... because it's not implemented, but it could be */
4238 execute_param_clause: '(' expr_list ')' { $$ = $2; }
4239 | /* EMPTY */ { $$ = NIL; }
4242 /*****************************************************************************
4245 * DEALLOCATE [PREPARE] <plan_name>
4247 *****************************************************************************/
4249 DeallocateStmt: DEALLOCATE name
4251 DeallocateStmt *n = makeNode(DeallocateStmt);
4255 | DEALLOCATE PREPARE name
4257 DeallocateStmt *n = makeNode(DeallocateStmt);
4263 /*****************************************************************************
4268 *****************************************************************************/
4271 INSERT INTO qualified_name insert_rest
4279 VALUES '(' insert_target_list ')'
4281 $$ = makeNode(InsertStmt);
4283 $$->targetList = $3;
4284 $$->selectStmt = NULL;
4288 $$ = makeNode(InsertStmt);
4290 $$->targetList = NIL;
4291 $$->selectStmt = NULL;
4295 $$ = makeNode(InsertStmt);
4297 $$->targetList = NIL;
4298 $$->selectStmt = $1;
4300 | '(' insert_column_list ')' VALUES '(' insert_target_list ')'
4302 $$ = makeNode(InsertStmt);
4304 $$->targetList = $6;
4305 $$->selectStmt = NULL;
4307 | '(' insert_column_list ')' SelectStmt
4309 $$ = makeNode(InsertStmt);
4311 $$->targetList = NIL;
4312 $$->selectStmt = $4;
4317 insert_column_item { $$ = makeList1($1); }
4318 | insert_column_list ',' insert_column_item
4319 { $$ = lappend($1, $3); }
4323 ColId opt_indirection
4325 ResTarget *n = makeNode(ResTarget);
4327 n->indirection = $2;
4334 /*****************************************************************************
4339 *****************************************************************************/
4341 DeleteStmt: DELETE_P FROM relation_expr where_clause
4343 DeleteStmt *n = makeNode(DeleteStmt);
4345 n->whereClause = $4;
4350 LockStmt: LOCK_P opt_table qualified_name_list opt_lock
4352 LockStmt *n = makeNode(LockStmt);
4360 opt_lock: IN_P lock_type MODE { $$ = $2; }
4361 | /*EMPTY*/ { $$ = AccessExclusiveLock; }
4364 lock_type: ACCESS SHARE { $$ = AccessShareLock; }
4365 | ROW SHARE { $$ = RowShareLock; }
4366 | ROW EXCLUSIVE { $$ = RowExclusiveLock; }
4367 | SHARE UPDATE EXCLUSIVE { $$ = ShareUpdateExclusiveLock; }
4368 | SHARE { $$ = ShareLock; }
4369 | SHARE ROW EXCLUSIVE { $$ = ShareRowExclusiveLock; }
4370 | EXCLUSIVE { $$ = ExclusiveLock; }
4371 | ACCESS EXCLUSIVE { $$ = AccessExclusiveLock; }
4375 /*****************************************************************************
4378 * UpdateStmt (UPDATE)
4380 *****************************************************************************/
4382 UpdateStmt: UPDATE relation_expr
4383 SET update_target_list
4387 UpdateStmt *n = makeNode(UpdateStmt);
4391 n->whereClause = $6;
4397 /*****************************************************************************
4402 *****************************************************************************/
4403 DeclareCursorStmt: DECLARE name cursor_options CURSOR opt_hold FOR SelectStmt
4405 DeclareCursorStmt *n = makeNode(DeclareCursorStmt);
4410 n->options |= CURSOR_OPT_HOLD;
4415 cursor_options: /*EMPTY*/ { $$ = 0; }
4416 | cursor_options NO SCROLL { $$ = $1 | CURSOR_OPT_NO_SCROLL; }
4417 | cursor_options SCROLL { $$ = $1 | CURSOR_OPT_SCROLL; }
4418 | cursor_options BINARY { $$ = $1 | CURSOR_OPT_BINARY; }
4419 | cursor_options INSENSITIVE { $$ = $1 | CURSOR_OPT_INSENSITIVE; }
4422 opt_hold: /* EMPTY */ { $$ = FALSE; }
4423 | WITH HOLD { $$ = TRUE; }
4424 | WITHOUT HOLD { $$ = FALSE; }
4427 /*****************************************************************************
4432 *****************************************************************************/
4434 /* A complete SELECT statement looks like this.
4436 * The rule returns either a single SelectStmt node or a tree of them,
4437 * representing a set-operation tree.
4439 * There is an ambiguity when a sub-SELECT is within an a_expr and there
4440 * are excess parentheses: do the parentheses belong to the sub-SELECT or
4441 * to the surrounding a_expr? We don't really care, but yacc wants to know.
4442 * To resolve the ambiguity, we are careful to define the grammar so that
4443 * the decision is staved off as long as possible: as long as we can keep
4444 * absorbing parentheses into the sub-SELECT, we will do so, and only when
4445 * it's no longer possible to do that will we decide that parens belong to
4446 * the expression. For example, in "SELECT (((SELECT 2)) + 3)" the extra
4447 * parentheses are treated as part of the sub-select. The necessity of doing
4448 * it that way is shown by "SELECT (((SELECT 2)) UNION SELECT 2)". Had we
4449 * parsed "((SELECT 2))" as an a_expr, it'd be too late to go back to the
4450 * SELECT viewpoint when we see the UNION.
4452 * This approach is implemented by defining a nonterminal select_with_parens,
4453 * which represents a SELECT with at least one outer layer of parentheses,
4454 * and being careful to use select_with_parens, never '(' SelectStmt ')',
4455 * in the expression grammar. We will then have shift-reduce conflicts
4456 * which we can resolve in favor of always treating '(' <select> ')' as
4457 * a select_with_parens. To resolve the conflicts, the productions that
4458 * conflict with the select_with_parens productions are manually given
4459 * precedences lower than the precedence of ')', thereby ensuring that we
4460 * shift ')' (and then reduce to select_with_parens) rather than trying to
4461 * reduce the inner <select> nonterminal to something else. We use UMINUS
4462 * precedence for this, which is a fairly arbitrary choice.
4464 * To be able to define select_with_parens itself without ambiguity, we need
4465 * a nonterminal select_no_parens that represents a SELECT structure with no
4466 * outermost parentheses. This is a little bit tedious, but it works.
4468 * In non-expression contexts, we use SelectStmt which can represent a SELECT
4469 * with or without outer parentheses.
4472 SelectStmt: select_no_parens %prec UMINUS
4473 | select_with_parens %prec UMINUS
4477 '(' select_no_parens ')' { $$ = $2; }
4478 | '(' select_with_parens ')' { $$ = $2; }
4482 * FOR UPDATE may be before or after LIMIT/OFFSET.
4483 * In <=7.2.X, LIMIT/OFFSET had to be after FOR UPDATE
4484 * We now support both orderings, but prefer LIMIT/OFFSET before FOR UPDATE
4488 simple_select { $$ = $1; }
4489 | select_clause sort_clause
4491 insertSelectOptions((SelectStmt *) $1, $2, NIL,
4495 | select_clause opt_sort_clause for_update_clause opt_select_limit
4497 insertSelectOptions((SelectStmt *) $1, $2, $3,
4498 nth(0, $4), nth(1, $4));
4501 | select_clause opt_sort_clause select_limit opt_for_update_clause
4503 insertSelectOptions((SelectStmt *) $1, $2, $4,
4504 nth(0, $3), nth(1, $3));
4510 simple_select { $$ = $1; }
4511 | select_with_parens { $$ = $1; }
4515 * This rule parses SELECT statements that can appear within set operations,
4516 * including UNION, INTERSECT and EXCEPT. '(' and ')' can be used to specify
4517 * the ordering of the set operations. Without '(' and ')' we want the
4518 * operations to be ordered per the precedence specs at the head of this file.
4520 * As with select_no_parens, simple_select cannot have outer parentheses,
4521 * but can have parenthesized subclauses.
4523 * Note that sort clauses cannot be included at this level --- SQL92 requires
4524 * SELECT foo UNION SELECT bar ORDER BY baz
4526 * (SELECT foo UNION SELECT bar) ORDER BY baz
4528 * SELECT foo UNION (SELECT bar ORDER BY baz)
4529 * Likewise FOR UPDATE and LIMIT. Therefore, those clauses are described
4530 * as part of the select_no_parens production, not simple_select.
4531 * This does not limit functionality, because you can reintroduce sort and
4532 * limit clauses inside parentheses.
4534 * NOTE: only the leftmost component SelectStmt should have INTO.
4535 * However, this is not checked by the grammar; parse analysis must check it.
4538 SELECT opt_distinct target_list
4539 into_clause from_clause where_clause
4540 group_clause having_clause
4542 SelectStmt *n = makeNode(SelectStmt);
4543 n->distinctClause = $2;
4546 n->intoColNames = NIL;
4547 n->intoHasOids = DEFAULT_OIDS;
4549 n->whereClause = $6;
4550 n->groupClause = $7;
4551 n->havingClause = $8;
4554 | select_clause UNION opt_all select_clause
4556 $$ = makeSetOp(SETOP_UNION, $3, $1, $4);
4558 | select_clause INTERSECT opt_all select_clause
4560 $$ = makeSetOp(SETOP_INTERSECT, $3, $1, $4);
4562 | select_clause EXCEPT opt_all select_clause
4564 $$ = makeSetOp(SETOP_EXCEPT, $3, $1, $4);
4569 INTO OptTempTableName { $$ = $2; }
4570 | /*EMPTY*/ { $$ = NULL; }
4574 * Redundancy here is needed to avoid shift/reduce conflicts,
4575 * since TEMP is not a reserved word. See also OptTemp.
4578 TEMPORARY opt_table qualified_name
4583 | TEMP opt_table qualified_name
4588 | LOCAL TEMPORARY opt_table qualified_name
4593 | LOCAL TEMP opt_table qualified_name
4598 | GLOBAL TEMPORARY opt_table qualified_name
4603 | GLOBAL TEMP opt_table qualified_name
4608 | TABLE qualified_name
4624 opt_all: ALL { $$ = TRUE; }
4625 | DISTINCT { $$ = FALSE; }
4626 | /*EMPTY*/ { $$ = FALSE; }
4629 /* We use (NIL) as a placeholder to indicate that all target expressions
4630 * should be placed in the DISTINCT list during parsetree analysis.
4633 DISTINCT { $$ = makeList1(NIL); }
4634 | DISTINCT ON '(' expr_list ')' { $$ = $4; }
4636 | /*EMPTY*/ { $$ = NIL; }
4640 sort_clause { $$ = $1;}
4641 | /*EMPTY*/ { $$ = NIL; }
4645 ORDER BY sortby_list { $$ = $3; }
4649 sortby { $$ = makeList1($1); }
4650 | sortby_list ',' sortby { $$ = lappend($1, $3); }
4653 sortby: a_expr USING qual_all_Op
4655 $$ = makeNode(SortBy);
4657 $$->sortby_kind = SORTBY_USING;
4662 $$ = makeNode(SortBy);
4664 $$->sortby_kind = SORTBY_ASC;
4669 $$ = makeNode(SortBy);
4671 $$->sortby_kind = SORTBY_DESC;
4676 $$ = makeNode(SortBy);
4678 $$->sortby_kind = SORTBY_ASC; /* default */
4685 LIMIT select_limit_value OFFSET select_offset_value
4686 { $$ = makeList2($4, $2); }
4687 | OFFSET select_offset_value LIMIT select_limit_value
4688 { $$ = makeList2($2, $4); }
4689 | LIMIT select_limit_value
4690 { $$ = makeList2(NULL, $2); }
4691 | OFFSET select_offset_value
4692 { $$ = makeList2($2, NULL); }
4693 | LIMIT select_limit_value ',' select_offset_value
4695 /* Disabled because it was too confusing, bjm 2002-02-18 */
4697 (errcode(ERRCODE_SYNTAX_ERROR),
4698 errmsg("LIMIT #,# syntax is not supported"),
4699 errhint("Use separate LIMIT and OFFSET clauses.")));
4704 select_limit { $$ = $1; }
4706 { $$ = makeList2(NULL,NULL); }
4713 /* LIMIT ALL is represented as a NULL constant */
4714 A_Const *n = makeNode(A_Const);
4715 n->val.type = T_Null;
4720 select_offset_value:
4725 * jimmy bell-style recursive queries aren't supported in the
4728 * ...however, recursive addattr and rename supported. make special
4733 GROUP_P BY expr_list { $$ = $3; }
4734 | /*EMPTY*/ { $$ = NIL; }
4738 HAVING a_expr { $$ = $2; }
4739 | /*EMPTY*/ { $$ = NULL; }
4743 FOR UPDATE update_list { $$ = $3; }
4744 | FOR READ ONLY { $$ = NULL; }
4747 opt_for_update_clause:
4748 for_update_clause { $$ = $1; }
4749 | /* EMPTY */ { $$ = NULL; }
4753 OF name_list { $$ = $2; }
4754 | /* EMPTY */ { $$ = makeList1(NULL); }
4757 /*****************************************************************************
4759 * clauses common to all Optimizable Stmts:
4760 * from_clause - allow list of both JOIN expressions and table names
4761 * where_clause - qualifications for joins or restrictions
4763 *****************************************************************************/
4766 FROM from_list { $$ = $2; }
4767 | /*EMPTY*/ { $$ = NIL; }
4771 table_ref { $$ = makeList1($1); }
4772 | from_list ',' table_ref { $$ = lappend($1, $3); }
4776 * table_ref is where an alias clause can be attached. Note we cannot make
4777 * alias_clause have an empty production because that causes parse conflicts
4778 * between table_ref := '(' joined_table ')' alias_clause
4779 * and joined_table := '(' joined_table ')'. So, we must have the
4780 * redundant-looking productions here instead.
4782 table_ref: relation_expr
4786 | relation_expr alias_clause
4793 RangeFunction *n = makeNode(RangeFunction);
4794 n->funccallnode = $1;
4795 n->coldeflist = NIL;
4798 | func_table alias_clause
4800 RangeFunction *n = makeNode(RangeFunction);
4801 n->funccallnode = $1;
4803 n->coldeflist = NIL;
4806 | func_table AS '(' TableFuncElementList ')'
4808 RangeFunction *n = makeNode(RangeFunction);
4809 n->funccallnode = $1;
4813 | func_table AS ColId '(' TableFuncElementList ')'
4815 RangeFunction *n = makeNode(RangeFunction);
4816 Alias *a = makeNode(Alias);
4817 n->funccallnode = $1;
4823 | func_table ColId '(' TableFuncElementList ')'
4825 RangeFunction *n = makeNode(RangeFunction);
4826 Alias *a = makeNode(Alias);
4827 n->funccallnode = $1;
4833 | select_with_parens
4836 * The SQL spec does not permit a subselect
4837 * (<derived_table>) without an alias clause,
4838 * so we don't either. This avoids the problem
4839 * of needing to invent a unique refname for it.
4840 * That could be surmounted if there's sufficient
4841 * popular demand, but for now let's just implement
4842 * the spec and see if anyone complains.
4843 * However, it does seem like a good idea to emit
4844 * an error message that's better than "syntax error".
4847 (errcode(ERRCODE_SYNTAX_ERROR),
4848 errmsg("subquery in FROM must have an alias"),
4849 errhint("For example, FROM (SELECT ...) [AS] foo.")));
4852 | select_with_parens alias_clause
4854 RangeSubselect *n = makeNode(RangeSubselect);
4863 | '(' joined_table ')' alias_clause
4872 * It may seem silly to separate joined_table from table_ref, but there is
4873 * method in SQL92's madness: if you don't do it this way you get reduce-
4874 * reduce conflicts, because it's not clear to the parser generator whether
4875 * to expect alias_clause after ')' or not. For the same reason we must
4876 * treat 'JOIN' and 'join_type JOIN' separately, rather than allowing
4877 * join_type to expand to empty; if we try it, the parser generator can't
4878 * figure out when to reduce an empty join_type right after table_ref.
4880 * Note that a CROSS JOIN is the same as an unqualified
4881 * INNER JOIN, and an INNER JOIN/ON has the same shape
4882 * but a qualification expression to limit membership.
4883 * A NATURAL JOIN implicitly matches column names between
4884 * tables and the shape is determined by which columns are
4885 * in common. We'll collect columns during the later transformations.
4889 '(' joined_table ')'
4893 | table_ref CROSS JOIN table_ref
4895 /* CROSS JOIN is same as unqualified inner join */
4896 JoinExpr *n = makeNode(JoinExpr);
4897 n->jointype = JOIN_INNER;
4898 n->isNatural = FALSE;
4905 | table_ref UNIONJOIN table_ref
4907 /* UNION JOIN is made into 1 token to avoid shift/reduce
4908 * conflict against regular UNION keyword.
4910 JoinExpr *n = makeNode(JoinExpr);
4911 n->jointype = JOIN_UNION;
4912 n->isNatural = FALSE;
4919 | table_ref join_type JOIN table_ref join_qual
4921 JoinExpr *n = makeNode(JoinExpr);
4923 n->isNatural = FALSE;
4926 if ($5 != NULL && IsA($5, List))
4927 n->using = (List *) $5; /* USING clause */
4929 n->quals = $5; /* ON clause */
4932 | table_ref JOIN table_ref join_qual
4934 /* letting join_type reduce to empty doesn't work */
4935 JoinExpr *n = makeNode(JoinExpr);
4936 n->jointype = JOIN_INNER;
4937 n->isNatural = FALSE;
4940 if ($4 != NULL && IsA($4, List))
4941 n->using = (List *) $4; /* USING clause */
4943 n->quals = $4; /* ON clause */
4946 | table_ref NATURAL join_type JOIN table_ref
4948 JoinExpr *n = makeNode(JoinExpr);
4950 n->isNatural = TRUE;
4953 n->using = NIL; /* figure out which columns later... */
4954 n->quals = NULL; /* fill later */
4957 | table_ref NATURAL JOIN table_ref
4959 /* letting join_type reduce to empty doesn't work */
4960 JoinExpr *n = makeNode(JoinExpr);
4961 n->jointype = JOIN_INNER;
4962 n->isNatural = TRUE;
4965 n->using = NIL; /* figure out which columns later... */
4966 n->quals = NULL; /* fill later */
4972 AS ColId '(' name_list ')'
4974 $$ = makeNode(Alias);
4980 $$ = makeNode(Alias);
4983 | ColId '(' name_list ')'
4985 $$ = makeNode(Alias);
4991 $$ = makeNode(Alias);
4996 join_type: FULL join_outer { $$ = JOIN_FULL; }
4997 | LEFT join_outer { $$ = JOIN_LEFT; }
4998 | RIGHT join_outer { $$ = JOIN_RIGHT; }
4999 | INNER_P { $$ = JOIN_INNER; }
5002 /* OUTER is just noise... */
5003 join_outer: OUTER_P { $$ = NULL; }
5004 | /*EMPTY*/ { $$ = NULL; }
5007 /* JOIN qualification clauses
5008 * Possibilities are:
5009 * USING ( column list ) allows only unqualified column names,
5010 * which must match between tables.
5011 * ON expr allows more general qualifications.
5013 * We return USING as a List node, while an ON-expr will not be a List.
5016 join_qual: USING '(' name_list ')' { $$ = (Node *) $3; }
5017 | ON a_expr { $$ = $2; }
5024 /* default inheritance */
5026 $$->inhOpt = INH_DEFAULT;
5029 | qualified_name '*'
5031 /* inheritance query */
5033 $$->inhOpt = INH_YES;
5036 | ONLY qualified_name
5038 /* no inheritance */
5040 $$->inhOpt = INH_NO;
5043 | ONLY '(' qualified_name ')'
5045 /* no inheritance, SQL99-style syntax */
5047 $$->inhOpt = INH_NO;
5053 func_table: func_name '(' ')'
5055 FuncCall *n = makeNode(FuncCall);
5058 n->agg_star = FALSE;
5059 n->agg_distinct = FALSE;
5062 | func_name '(' expr_list ')'
5064 FuncCall *n = makeNode(FuncCall);
5067 n->agg_star = FALSE;
5068 n->agg_distinct = FALSE;
5075 WHERE a_expr { $$ = $2; }
5076 | /*EMPTY*/ { $$ = NULL; }
5080 TableFuncElementList:
5085 | TableFuncElementList ',' TableFuncElement
5087 $$ = lappend($1, $3);
5091 TableFuncElement: ColId Typename
5093 ColumnDef *n = makeNode(ColumnDef);
5096 n->constraints = NIL;
5102 /*****************************************************************************
5105 * SQL92 introduces a large amount of type-specific syntax.
5106 * Define individual clauses to handle these cases, and use
5107 * the generic case to handle regular type-extensible Postgres syntax.
5108 * - thomas 1997-10-10
5110 *****************************************************************************/
5112 Typename: SimpleTypename opt_array_bounds
5115 $$->arrayBounds = $2;
5117 | SETOF SimpleTypename opt_array_bounds
5120 $$->arrayBounds = $3;
5123 | SimpleTypename ARRAY '[' Iconst ']'
5125 /* SQL99's redundant syntax */
5127 $$->arrayBounds = makeList1(makeInteger($4));
5129 | SETOF SimpleTypename ARRAY '[' Iconst ']'
5131 /* SQL99's redundant syntax */
5133 $$->arrayBounds = makeList1(makeInteger($5));
5139 opt_array_bounds '[' ']'
5140 { $$ = lappend($1, makeInteger(-1)); }
5141 | opt_array_bounds '[' Iconst ']'
5142 { $$ = lappend($1, makeInteger($3)); }
5148 * XXX ideally, the production for a qualified typename should be ColId attrs
5149 * (there's no obvious reason why the first name should need to be restricted)
5150 * and should be an alternative of GenericType (so that it can be used to
5151 * specify a type for a literal in AExprConst). However doing either causes
5152 * reduce/reduce conflicts that I haven't been able to find a workaround
5156 GenericType { $$ = $1; }
5157 | Numeric { $$ = $1; }
5159 | Character { $$ = $1; }
5160 | ConstDatetime { $$ = $1; }
5161 | ConstInterval opt_interval
5164 if ($2 != INTERVAL_FULL_RANGE)
5165 $$->typmod = INTERVAL_TYPMOD(INTERVAL_FULL_PRECISION, $2);
5167 | ConstInterval '(' Iconst ')' opt_interval
5172 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5173 errmsg("INTERVAL(%d) precision must not be negative",
5175 if ($3 > MAX_INTERVAL_PRECISION)
5178 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5179 errmsg("INTERVAL(%d) precision reduced to maximum allowed, %d",
5180 $3, MAX_INTERVAL_PRECISION)));
5181 $3 = MAX_INTERVAL_PRECISION;
5183 $$->typmod = INTERVAL_TYPMOD($3, $5);
5187 $$ = makeNode(TypeName);
5188 $$->names = lcons(makeString($1), $2);
5193 /* We have a separate ConstTypename to allow defaulting fixed-length
5194 * types such as CHAR() and BIT() to an unspecified length.
5195 * SQL9x requires that these default to a length of one, but this
5196 * makes no sense for constructs like CHAR 'hi' and BIT '0101',
5197 * where there is an obvious better choice to make.
5198 * Note that ConstInterval is not included here since it must
5199 * be pushed up higher in the rules to accomodate the postfix
5200 * options (e.g. INTERVAL '1' YEAR).
5203 GenericType { $$ = $1; }
5204 | Numeric { $$ = $1; }
5205 | ConstBit { $$ = $1; }
5206 | ConstCharacter { $$ = $1; }
5207 | ConstDatetime { $$ = $1; }
5213 $$ = makeTypeName($1);
5217 /* SQL92 numeric data types
5218 * Check FLOAT() precision limits assuming IEEE floating types.
5219 * - thomas 1997-09-18
5220 * Provide real DECIMAL() and NUMERIC() implementations now - Jan 1998-12-30
5224 $$ = SystemTypeName("int4");
5228 $$ = SystemTypeName("int4");
5232 $$ = SystemTypeName("int2");
5236 $$ = SystemTypeName("int8");
5240 $$ = SystemTypeName("float4");
5246 | DOUBLE_P PRECISION
5248 $$ = SystemTypeName("float8");
5250 | DECIMAL_P opt_decimal
5252 $$ = SystemTypeName("numeric");
5257 $$ = SystemTypeName("numeric");
5260 | NUMERIC opt_numeric
5262 $$ = SystemTypeName("numeric");
5267 $$ = SystemTypeName("bool");
5271 opt_float: '(' Iconst ')'
5275 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5276 errmsg("precision for type float must be at least 1 bit")));
5278 $$ = SystemTypeName("float4");
5280 $$ = SystemTypeName("float8");
5283 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5284 errmsg("precision for type float must be less than 54 bits")));
5288 $$ = SystemTypeName("float8");
5293 '(' Iconst ',' Iconst ')'
5295 if ($2 < 1 || $2 > NUMERIC_MAX_PRECISION)
5297 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5298 errmsg("NUMERIC precision %d must be between 1 and %d",
5299 $2, NUMERIC_MAX_PRECISION)));
5300 if ($4 < 0 || $4 > $2)
5302 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5303 errmsg("NUMERIC scale %d must be between 0 and precision %d",
5306 $$ = (($2 << 16) | $4) + VARHDRSZ;
5310 if ($2 < 1 || $2 > NUMERIC_MAX_PRECISION)
5312 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5313 errmsg("NUMERIC precision %d must be between 1 and %d",
5314 $2, NUMERIC_MAX_PRECISION)));
5316 $$ = ($2 << 16) + VARHDRSZ;
5320 /* Insert "-1" meaning "no limit" */
5326 '(' Iconst ',' Iconst ')'
5328 if ($2 < 1 || $2 > NUMERIC_MAX_PRECISION)
5330 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5331 errmsg("DECIMAL precision %d must be between 1 and %d",
5332 $2, NUMERIC_MAX_PRECISION)));
5333 if ($4 < 0 || $4 > $2)
5335 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5336 errmsg("DECIMAL scale %d must be between 0 and precision %d",
5339 $$ = (($2 << 16) | $4) + VARHDRSZ;
5343 if ($2 < 1 || $2 > NUMERIC_MAX_PRECISION)
5345 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5346 errmsg("DECIMAL precision %d must be between 1 and %d",
5347 $2, NUMERIC_MAX_PRECISION)));
5349 $$ = ($2 << 16) + VARHDRSZ;
5353 /* Insert "-1" meaning "no limit" */
5360 * SQL92 bit-field data types
5361 * The following implements BIT() and BIT VARYING().
5373 /* ConstBit is like Bit except "BIT" defaults to unspecified length */
5374 /* See notes for ConstCharacter, which addresses same issue for "CHAR" */
5375 ConstBit: BitWithLength
5387 BIT opt_varying '(' Iconst ')'
5391 typname = $2 ? "varbit" : "bit";
5392 $$ = SystemTypeName(typname);
5395 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5396 errmsg("length for type %s must be at least 1",
5398 else if ($4 > (MaxAttrSize * BITS_PER_BYTE))
5400 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5401 errmsg("length for type %s cannot exceed %d",
5402 typname, MaxAttrSize * BITS_PER_BYTE)));
5410 /* bit defaults to bit(1), varbit to no limit */
5413 $$ = SystemTypeName("varbit");
5418 $$ = SystemTypeName("bit");
5426 * SQL92 character data types
5427 * The following implements CHAR() and VARCHAR().
5429 Character: CharacterWithLength
5433 | CharacterWithoutLength
5439 ConstCharacter: CharacterWithLength
5443 | CharacterWithoutLength
5445 /* Length was not specified so allow to be unrestricted.
5446 * This handles problems with fixed-length (bpchar) strings
5447 * which in column definitions must default to a length
5448 * of one, but should not be constrained if the length
5449 * was not specified.
5456 CharacterWithLength: character '(' Iconst ')' opt_charset
5458 if (($5 != NULL) && (strcmp($5, "sql_text") != 0))
5462 type = palloc(strlen($1) + 1 + strlen($5) + 1);
5469 $$ = SystemTypeName($1);
5473 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5474 errmsg("length for type %s must be at least 1",
5476 else if ($3 > MaxAttrSize)
5478 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5479 errmsg("length for type %s cannot exceed %d",
5482 /* we actually implement these like a varlen, so
5483 * the first 4 bytes is the length. (the difference
5484 * between these and "text" is that we blank-pad and
5485 * truncate where necessary)
5487 $$->typmod = VARHDRSZ + $3;
5491 CharacterWithoutLength: character opt_charset
5493 if (($2 != NULL) && (strcmp($2, "sql_text") != 0))
5497 type = palloc(strlen($1) + 1 + strlen($2) + 1);
5504 $$ = SystemTypeName($1);
5506 /* char defaults to char(1), varchar to no limit */
5507 if (strcmp($1, "bpchar") == 0)
5508 $$->typmod = VARHDRSZ + 1;
5514 character: CHARACTER opt_varying
5515 { $$ = $2 ? "varchar": "bpchar"; }
5516 | CHAR_P opt_varying
5517 { $$ = $2 ? "varchar": "bpchar"; }
5520 | NATIONAL CHARACTER opt_varying
5521 { $$ = $3 ? "varchar": "bpchar"; }
5522 | NATIONAL CHAR_P opt_varying
5523 { $$ = $3 ? "varchar": "bpchar"; }
5525 { $$ = $2 ? "varchar": "bpchar"; }
5529 VARYING { $$ = TRUE; }
5530 | /*EMPTY*/ { $$ = FALSE; }
5534 CHARACTER SET ColId { $$ = $3; }
5535 | /*EMPTY*/ { $$ = NULL; }
5539 TIMESTAMP '(' Iconst ')' opt_timezone
5542 $$ = SystemTypeName("timestamptz");
5544 $$ = SystemTypeName("timestamp");
5545 /* XXX the timezone field seems to be unused
5546 * - thomas 2001-09-06
5551 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5552 errmsg("TIMESTAMP(%d)%s precision must not be negative",
5553 $3, ($5 ? " WITH TIME ZONE": ""))));
5554 if ($3 > MAX_TIMESTAMP_PRECISION)
5557 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5558 errmsg("TIMESTAMP(%d)%s precision reduced to maximum allowed, %d",
5559 $3, ($5 ? " WITH TIME ZONE": ""),
5560 MAX_TIMESTAMP_PRECISION)));
5561 $3 = MAX_TIMESTAMP_PRECISION;
5565 | TIMESTAMP opt_timezone
5568 $$ = SystemTypeName("timestamptz");
5570 $$ = SystemTypeName("timestamp");
5571 /* XXX the timezone field seems to be unused
5572 * - thomas 2001-09-06
5575 /* SQL99 specified a default precision of six
5576 * for schema definitions. But for timestamp
5577 * literals we don't want to throw away precision
5578 * so leave this as unspecified for now.
5579 * Later, we may want a different production
5580 * for schemas. - thomas 2001-12-07
5584 | TIME '(' Iconst ')' opt_timezone
5587 $$ = SystemTypeName("timetz");
5589 $$ = SystemTypeName("time");
5592 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5593 errmsg("TIME(%d)%s precision must not be negative",
5594 $3, ($5 ? " WITH TIME ZONE": ""))));
5595 if ($3 > MAX_TIME_PRECISION)
5598 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5599 errmsg("TIME(%d)%s precision reduced to maximum allowed, %d",
5600 $3, ($5 ? " WITH TIME ZONE": ""),
5601 MAX_TIME_PRECISION)));
5602 $3 = MAX_TIME_PRECISION;
5609 $$ = SystemTypeName("timetz");
5611 $$ = SystemTypeName("time");
5612 /* SQL99 specified a default precision of zero.
5613 * See comments for timestamp above on why we will
5614 * leave this unspecified for now. - thomas 2001-12-07
5621 INTERVAL { $$ = SystemTypeName("interval"); }
5625 WITH TIME ZONE { $$ = TRUE; }
5626 | WITHOUT TIME ZONE { $$ = FALSE; }
5627 | /*EMPTY*/ { $$ = FALSE; }
5631 YEAR_P { $$ = INTERVAL_MASK(YEAR); }
5632 | MONTH_P { $$ = INTERVAL_MASK(MONTH); }
5633 | DAY_P { $$ = INTERVAL_MASK(DAY); }
5634 | HOUR_P { $$ = INTERVAL_MASK(HOUR); }
5635 | MINUTE_P { $$ = INTERVAL_MASK(MINUTE); }
5636 | SECOND_P { $$ = INTERVAL_MASK(SECOND); }
5638 { $$ = INTERVAL_MASK(YEAR) | INTERVAL_MASK(MONTH); }
5640 { $$ = INTERVAL_MASK(DAY) | INTERVAL_MASK(HOUR); }
5642 { $$ = INTERVAL_MASK(DAY) | INTERVAL_MASK(HOUR)
5643 | INTERVAL_MASK(MINUTE); }
5645 { $$ = INTERVAL_MASK(DAY) | INTERVAL_MASK(HOUR)
5646 | INTERVAL_MASK(MINUTE) | INTERVAL_MASK(SECOND); }
5647 | HOUR_P TO MINUTE_P
5648 { $$ = INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE); }
5649 | HOUR_P TO SECOND_P
5650 { $$ = INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE)
5651 | INTERVAL_MASK(SECOND); }
5652 | MINUTE_P TO SECOND_P
5653 { $$ = INTERVAL_MASK(MINUTE) | INTERVAL_MASK(SECOND); }
5654 | /*EMPTY*/ { $$ = INTERVAL_FULL_RANGE; }
5658 /*****************************************************************************
5660 * expression grammar
5662 *****************************************************************************/
5664 /* Expressions using row descriptors
5665 * Define row_descriptor to allow yacc to break the reduce/reduce conflict
5666 * with singleton expressions. Use SQL99's ROW keyword to allow rows of
5669 r_expr: row IN_P select_with_parens
5671 SubLink *n = makeNode(SubLink);
5672 n->subLinkType = ANY_SUBLINK;
5674 n->operName = makeList1(makeString("="));
5678 | row NOT IN_P select_with_parens
5680 /* Make an IN node */
5681 SubLink *n = makeNode(SubLink);
5682 n->subLinkType = ANY_SUBLINK;
5684 n->operName = makeList1(makeString("="));
5686 /* Stick a NOT on top */
5687 $$ = (Node *) makeA_Expr(AEXPR_NOT, NIL, NULL, (Node *) n);
5689 | row qual_all_Op sub_type select_with_parens
5692 SubLink *n = makeNode(SubLink);
5693 n->subLinkType = $3;
5699 | row qual_all_Op select_with_parens
5702 SubLink *n = makeNode(SubLink);
5703 n->subLinkType = MULTIEXPR_SUBLINK;
5709 | row qual_all_Op row
5712 $$ = makeRowExpr($2, $1, $3);
5716 $$ = makeRowNullTest(IS_NULL, $1);
5720 $$ = makeRowNullTest(IS_NOT_NULL, $1);
5724 $$ = (Node *)makeOverlaps($1, $3);
5726 | row IS DISTINCT FROM row
5729 /* IS DISTINCT FROM has the following rules for non-array types:
5730 * a) the row lengths must be equal
5731 * b) if both rows are zero-length, then they are not distinct
5732 * c) if any element is distinct, the rows are distinct
5733 * The rules for an element being distinct:
5734 * a) if the elements are both NULL, then they are not distinct
5735 * b) if the elements compare to be equal, then they are not distinct
5736 * c) otherwise, they are distinct
5740 /* lengths don't match? then complain */
5741 if (length(largs) != length(rargs))
5744 (errcode(ERRCODE_SYNTAX_ERROR),
5745 errmsg("unequal number of entries in row expression")));
5747 /* both are zero-length rows? then they are not distinct */
5748 else if (length(largs) <= 0)
5750 $$ = (Node *)makeBoolConst(FALSE);
5752 /* otherwise, we need to compare each element */
5755 $$ = (Node *)makeDistinctExpr(largs, rargs);
5760 /* Explicit row production.
5761 * SQL99 allows an optional ROW keyword, so we can now do single-element productions
5762 * without conflicting with the parenthesized a_expr production.
5764 row: ROW '(' row_descriptor ')' { $$ = $3; }
5765 | ROW '(' a_expr ')' { $$ = makeList1($3); }
5766 | ROW '(' ')' { $$ = NULL; }
5767 | '(' row_descriptor ')' { $$ = $2; }
5770 row_descriptor: expr_list ',' a_expr { $$ = lappend($1, $3); }
5773 sub_type: ANY { $$ = ANY_SUBLINK; }
5774 | SOME { $$ = ANY_SUBLINK; }
5775 | ALL { $$ = ALL_SUBLINK; }
5778 all_Op: Op { $$ = $1; }
5779 | MathOp { $$ = $1; }
5782 MathOp: '+' { $$ = "+"; }
5794 { $$ = makeList1(makeString($1)); }
5795 | OPERATOR '(' any_operator ')' { $$ = $3; }
5800 { $$ = makeList1(makeString($1)); }
5801 | OPERATOR '(' any_operator ')' { $$ = $3; }
5805 * General expressions
5806 * This is the heart of the expression syntax.
5808 * We have two expression types: a_expr is the unrestricted kind, and
5809 * b_expr is a subset that must be used in some places to avoid shift/reduce
5810 * conflicts. For example, we can't do BETWEEN as "BETWEEN a_expr AND a_expr"
5811 * because that use of AND conflicts with AND as a boolean operator. So,
5812 * b_expr is used in BETWEEN and we remove boolean keywords from b_expr.
5814 * Note that '(' a_expr ')' is a b_expr, so an unrestricted expression can
5815 * always be used by surrounding it with parens.
5817 * c_expr is all the productions that are common to a_expr and b_expr;
5818 * it's factored out just to eliminate redundant coding.
5820 a_expr: c_expr { $$ = $1; }
5821 | a_expr TYPECAST Typename
5822 { $$ = makeTypeCast($1, $3); }
5823 | a_expr AT TIME ZONE c_expr
5825 FuncCall *n = makeNode(FuncCall);
5826 n->funcname = SystemFuncName("timezone");
5827 n->args = makeList2($5, $1);
5828 n->agg_star = FALSE;
5829 n->agg_distinct = FALSE;
5833 * These operators must be called out explicitly in order to make use
5834 * of yacc/bison's automatic operator-precedence handling. All other
5835 * operator names are handled by the generic productions using "Op",
5836 * below; and all those operators will have the same precedence.
5838 * If you add more explicitly-known operators, be sure to add them
5839 * also to b_expr and to the MathOp list above.
5841 | '+' a_expr %prec UMINUS
5842 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "+", NULL, $2); }
5843 | '-' a_expr %prec UMINUS
5844 { $$ = doNegate($2); }
5846 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "%", NULL, $2); }
5848 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "^", NULL, $2); }
5850 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "%", $1, NULL); }
5852 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "^", $1, NULL); }
5854 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "+", $1, $3); }
5856 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "-", $1, $3); }
5858 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "*", $1, $3); }
5860 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "/", $1, $3); }
5862 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "%", $1, $3); }
5864 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "^", $1, $3); }
5866 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "<", $1, $3); }
5868 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, ">", $1, $3); }
5870 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "=", $1, $3); }
5872 | a_expr qual_Op a_expr %prec Op
5873 { $$ = (Node *) makeA_Expr(AEXPR_OP, $2, $1, $3); }
5874 | qual_Op a_expr %prec Op
5875 { $$ = (Node *) makeA_Expr(AEXPR_OP, $1, NULL, $2); }
5876 | a_expr qual_Op %prec POSTFIXOP
5877 { $$ = (Node *) makeA_Expr(AEXPR_OP, $2, $1, NULL); }
5880 { $$ = (Node *) makeA_Expr(AEXPR_AND, NIL, $1, $3); }
5882 { $$ = (Node *) makeA_Expr(AEXPR_OR, NIL, $1, $3); }
5884 { $$ = (Node *) makeA_Expr(AEXPR_NOT, NIL, NULL, $2); }
5886 | a_expr LIKE a_expr
5887 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "~~", $1, $3); }
5888 | a_expr LIKE a_expr ESCAPE a_expr
5890 FuncCall *n = makeNode(FuncCall);
5891 n->funcname = SystemFuncName("like_escape");
5892 n->args = makeList2($3, $5);
5893 n->agg_star = FALSE;
5894 n->agg_distinct = FALSE;
5895 $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "~~", $1, (Node *) n);
5897 | a_expr NOT LIKE a_expr
5898 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "!~~", $1, $4); }
5899 | a_expr NOT LIKE a_expr ESCAPE a_expr
5901 FuncCall *n = makeNode(FuncCall);
5902 n->funcname = SystemFuncName("like_escape");
5903 n->args = makeList2($4, $6);
5904 n->agg_star = FALSE;
5905 n->agg_distinct = FALSE;
5906 $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "!~~", $1, (Node *) n);
5908 | a_expr ILIKE a_expr
5909 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "~~*", $1, $3); }
5910 | a_expr ILIKE a_expr ESCAPE a_expr
5912 FuncCall *n = makeNode(FuncCall);
5913 n->funcname = SystemFuncName("like_escape");
5914 n->args = makeList2($3, $5);
5915 n->agg_star = FALSE;
5916 n->agg_distinct = FALSE;
5917 $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "~~*", $1, (Node *) n);
5919 | a_expr NOT ILIKE a_expr
5920 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "!~~*", $1, $4); }
5921 | a_expr NOT ILIKE a_expr ESCAPE a_expr
5923 FuncCall *n = makeNode(FuncCall);
5924 n->funcname = SystemFuncName("like_escape");
5925 n->args = makeList2($4, $6);
5926 n->agg_star = FALSE;
5927 n->agg_distinct = FALSE;
5928 $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "!~~*", $1, (Node *) n);
5931 | a_expr SIMILAR TO a_expr %prec SIMILAR
5933 A_Const *c = makeNode(A_Const);
5934 FuncCall *n = makeNode(FuncCall);
5935 c->val.type = T_Null;
5936 n->funcname = SystemFuncName("similar_escape");
5937 n->args = makeList2($4, (Node *) c);
5938 n->agg_star = FALSE;
5939 n->agg_distinct = FALSE;
5940 $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "~", $1, (Node *) n);
5942 | a_expr SIMILAR TO a_expr ESCAPE a_expr
5944 FuncCall *n = makeNode(FuncCall);
5945 n->funcname = SystemFuncName("similar_escape");
5946 n->args = makeList2($4, $6);
5947 n->agg_star = FALSE;
5948 n->agg_distinct = FALSE;
5949 $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "~", $1, (Node *) n);
5951 | a_expr NOT SIMILAR TO a_expr %prec SIMILAR
5953 A_Const *c = makeNode(A_Const);
5954 FuncCall *n = makeNode(FuncCall);
5955 c->val.type = T_Null;
5956 n->funcname = SystemFuncName("similar_escape");
5957 n->args = makeList2($5, (Node *) c);
5958 n->agg_star = FALSE;
5959 n->agg_distinct = FALSE;
5960 $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "!~", $1, (Node *) n);
5962 | a_expr NOT SIMILAR TO a_expr ESCAPE a_expr
5964 FuncCall *n = makeNode(FuncCall);
5965 n->funcname = SystemFuncName("similar_escape");
5966 n->args = makeList2($5, $7);
5967 n->agg_star = FALSE;
5968 n->agg_distinct = FALSE;
5969 $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "!~", $1, (Node *) n);
5973 * Define SQL92-style Null test clause.
5974 * Allow two forms described in the standard:
5977 * Allow two SQL extensions
5983 NullTest *n = makeNode(NullTest);
5984 n->arg = (Expr *) $1;
5985 n->nulltesttype = IS_NULL;
5990 NullTest *n = makeNode(NullTest);
5991 n->arg = (Expr *) $1;
5992 n->nulltesttype = IS_NULL;
5997 NullTest *n = makeNode(NullTest);
5998 n->arg = (Expr *) $1;
5999 n->nulltesttype = IS_NOT_NULL;
6002 | a_expr IS NOT NULL_P
6004 NullTest *n = makeNode(NullTest);
6005 n->arg = (Expr *) $1;
6006 n->nulltesttype = IS_NOT_NULL;
6011 BooleanTest *b = makeNode(BooleanTest);
6012 b->arg = (Expr *) $1;
6013 b->booltesttype = IS_TRUE;
6016 | a_expr IS NOT TRUE_P
6018 BooleanTest *b = makeNode(BooleanTest);
6019 b->arg = (Expr *) $1;
6020 b->booltesttype = IS_NOT_TRUE;
6025 BooleanTest *b = makeNode(BooleanTest);
6026 b->arg = (Expr *) $1;
6027 b->booltesttype = IS_FALSE;
6030 | a_expr IS NOT FALSE_P
6032 BooleanTest *b = makeNode(BooleanTest);
6033 b->arg = (Expr *) $1;
6034 b->booltesttype = IS_NOT_FALSE;
6039 BooleanTest *b = makeNode(BooleanTest);
6040 b->arg = (Expr *) $1;
6041 b->booltesttype = IS_UNKNOWN;
6044 | a_expr IS NOT UNKNOWN
6046 BooleanTest *b = makeNode(BooleanTest);
6047 b->arg = (Expr *) $1;
6048 b->booltesttype = IS_NOT_UNKNOWN;
6051 | a_expr IS DISTINCT FROM a_expr %prec IS
6052 { $$ = (Node *) makeSimpleA_Expr(AEXPR_DISTINCT, "=", $1, $5); }
6053 | a_expr IS OF '(' type_list ')' %prec IS
6055 $$ = (Node *) makeSimpleA_Expr(AEXPR_OF, "=", $1, (Node *) $5);
6057 | a_expr IS NOT OF '(' type_list ')' %prec IS
6059 $$ = (Node *) makeSimpleA_Expr(AEXPR_OF, "!=", $1, (Node *) $6);
6061 | a_expr BETWEEN b_expr AND b_expr %prec BETWEEN
6063 $$ = (Node *) makeA_Expr(AEXPR_AND, NIL,
6064 (Node *) makeSimpleA_Expr(AEXPR_OP, ">=", $1, $3),
6065 (Node *) makeSimpleA_Expr(AEXPR_OP, "<=", $1, $5));
6067 | a_expr NOT BETWEEN b_expr AND b_expr %prec BETWEEN
6069 $$ = (Node *) makeA_Expr(AEXPR_OR, NIL,
6070 (Node *) makeSimpleA_Expr(AEXPR_OP, "<", $1, $4),
6071 (Node *) makeSimpleA_Expr(AEXPR_OP, ">", $1, $6));
6073 | a_expr IN_P in_expr
6075 /* in_expr returns a SubLink or a list of a_exprs */
6076 if (IsA($3, SubLink))
6078 SubLink *n = (SubLink *)$3;
6079 n->subLinkType = ANY_SUBLINK;
6080 n->lefthand = makeList1($1);
6081 n->operName = makeList1(makeString("="));
6088 foreach(l, (List *) $3)
6091 cmp = (Node *) makeSimpleA_Expr(AEXPR_OP, "=", $1, lfirst(l));
6095 n = (Node *) makeA_Expr(AEXPR_OR, NIL, n, cmp);
6100 | a_expr NOT IN_P in_expr
6102 /* in_expr returns a SubLink or a list of a_exprs */
6103 if (IsA($4, SubLink))
6105 /* Make an IN node */
6106 SubLink *n = (SubLink *)$4;
6107 n->subLinkType = ANY_SUBLINK;
6108 n->lefthand = makeList1($1);
6109 n->operName = makeList1(makeString("="));
6110 /* Stick a NOT on top */
6111 $$ = (Node *) makeA_Expr(AEXPR_NOT, NIL, NULL, (Node *) n);
6117 foreach(l, (List *) $4)
6120 cmp = (Node *) makeSimpleA_Expr(AEXPR_OP, "<>", $1, lfirst(l));
6124 n = (Node *) makeA_Expr(AEXPR_AND, NIL, n, cmp);
6129 | a_expr qual_all_Op sub_type select_with_parens %prec Op
6131 SubLink *n = makeNode(SubLink);
6132 n->subLinkType = $3;
6133 n->lefthand = makeList1($1);
6138 | a_expr qual_all_Op sub_type '(' a_expr ')' %prec Op
6140 if ($3 == ANY_SUBLINK)
6141 $$ = (Node *) makeA_Expr(AEXPR_OP_ANY, $2, $1, $5);
6143 $$ = (Node *) makeA_Expr(AEXPR_OP_ALL, $2, $1, $5);
6145 | UNIQUE select_with_parens %prec Op
6147 /* Not sure how to get rid of the parentheses
6148 * but there are lots of shift/reduce errors without them.
6150 * Should be able to implement this by plopping the entire
6151 * select into a node, then transforming the target expressions
6152 * from whatever they are into count(*), and testing the
6153 * entire result equal to one.
6154 * But, will probably implement a separate node in the executor.
6157 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
6158 errmsg("UNIQUE predicate is not yet implemented")));
6165 * Restricted expressions
6167 * b_expr is a subset of the complete expression syntax defined by a_expr.
6169 * Presently, AND, NOT, IS, and IN are the a_expr keywords that would
6170 * cause trouble in the places where b_expr is used. For simplicity, we
6171 * just eliminate all the boolean-keyword-operator productions from b_expr.
6175 | b_expr TYPECAST Typename
6176 { $$ = makeTypeCast($1, $3); }
6177 | '+' b_expr %prec UMINUS
6178 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "+", NULL, $2); }
6179 | '-' b_expr %prec UMINUS
6180 { $$ = doNegate($2); }
6182 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "%", NULL, $2); }
6184 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "^", NULL, $2); }
6186 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "%", $1, NULL); }
6188 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "^", $1, NULL); }
6190 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "+", $1, $3); }
6192 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "-", $1, $3); }
6194 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "*", $1, $3); }
6196 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "/", $1, $3); }
6198 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "%", $1, $3); }
6200 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "^", $1, $3); }
6202 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "<", $1, $3); }
6204 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, ">", $1, $3); }
6206 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "=", $1, $3); }
6207 | b_expr qual_Op b_expr %prec Op
6208 { $$ = (Node *) makeA_Expr(AEXPR_OP, $2, $1, $3); }
6209 | qual_Op b_expr %prec Op
6210 { $$ = (Node *) makeA_Expr(AEXPR_OP, $1, NULL, $2); }
6211 | b_expr qual_Op %prec POSTFIXOP
6212 { $$ = (Node *) makeA_Expr(AEXPR_OP, $2, $1, NULL); }
6213 | b_expr IS DISTINCT FROM b_expr %prec IS
6214 { $$ = (Node *) makeSimpleA_Expr(AEXPR_DISTINCT, "=", $1, $5); }
6215 | b_expr IS OF '(' type_list ')' %prec IS
6217 $$ = (Node *) makeSimpleA_Expr(AEXPR_OF, "=", $1, (Node *) $5);
6219 | b_expr IS NOT OF '(' type_list ')' %prec IS
6221 $$ = (Node *) makeSimpleA_Expr(AEXPR_OF, "!=", $1, (Node *) $6);
6226 * Productions that can be used in both a_expr and b_expr.
6228 * Note: productions that refer recursively to a_expr or b_expr mostly
6229 * cannot appear here. However, it's OK to refer to a_exprs that occur
6230 * inside parentheses, such as function arguments; that cannot introduce
6231 * ambiguity to the b_expr syntax.
6233 c_expr: columnref { $$ = (Node *) $1; }
6234 | AexprConst { $$ = $1; }
6235 | PARAM attrs opt_indirection
6238 * PARAM without field names is considered a constant,
6239 * but with 'em, it is not. Not very consistent ...
6241 ParamRef *n = makeNode(ParamRef);
6244 n->indirection = $3;
6247 | '(' a_expr ')' attrs opt_indirection
6249 ExprFieldSelect *n = makeNode(ExprFieldSelect);
6252 n->indirection = $5;
6255 | '(' a_expr ')' opt_indirection
6259 ExprFieldSelect *n = makeNode(ExprFieldSelect);
6262 n->indirection = $4;
6272 FuncCall *n = makeNode(FuncCall);
6275 n->agg_star = FALSE;
6276 n->agg_distinct = FALSE;
6279 | func_name '(' expr_list ')'
6281 FuncCall *n = makeNode(FuncCall);
6284 n->agg_star = FALSE;
6285 n->agg_distinct = FALSE;
6288 | func_name '(' ALL expr_list ')'
6290 FuncCall *n = makeNode(FuncCall);
6293 n->agg_star = FALSE;
6294 n->agg_distinct = FALSE;
6295 /* Ideally we'd mark the FuncCall node to indicate
6296 * "must be an aggregate", but there's no provision
6297 * for that in FuncCall at the moment.
6301 | func_name '(' DISTINCT expr_list ')'
6303 FuncCall *n = makeNode(FuncCall);
6306 n->agg_star = FALSE;
6307 n->agg_distinct = TRUE;
6310 | func_name '(' '*' ')'
6313 * For now, we transform AGGREGATE(*) into AGGREGATE(1).
6315 * This does the right thing for COUNT(*) (in fact,
6316 * any certainly-non-null expression would do for COUNT),
6317 * and there are no other aggregates in SQL92 that accept
6320 * The FuncCall node is also marked agg_star = true,
6321 * so that later processing can detect what the argument
6324 FuncCall *n = makeNode(FuncCall);
6325 A_Const *star = makeNode(A_Const);
6327 star->val.type = T_Integer;
6328 star->val.val.ival = 1;
6330 n->args = makeList1(star);
6332 n->agg_distinct = FALSE;
6338 * Translate as "'now'::text::date".
6340 * We cannot use "'now'::date" because coerce_type() will
6341 * immediately reduce that to a constant representing
6342 * today's date. We need to delay the conversion until
6343 * runtime, else the wrong things will happen when
6344 * CURRENT_DATE is used in a column default value or rule.
6346 * This could be simplified if we had a way to generate
6347 * an expression tree representing runtime application
6348 * of type-input conversion functions...
6350 A_Const *s = makeNode(A_Const);
6353 s->val.type = T_String;
6354 s->val.val.str = "now";
6355 s->typename = SystemTypeName("text");
6357 d = SystemTypeName("date");
6359 $$ = (Node *)makeTypeCast((Node *)s, d);
6364 * Translate as "'now'::text::timetz".
6365 * See comments for CURRENT_DATE.
6367 A_Const *s = makeNode(A_Const);
6370 s->val.type = T_String;
6371 s->val.val.str = "now";
6372 s->typename = SystemTypeName("text");
6374 d = SystemTypeName("timetz");
6375 /* SQL99 mandates a default precision of zero for TIME
6376 * fields in schemas. However, for CURRENT_TIME
6377 * let's preserve the microsecond precision we
6378 * might see from the system clock. - thomas 2001-12-07
6382 $$ = (Node *)makeTypeCast((Node *)s, d);
6384 | CURRENT_TIME '(' Iconst ')'
6387 * Translate as "'now'::text::timetz(n)".
6388 * See comments for CURRENT_DATE.
6390 A_Const *s = makeNode(A_Const);
6393 s->val.type = T_String;
6394 s->val.val.str = "now";
6395 s->typename = SystemTypeName("text");
6396 d = SystemTypeName("timetz");
6399 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
6400 errmsg("CURRENT_TIME(%d) precision must not be negative",
6402 if ($3 > MAX_TIME_PRECISION)
6405 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
6406 errmsg("CURRENT_TIME(%d) precision reduced to maximum allowed, %d",
6407 $3, MAX_TIME_PRECISION)));
6408 $3 = MAX_TIME_PRECISION;
6412 $$ = (Node *)makeTypeCast((Node *)s, d);
6417 * Translate as "'now'::text::timestamptz".
6418 * See comments for CURRENT_DATE.
6420 A_Const *s = makeNode(A_Const);
6423 s->val.type = T_String;
6424 s->val.val.str = "now";
6425 s->typename = SystemTypeName("text");
6427 d = SystemTypeName("timestamptz");
6428 /* SQL99 mandates a default precision of 6 for timestamp.
6429 * Also, that is about as precise as we will get since
6430 * we are using a microsecond time interface.
6431 * - thomas 2001-12-07
6435 $$ = (Node *)makeTypeCast((Node *)s, d);
6437 | CURRENT_TIMESTAMP '(' Iconst ')'
6440 * Translate as "'now'::text::timestamptz(n)".
6441 * See comments for CURRENT_DATE.
6443 A_Const *s = makeNode(A_Const);
6446 s->val.type = T_String;
6447 s->val.val.str = "now";
6448 s->typename = SystemTypeName("text");
6450 d = SystemTypeName("timestamptz");
6453 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
6454 errmsg("CURRENT_TIMESTAMP(%d) precision must not be negative",
6456 if ($3 > MAX_TIMESTAMP_PRECISION)
6459 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
6460 errmsg("CURRENT_TIMESTAMP(%d) precision reduced to maximum allowed, %d",
6461 $3, MAX_TIMESTAMP_PRECISION)));
6462 $3 = MAX_TIMESTAMP_PRECISION;
6466 $$ = (Node *)makeTypeCast((Node *)s, d);
6471 * Translate as "'now'::text::time".
6472 * See comments for CURRENT_DATE.
6474 A_Const *s = makeNode(A_Const);
6477 s->val.type = T_String;
6478 s->val.val.str = "now";
6479 s->typename = SystemTypeName("text");
6481 d = SystemTypeName("time");
6482 /* SQL99 mandates a default precision of zero for TIME
6483 * fields in schemas. However, for LOCALTIME
6484 * let's preserve the microsecond precision we
6485 * might see from the system clock. - thomas 2001-12-07
6489 $$ = (Node *)makeTypeCast((Node *)s, d);
6491 | LOCALTIME '(' Iconst ')'
6494 * Translate as "'now'::text::time(n)".
6495 * See comments for CURRENT_DATE.
6497 A_Const *s = makeNode(A_Const);
6500 s->val.type = T_String;
6501 s->val.val.str = "now";
6502 s->typename = SystemTypeName("text");
6503 d = SystemTypeName("time");
6506 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
6507 errmsg("LOCALTIME(%d) precision must not be negative",
6509 if ($3 > MAX_TIME_PRECISION)
6512 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
6513 errmsg("LOCALTIME(%d) precision reduced to maximum allowed, %d",
6514 $3, MAX_TIME_PRECISION)));
6515 $3 = MAX_TIME_PRECISION;
6519 $$ = (Node *)makeTypeCast((Node *)s, d);
6524 * Translate as "'now'::text::timestamp".
6525 * See comments for CURRENT_DATE.
6527 A_Const *s = makeNode(A_Const);
6530 s->val.type = T_String;
6531 s->val.val.str = "now";
6532 s->typename = SystemTypeName("text");
6534 d = SystemTypeName("timestamp");
6535 /* SQL99 mandates a default precision of 6 for timestamp.
6536 * Also, that is about as precise as we will get since
6537 * we are using a microsecond time interface.
6538 * - thomas 2001-12-07
6542 $$ = (Node *)makeTypeCast((Node *)s, d);
6544 | LOCALTIMESTAMP '(' Iconst ')'
6547 * Translate as "'now'::text::timestamp(n)".
6548 * See comments for CURRENT_DATE.
6550 A_Const *s = makeNode(A_Const);
6553 s->val.type = T_String;
6554 s->val.val.str = "now";
6555 s->typename = SystemTypeName("text");
6557 d = SystemTypeName("timestamp");
6560 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
6561 errmsg("LOCALTIMESTAMP(%d) precision must not be negative",
6563 if ($3 > MAX_TIMESTAMP_PRECISION)
6566 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
6567 errmsg("LOCALTIMESTAMP(%d) precision reduced to maximum allowed, %d",
6568 $3, MAX_TIMESTAMP_PRECISION)));
6569 $3 = MAX_TIMESTAMP_PRECISION;
6573 $$ = (Node *)makeTypeCast((Node *)s, d);
6577 FuncCall *n = makeNode(FuncCall);
6578 n->funcname = SystemFuncName("current_user");
6580 n->agg_star = FALSE;
6581 n->agg_distinct = FALSE;
6586 FuncCall *n = makeNode(FuncCall);
6587 n->funcname = SystemFuncName("session_user");
6589 n->agg_star = FALSE;
6590 n->agg_distinct = FALSE;
6595 FuncCall *n = makeNode(FuncCall);
6596 n->funcname = SystemFuncName("current_user");
6598 n->agg_star = FALSE;
6599 n->agg_distinct = FALSE;
6602 | CAST '(' a_expr AS Typename ')'
6603 { $$ = makeTypeCast($3, $5); }
6604 | EXTRACT '(' extract_list ')'
6606 FuncCall *n = makeNode(FuncCall);
6607 n->funcname = SystemFuncName("date_part");
6609 n->agg_star = FALSE;
6610 n->agg_distinct = FALSE;
6613 | OVERLAY '(' overlay_list ')'
6615 /* overlay(A PLACING B FROM C FOR D) is converted to
6616 * substring(A, 1, C-1) || B || substring(A, C+1, C+D)
6617 * overlay(A PLACING B FROM C) is converted to
6618 * substring(A, 1, C-1) || B || substring(A, C+1, C+char_length(B))
6620 FuncCall *n = makeNode(FuncCall);
6621 n->funcname = SystemFuncName("overlay");
6623 n->agg_star = FALSE;
6624 n->agg_distinct = FALSE;
6627 | POSITION '(' position_list ')'
6629 /* position(A in B) is converted to position(B, A) */
6630 FuncCall *n = makeNode(FuncCall);
6631 n->funcname = SystemFuncName("position");
6633 n->agg_star = FALSE;
6634 n->agg_distinct = FALSE;
6637 | SUBSTRING '(' substr_list ')'
6639 /* substring(A from B for C) is converted to
6640 * substring(A, B, C) - thomas 2000-11-28
6642 FuncCall *n = makeNode(FuncCall);
6643 n->funcname = SystemFuncName("substring");
6645 n->agg_star = FALSE;
6646 n->agg_distinct = FALSE;
6649 | TREAT '(' a_expr AS Typename ')'
6651 /* TREAT(expr AS target) converts expr of a particular type to target,
6652 * which is defined to be a subtype of the original expression.
6653 * In SQL99, this is intended for use with structured UDTs,
6654 * but let's make this a generally useful form allowing stronger
6655 * coersions than are handled by implicit casting.
6657 FuncCall *n = makeNode(FuncCall);
6658 /* Convert SystemTypeName() to SystemFuncName() even though
6659 * at the moment they result in the same thing.
6661 n->funcname = SystemFuncName(((Value *)llast($5->names))->val.str);
6662 n->args = makeList1($3);
6665 | TRIM '(' BOTH trim_list ')'
6667 /* various trim expressions are defined in SQL92
6668 * - thomas 1997-07-19
6670 FuncCall *n = makeNode(FuncCall);
6671 n->funcname = SystemFuncName("btrim");
6673 n->agg_star = FALSE;
6674 n->agg_distinct = FALSE;
6677 | TRIM '(' LEADING trim_list ')'
6679 FuncCall *n = makeNode(FuncCall);
6680 n->funcname = SystemFuncName("ltrim");
6682 n->agg_star = FALSE;
6683 n->agg_distinct = FALSE;
6686 | TRIM '(' TRAILING trim_list ')'
6688 FuncCall *n = makeNode(FuncCall);
6689 n->funcname = SystemFuncName("rtrim");
6691 n->agg_star = FALSE;
6692 n->agg_distinct = FALSE;
6695 | TRIM '(' trim_list ')'
6697 FuncCall *n = makeNode(FuncCall);
6698 n->funcname = SystemFuncName("btrim");
6700 n->agg_star = FALSE;
6701 n->agg_distinct = FALSE;
6704 | CONVERT '(' a_expr USING any_name ')'
6706 FuncCall *n = makeNode(FuncCall);
6707 A_Const *c = makeNode(A_Const);
6709 c->val.type = T_String;
6710 c->val.val.str = NameListToQuotedString($5);
6712 n->funcname = SystemFuncName("convert_using");
6713 n->args = makeList2($3, c);
6714 n->agg_star = FALSE;
6715 n->agg_distinct = FALSE;
6718 | CONVERT '(' expr_list ')'
6720 FuncCall *n = makeNode(FuncCall);
6721 n->funcname = SystemFuncName("convert");
6723 n->agg_star = FALSE;
6724 n->agg_distinct = FALSE;
6727 | select_with_parens %prec UMINUS
6729 SubLink *n = makeNode(SubLink);
6730 n->subLinkType = EXPR_SUBLINK;
6736 | EXISTS select_with_parens
6738 SubLink *n = makeNode(SubLink);
6739 n->subLinkType = EXISTS_SUBLINK;
6745 | ARRAY select_with_parens
6747 SubLink *n = makeNode(SubLink);
6748 n->subLinkType = ARRAY_SUBLINK;
6759 * Supporting nonterminals for expressions.
6763 opt_indirection '[' a_expr ']'
6765 A_Indices *ai = makeNode(A_Indices);
6768 $$ = lappend($1, ai);
6770 | opt_indirection '[' a_expr ':' a_expr ']'
6772 A_Indices *ai = makeNode(A_Indices);
6775 $$ = lappend($1, ai);
6783 FastList *dst = (FastList *) &$$;
6784 makeFastList1(dst, $1);
6786 | expr_list ',' a_expr
6788 FastList *dst = (FastList *) &$$;
6789 FastList *src = (FastList *) &$1;
6791 FastAppend(dst, $3);
6796 extract_arg FROM a_expr
6798 A_Const *n = makeNode(A_Const);
6799 n->val.type = T_String;
6800 n->val.val.str = $1;
6801 $$ = makeList2((Node *) n, $3);
6803 | /*EMPTY*/ { $$ = NIL; }
6806 type_list: type_list ',' Typename
6808 $$ = lappend($1, $3);
6816 array_expr_list: array_expr
6817 { $$ = makeList1($1); }
6818 | array_expr_list ',' array_expr
6819 { $$ = lappend($1, $3); }
6822 array_expr: '[' expr_list ']'
6824 ArrayExpr *n = makeNode(ArrayExpr);
6828 | '[' array_expr_list ']'
6830 ArrayExpr *n = makeNode(ArrayExpr);
6836 /* Allow delimited string SCONST in extract_arg as an SQL extension.
6837 * - thomas 2001-04-12
6842 | YEAR_P { $$ = "year"; }
6843 | MONTH_P { $$ = "month"; }
6844 | DAY_P { $$ = "day"; }
6845 | HOUR_P { $$ = "hour"; }
6846 | MINUTE_P { $$ = "minute"; }
6847 | SECOND_P { $$ = "second"; }
6848 | SCONST { $$ = $1; }
6851 /* OVERLAY() arguments
6852 * SQL99 defines the OVERLAY() function:
6853 * o overlay(text placing text from int for int)
6854 * o overlay(text placing text from int)
6857 a_expr overlay_placing substr_from substr_for
6859 $$ = makeList4($1, $2, $3, $4);
6861 | a_expr overlay_placing substr_from
6863 $$ = makeList3($1, $2, $3);
6872 /* position_list uses b_expr not a_expr to avoid conflict with general IN */
6875 b_expr IN_P b_expr { $$ = makeList2($3, $1); }
6876 | /*EMPTY*/ { $$ = NIL; }
6879 /* SUBSTRING() arguments
6880 * SQL9x defines a specific syntax for arguments to SUBSTRING():
6881 * o substring(text from int for int)
6882 * o substring(text from int) get entire string from starting point "int"
6883 * o substring(text from pattern) get entire string matching pattern
6884 * o substring(text for int) get first "int" characters of string
6885 * We also want to implement generic substring functions which accept
6886 * the usual generic list of arguments. So we will accept both styles
6887 * here, and convert the SQL9x style to the generic list for further
6888 * processing. - thomas 2000-11-28
6891 a_expr substr_from substr_for
6893 $$ = makeList3($1, $2, $3);
6895 | a_expr substr_for substr_from
6897 $$ = makeList3($1, $3, $2);
6899 | a_expr substr_from
6901 $$ = makeList2($1, $2);
6905 A_Const *n = makeNode(A_Const);
6906 n->val.type = T_Integer;
6907 n->val.val.ival = 1;
6908 $$ = makeList3($1, (Node *)n, $2);
6919 FROM a_expr { $$ = $2; }
6922 substr_for: FOR a_expr { $$ = $2; }
6925 trim_list: a_expr FROM expr_list { $$ = lappend($3, $1); }
6926 | FROM expr_list { $$ = $2; }
6927 | expr_list { $$ = $1; }
6930 in_expr: select_with_parens
6932 SubLink *n = makeNode(SubLink);
6934 /* other fields will be filled later */
6937 | '(' expr_list ')' { $$ = (Node *)$2; }
6941 * Define SQL92-style case clause.
6942 * Allow all four forms described in the standard:
6943 * - Full specification
6944 * CASE WHEN a = b THEN c ... ELSE d END
6945 * - Implicit argument
6946 * CASE a WHEN b THEN c ... ELSE d END
6947 * - Conditional NULL
6949 * same as CASE WHEN x = y THEN NULL ELSE x END
6950 * - Conditional substitution from list, use first non-null argument
6952 * same as CASE WHEN a IS NOT NULL THEN a WHEN b IS NOT NULL THEN b ... END
6953 * - thomas 1998-11-09
6955 * NULLIF and COALESCE have become first class nodes to
6956 * prevent double evaluation of arguments.
6957 * - Kris Jurka 2003-02-11
6959 case_expr: CASE case_arg when_clause_list case_default END_P
6961 CaseExpr *c = makeNode(CaseExpr);
6962 c->arg = (Expr *) $2;
6964 c->defresult = (Expr *) $4;
6967 | NULLIF '(' a_expr ',' a_expr ')'
6969 $$ = (Node *) makeSimpleA_Expr(AEXPR_NULLIF, "=", $3, $5);
6971 | COALESCE '(' expr_list ')'
6973 CoalesceExpr *c = makeNode(CoalesceExpr);
6980 /* There must be at least one */
6981 when_clause { $$ = makeList1($1); }
6982 | when_clause_list when_clause { $$ = lappend($1, $2); }
6986 WHEN a_expr THEN a_expr
6988 CaseWhen *w = makeNode(CaseWhen);
6989 w->expr = (Expr *) $2;
6990 w->result = (Expr *) $4;
6996 ELSE a_expr { $$ = $2; }
6997 | /*EMPTY*/ { $$ = NULL; }
7000 case_arg: a_expr { $$ = $1; }
7001 | /*EMPTY*/ { $$ = NULL; }
7005 * columnref starts with relation_name not ColId, so that OLD and NEW
7006 * references can be accepted. Note that when there are more than two
7007 * dotted names, the first name is not actually a relation name...
7009 columnref: relation_name opt_indirection
7011 $$ = makeNode(ColumnRef);
7012 $$->fields = makeList1(makeString($1));
7013 $$->indirection = $2;
7015 | dotted_name opt_indirection
7017 $$ = makeNode(ColumnRef);
7019 $$->indirection = $2;
7025 { $$ = lcons(makeString($1), $2); }
7028 attrs: '.' attr_name
7029 { $$ = makeList1(makeString($2)); }
7031 { $$ = makeList1(makeString("*")); }
7032 | '.' attr_name attrs
7033 { $$ = lcons(makeString($2), $3); }
7037 /*****************************************************************************
7041 *****************************************************************************/
7043 /* Target lists as found in SELECT ... and INSERT VALUES ( ... ) */
7046 target_el { $$ = makeList1($1); }
7047 | target_list ',' target_el { $$ = lappend($1, $3); }
7050 /* AS is not optional because shift/red conflict with unary ops */
7051 target_el: a_expr AS ColLabel
7053 $$ = makeNode(ResTarget);
7055 $$->indirection = NIL;
7056 $$->val = (Node *)$1;
7060 $$ = makeNode(ResTarget);
7062 $$->indirection = NIL;
7063 $$->val = (Node *)$1;
7067 ColumnRef *n = makeNode(ColumnRef);
7068 n->fields = makeList1(makeString("*"));
7069 n->indirection = NIL;
7070 $$ = makeNode(ResTarget);
7072 $$->indirection = NIL;
7073 $$->val = (Node *)n;
7077 /* Target list as found in UPDATE table SET ...
7078 | '(' row_ ')' = '(' row_ ')'
7084 update_target_el { $$ = makeList1($1); }
7085 | update_target_list ',' update_target_el { $$ = lappend($1,$3); }
7089 ColId opt_indirection '=' a_expr
7091 $$ = makeNode(ResTarget);
7093 $$->indirection = $2;
7094 $$->val = (Node *) $4;
7096 | ColId opt_indirection '=' DEFAULT
7098 $$ = makeNode(ResTarget);
7100 $$->indirection = $2;
7101 $$->val = (Node *) makeNode(SetToDefault);
7107 insert_target_el { $$ = makeList1($1); }
7108 | insert_target_list ',' insert_target_el { $$ = lappend($1, $3); }
7112 target_el { $$ = $1; }
7115 $$ = makeNode(ResTarget);
7117 $$->indirection = NIL;
7118 $$->val = (Node *) makeNode(SetToDefault);
7123 /*****************************************************************************
7125 * Names and constants
7127 *****************************************************************************/
7130 SpecialRuleRelation { $$ = $1; }
7131 | ColId { $$ = $1; }
7134 qualified_name_list:
7135 qualified_name { $$ = makeList1($1); }
7136 | qualified_name_list ',' qualified_name { $$ = lappend($1, $3); }
7142 $$ = makeNode(RangeVar);
7143 $$->catalogname = NULL;
7144 $$->schemaname = NULL;
7149 $$ = makeNode(RangeVar);
7153 $$->catalogname = NULL;
7154 $$->schemaname = strVal(lfirst($1));
7155 $$->relname = strVal(lsecond($1));
7158 $$->catalogname = strVal(lfirst($1));
7159 $$->schemaname = strVal(lsecond($1));
7160 $$->relname = strVal(lthird($1));
7164 (errcode(ERRCODE_SYNTAX_ERROR),
7165 errmsg("improper qualified name (too many dotted names): %s",
7166 NameListToString($1))));
7173 { $$ = makeList1(makeString($1)); }
7174 | name_list ',' name
7175 { $$ = lappend($1, makeString($3)); }
7179 name: ColId { $$ = $1; };
7187 attr_name: ColId { $$ = $1; };
7189 index_name: ColId { $$ = $1; };
7191 file_name: Sconst { $$ = $1; };
7193 func_name: function_name
7194 { $$ = makeList1(makeString($1)); }
7195 | dotted_name { $$ = $1; }
7204 A_Const *n = makeNode(A_Const);
7205 n->val.type = T_Integer;
7206 n->val.val.ival = $1;
7211 A_Const *n = makeNode(A_Const);
7212 n->val.type = T_Float;
7213 n->val.val.str = $1;
7218 A_Const *n = makeNode(A_Const);
7219 n->val.type = T_String;
7220 n->val.val.str = $1;
7225 A_Const *n = makeNode(A_Const);
7226 n->val.type = T_BitString;
7227 n->val.val.str = $1;
7232 /* This is a bit constant per SQL99:
7233 * Without Feature F511, "BIT data type",
7234 * a <general literal> shall not be a
7235 * <bit string literal> or a <hex string literal>.
7237 A_Const *n = makeNode(A_Const);
7238 n->val.type = T_BitString;
7239 n->val.val.str = $1;
7242 | ConstTypename Sconst
7244 A_Const *n = makeNode(A_Const);
7246 n->val.type = T_String;
7247 n->val.val.str = $2;
7250 | ConstInterval Sconst opt_interval
7252 A_Const *n = makeNode(A_Const);
7254 n->val.type = T_String;
7255 n->val.val.str = $2;
7256 /* precision is not specified, but fields may be... */
7257 if ($3 != INTERVAL_FULL_RANGE)
7258 n->typename->typmod = INTERVAL_TYPMOD(INTERVAL_FULL_PRECISION, $3);
7261 | ConstInterval '(' Iconst ')' Sconst opt_interval
7263 A_Const *n = makeNode(A_Const);
7265 n->val.type = T_String;
7266 n->val.val.str = $5;
7267 /* precision specified, and fields may be... */
7270 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
7271 errmsg("INTERVAL(%d) precision must not be negative",
7273 if ($3 > MAX_INTERVAL_PRECISION)
7276 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
7277 errmsg("INTERVAL(%d) precision reduced to maximum allowed, %d",
7278 $3, MAX_INTERVAL_PRECISION)));
7279 $3 = MAX_INTERVAL_PRECISION;
7281 n->typename->typmod = INTERVAL_TYPMOD($3, $6);
7284 | PARAM opt_indirection
7286 ParamRef *n = makeNode(ParamRef);
7289 n->indirection = $2;
7294 $$ = (Node *)makeBoolConst(TRUE);
7298 $$ = (Node *)makeBoolConst(FALSE);
7302 A_Const *n = makeNode(A_Const);
7303 n->val.type = T_Null;
7308 Iconst: ICONST { $$ = $1; };
7309 Sconst: SCONST { $$ = $1; };
7310 UserId: ColId { $$ = $1; };
7313 * Name classification hierarchy.
7315 * IDENT is the lexeme returned by the lexer for identifiers that match
7316 * no known keyword. In most cases, we can accept certain keywords as
7317 * names, not only IDENTs. We prefer to accept as many such keywords
7318 * as possible to minimize the impact of "reserved words" on programmers.
7319 * So, we divide names into several possible classes. The classification
7320 * is chosen in part to make keywords acceptable as names wherever possible.
7323 /* Column identifier --- names that can be column, table, etc names.
7325 ColId: IDENT { $$ = $1; }
7326 | unreserved_keyword { $$ = pstrdup($1); }
7327 | col_name_keyword { $$ = pstrdup($1); }
7330 /* Type identifier --- names that can be type names.
7332 type_name: IDENT { $$ = $1; }
7333 | unreserved_keyword { $$ = pstrdup($1); }
7336 /* Function identifier --- names that can be function names.
7340 | unreserved_keyword { $$ = pstrdup($1); }
7341 | func_name_keyword { $$ = pstrdup($1); }
7344 /* Column label --- allowed labels in "AS" clauses.
7345 * This presently includes *all* Postgres keywords.
7347 ColLabel: IDENT { $$ = $1; }
7348 | unreserved_keyword { $$ = pstrdup($1); }
7349 | col_name_keyword { $$ = pstrdup($1); }
7350 | func_name_keyword { $$ = pstrdup($1); }
7351 | reserved_keyword { $$ = pstrdup($1); }
7356 * Keyword classification lists. Generally, every keyword present in
7357 * the Postgres grammar should appear in exactly one of these lists.
7359 * Put a new keyword into the first list that it can go into without causing
7360 * shift or reduce conflicts. The earlier lists define "less reserved"
7361 * categories of keywords.
7364 /* "Unreserved" keywords --- available for use as any kind of name.
7553 /* Column identifier --- keywords that can be column, table, etc names.
7555 * Many of these keywords will in fact be recognized as type or function
7556 * names too; but they have special productions for the purpose, and so
7557 * can't be treated as "generic" type or function names.
7559 * The type names appearing here are not usable as function names
7560 * because they can be followed by '(' in typename productions, which
7561 * looks too much like a function call for an LR(1) parser.
7601 /* Function identifier --- keywords that can be function names.
7603 * Most of these are keywords that are used as operators in expressions;
7604 * in general such keywords can't be column names because they would be
7605 * ambiguous with variables, but they are unambiguous as function identifiers.
7607 * Do not include POSITION, SUBSTRING, etc here since they have explicit
7608 * productions in a_expr to support the goofy SQL9x argument syntax.
7609 * - thomas 2000-11-28
7634 /* Reserved keyword --- these keywords are usable only as a ColLabel.
7636 * Keywords appear here if they could not be distinguished from variable,
7637 * type, or function names in some contexts. Don't put things here unless
7714 SpecialRuleRelation:
7721 (errcode(ERRCODE_SYNTAX_ERROR),
7722 errmsg("OLD used in query that is not in a rule")));
7730 (errcode(ERRCODE_SYNTAX_ERROR),
7731 errmsg("NEW used in query that is not in a rule")));
7738 makeTypeCast(Node *arg, TypeName *typename)
7741 * Simply generate a TypeCast node.
7743 * Earlier we would determine whether an A_Const would
7744 * be acceptable, however Domains require coerce_type()
7745 * to process them -- applying constraints as required.
7747 TypeCast *n = makeNode(TypeCast);
7749 n->typename = typename;
7754 makeStringConst(char *str, TypeName *typename)
7756 A_Const *n = makeNode(A_Const);
7758 n->val.type = T_String;
7759 n->val.val.str = str;
7760 n->typename = typename;
7766 makeIntConst(int val)
7768 A_Const *n = makeNode(A_Const);
7769 n->val.type = T_Integer;
7770 n->val.val.ival = val;
7771 n->typename = SystemTypeName("int4");
7777 makeFloatConst(char *str)
7779 A_Const *n = makeNode(A_Const);
7781 n->val.type = T_Float;
7782 n->val.val.str = str;
7783 n->typename = SystemTypeName("float8");
7789 makeAConst(Value *v)
7796 n = makeFloatConst(v->val.str);
7800 n = makeIntConst(v->val.ival);
7805 n = makeStringConst(v->val.str, NULL);
7813 * Create a DefElem node and set contents.
7814 * Could be moved to nodes/makefuncs.c if this is useful elsewhere.
7817 makeDefElem(char *name, Node *arg)
7819 DefElem *f = makeNode(DefElem);
7826 * Create an A_Const node and initialize to a boolean constant.
7829 makeBoolConst(bool state)
7831 A_Const *n = makeNode(A_Const);
7832 n->val.type = T_String;
7833 n->val.val.str = (state? "t": "f");
7834 n->typename = SystemTypeName("bool");
7839 * Generate separate operator nodes for a single row descriptor expression.
7840 * Perhaps this should go deeper in the parser someday...
7841 * - thomas 1997-12-22
7844 makeRowExpr(List *opr, List *largs, List *rargs)
7850 if (length(largs) != length(rargs))
7852 (errcode(ERRCODE_SYNTAX_ERROR),
7853 errmsg("unequal number of entries in row expression")));
7855 if (lnext(largs) != NIL)
7856 expr = makeRowExpr(opr, lnext(largs), lnext(rargs));
7858 larg = lfirst(largs);
7859 rarg = lfirst(rargs);
7861 oprname = strVal(llast(opr));
7863 if ((strcmp(oprname, "=") == 0) ||
7864 (strcmp(oprname, "<") == 0) ||
7865 (strcmp(oprname, "<=") == 0) ||
7866 (strcmp(oprname, ">") == 0) ||
7867 (strcmp(oprname, ">=") == 0))
7870 expr = (Node *) makeA_Expr(AEXPR_OP, opr, larg, rarg);
7872 expr = (Node *) makeA_Expr(AEXPR_AND, NIL, expr,
7873 (Node *) makeA_Expr(AEXPR_OP, opr,
7876 else if (strcmp(oprname, "<>") == 0)
7879 expr = (Node *) makeA_Expr(AEXPR_OP, opr, larg, rarg);
7881 expr = (Node *) makeA_Expr(AEXPR_OR, NIL, expr,
7882 (Node *) makeA_Expr(AEXPR_OP, opr,
7888 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
7889 errmsg("operator %s is not supported for row expressions",
7896 /* makeDistinctExpr()
7897 * Generate separate operator nodes for a single row descriptor expression.
7898 * Same comments as for makeRowExpr().
7901 makeDistinctExpr(List *largs, List *rargs)
7906 if (length(largs) != length(rargs))
7908 (errcode(ERRCODE_SYNTAX_ERROR),
7909 errmsg("unequal number of entries in row expression")));
7911 if (lnext(largs) != NIL)
7912 expr = makeDistinctExpr(lnext(largs), lnext(rargs));
7914 larg = lfirst(largs);
7915 rarg = lfirst(rargs);
7918 expr = (Node *) makeSimpleA_Expr(AEXPR_DISTINCT, "=", larg, rarg);
7920 expr = (Node *) makeA_Expr(AEXPR_OR, NIL, expr,
7921 (Node *) makeSimpleA_Expr(AEXPR_DISTINCT, "=",
7927 /* makeRowNullTest()
7928 * Generate separate operator nodes for a single row descriptor test.
7931 makeRowNullTest(NullTestType test, List *args)
7936 if (lnext(args) != NIL)
7937 expr = makeRowNullTest(test, lnext(args));
7939 n = makeNode(NullTest);
7940 n->arg = (Expr *) lfirst(args);
7941 n->nulltesttype = test;
7945 else if (test == IS_NOT_NULL)
7946 expr = (Node *) makeA_Expr(AEXPR_OR, NIL, expr, (Node *)n);
7948 expr = (Node *) makeA_Expr(AEXPR_AND, NIL, expr, (Node *)n);
7954 * Create and populate a FuncCall node to support the OVERLAPS operator.
7957 makeOverlaps(List *largs, List *rargs)
7959 FuncCall *n = makeNode(FuncCall);
7960 n->funcname = SystemFuncName("overlaps");
7961 if (length(largs) == 1)
7962 largs = lappend(largs, largs);
7963 else if (length(largs) != 2)
7965 (errcode(ERRCODE_SYNTAX_ERROR),
7966 errmsg("wrong number of parameters on left side of OVERLAPS expression")));
7967 if (length(rargs) == 1)
7968 rargs = lappend(rargs, rargs);
7969 else if (length(rargs) != 2)
7971 (errcode(ERRCODE_SYNTAX_ERROR),
7972 errmsg("wrong number of parameters on right side of OVERLAPS expression")));
7973 n->args = nconc(largs, rargs);
7974 n->agg_star = FALSE;
7975 n->agg_distinct = FALSE;
7979 /* extractArgTypes()
7980 * Given a list of FunctionParameter nodes, extract a list of just the
7981 * argument types (TypeNames). Most of the productions using func_args
7982 * don't currently want the full FunctionParameter data, so we use this
7983 * rather than having two sets of productions.
7986 extractArgTypes(List *parameters)
7991 foreach(i, parameters)
7993 FunctionParameter *p = (FunctionParameter *) lfirst(i);
7995 result = lappend(result, p->argType);
8000 /* findLeftmostSelect()
8001 * Find the leftmost component SelectStmt in a set-operation parsetree.
8004 findLeftmostSelect(SelectStmt *node)
8006 while (node && node->op != SETOP_NONE)
8008 Assert(node && IsA(node, SelectStmt) && node->larg == NULL);
8012 /* insertSelectOptions()
8013 * Insert ORDER BY, etc into an already-constructed SelectStmt.
8015 * This routine is just to avoid duplicating code in SelectStmt productions.
8018 insertSelectOptions(SelectStmt *stmt,
8019 List *sortClause, List *forUpdate,
8020 Node *limitOffset, Node *limitCount)
8023 * Tests here are to reject constructs like
8024 * (SELECT foo ORDER BY bar) ORDER BY baz
8028 if (stmt->sortClause)
8030 (errcode(ERRCODE_SYNTAX_ERROR),
8031 errmsg("multiple ORDER BY clauses not allowed")));
8032 stmt->sortClause = sortClause;
8036 if (stmt->forUpdate)
8038 (errcode(ERRCODE_SYNTAX_ERROR),
8039 errmsg("multiple FOR UPDATE clauses not allowed")));
8040 stmt->forUpdate = forUpdate;
8044 if (stmt->limitOffset)
8046 (errcode(ERRCODE_SYNTAX_ERROR),
8047 errmsg("multiple OFFSET clauses not allowed")));
8048 stmt->limitOffset = limitOffset;
8052 if (stmt->limitCount)
8054 (errcode(ERRCODE_SYNTAX_ERROR),
8055 errmsg("multiple LIMIT clauses not allowed")));
8056 stmt->limitCount = limitCount;
8061 makeSetOp(SetOperation op, bool all, Node *larg, Node *rarg)
8063 SelectStmt *n = makeNode(SelectStmt);
8067 n->larg = (SelectStmt *) larg;
8068 n->rarg = (SelectStmt *) rarg;
8073 * Build a properly-qualified reference to a built-in function.
8076 SystemFuncName(char *name)
8078 return makeList2(makeString("pg_catalog"), makeString(name));
8082 * Build a properly-qualified reference to a built-in type.
8084 * typmod is defaulted, but may be changed afterwards by caller.
8087 SystemTypeName(char *name)
8089 TypeName *n = makeNode(TypeName);
8091 n->names = makeList2(makeString("pg_catalog"), makeString(name));
8097 * Initialize to parse one query string
8102 QueryIsRule = FALSE;
8105 /* exprIsNullConstant()
8106 * Test whether an a_expr is a plain NULL constant or not.
8109 exprIsNullConstant(Node *arg)
8111 if (arg && IsA(arg, A_Const))
8113 A_Const *con = (A_Const *) arg;
8115 if (con->val.type == T_Null &&
8116 con->typename == NULL)
8123 * Handle negation of a numeric constant.
8125 * Formerly, we did this here because the optimizer couldn't cope with
8126 * indexquals that looked like "var = -4" --- it wants "var = const"
8127 * and a unary minus operator applied to a constant didn't qualify.
8128 * As of Postgres 7.0, that problem doesn't exist anymore because there
8129 * is a constant-subexpression simplifier in the optimizer. However,
8130 * there's still a good reason for doing this here, which is that we can
8131 * postpone committing to a particular internal representation for simple
8132 * negative constants. It's better to leave "-123.456" in string form
8133 * until we know what the desired type is.
8138 if (IsA(n, A_Const))
8140 A_Const *con = (A_Const *)n;
8142 if (con->val.type == T_Integer)
8144 con->val.val.ival = -con->val.val.ival;
8147 if (con->val.type == T_Float)
8149 doNegateFloat(&con->val);
8154 return (Node *) makeSimpleA_Expr(AEXPR_OP, "-", NULL, n);
8158 doNegateFloat(Value *v)
8160 char *oldval = v->val.str;
8162 Assert(IsA(v, Float));
8166 v->val.str = oldval+1; /* just strip the '-' */
8169 char *newval = (char *) palloc(strlen(oldval) + 2);
8172 strcpy(newval+1, oldval);
8173 v->val.str = newval;