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.456 2004/05/26 13:56:51 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 *makeRowNullTest(NullTestType test, RowExpr *row);
84 static DefElem *makeDefElem(char *name, Node *arg);
85 static A_Const *makeBoolAConst(bool state);
86 static FuncCall *makeOverlaps(List *largs, List *rargs);
87 static List *extractArgTypes(List *parameters);
88 static SelectStmt *findLeftmostSelect(SelectStmt *node);
89 static void insertSelectOptions(SelectStmt *stmt,
90 List *sortClause, List *forUpdate,
91 Node *limitOffset, Node *limitCount);
92 static Node *makeSetOp(SetOperation op, bool all, Node *larg, Node *rarg);
93 static Node *doNegate(Node *n);
94 static void doNegateFloat(Value *v);
107 DropBehavior dbehavior;
108 OnCommitAction oncommit;
109 ContainsOids withoids;
114 ColumnRef *columnref;
118 FunctionParameter *fun_param;
127 PrivTarget *privtarget;
130 VariableSetStmt *vsetstmt;
133 %type <node> stmt schema_stmt
134 AlterDatabaseSetStmt AlterDomainStmt AlterGroupStmt
135 AlterSeqStmt AlterTableStmt AlterUserStmt AlterUserSetStmt
136 AnalyzeStmt ClosePortalStmt ClusterStmt CommentStmt
137 ConstraintsSetStmt CopyStmt CreateAsStmt CreateCastStmt
138 CreateDomainStmt CreateGroupStmt CreateOpClassStmt CreatePLangStmt
139 CreateSchemaStmt CreateSeqStmt CreateStmt
140 CreateAssertStmt CreateTrigStmt CreateUserStmt
141 CreatedbStmt DeclareCursorStmt DefineStmt DeleteStmt
142 DropGroupStmt DropOpClassStmt DropPLangStmt DropStmt
143 DropAssertStmt DropTrigStmt DropRuleStmt DropCastStmt
144 DropUserStmt DropdbStmt ExplainStmt FetchStmt
145 GrantStmt IndexStmt InsertStmt ListenStmt LoadStmt
146 LockStmt NotifyStmt ExplainableStmt PreparableStmt
147 CreateFunctionStmt ReindexStmt RemoveAggrStmt
148 RemoveFuncStmt RemoveOperStmt RenameStmt RevokeStmt
149 RuleActionStmt RuleActionStmtOrEmpty RuleStmt
150 SelectStmt TransactionStmt TruncateStmt
151 UnlistenStmt UpdateStmt VacuumStmt
152 VariableResetStmt VariableSetStmt VariableShowStmt
153 ViewStmt CheckPointStmt CreateConversionStmt
154 DeallocateStmt PrepareStmt ExecuteStmt
157 %type <node> select_no_parens select_with_parens select_clause
160 %type <node> alter_column_default opclass_item alter_using
161 %type <ival> add_drop
163 %type <node> alter_table_cmd
164 %type <list> alter_table_cmds
166 %type <dbehavior> opt_drop_behavior
168 %type <list> createdb_opt_list copy_opt_list
169 %type <defelt> createdb_opt_item copy_opt_item
171 %type <ival> opt_lock lock_type cast_context
172 %type <boolean> opt_force opt_or_replace transaction_access_mode
173 opt_grant_grant_option opt_revoke_grant_option
176 %type <boolean> like_including_defaults
178 %type <list> user_list
180 %type <list> OptGroupList
181 %type <defelt> OptGroupElem
183 %type <list> OptUserList
184 %type <defelt> OptUserElem
186 %type <str> OptSchemaName
187 %type <list> OptSchemaEltList
189 %type <boolean> TriggerActionTime TriggerForSpec opt_trusted
190 %type <str> opt_lancompiler
192 %type <str> TriggerEvents
193 %type <value> TriggerFuncArg
195 %type <str> relation_name copy_file_name
196 database_name access_method_clause access_method attr_name
197 index_name name function_name file_name
199 %type <list> func_name handler_name qual_Op qual_all_Op subquery_Op
200 opt_class opt_validator
202 %type <range> qualified_name OptConstrFromTable
204 %type <str> all_Op MathOp SpecialRuleRelation
206 %type <str> iso_level opt_encoding
208 %type <list> grantee_list
209 %type <ival> privilege
210 %type <list> privileges privilege_list
211 %type <privtarget> privilege_target
212 %type <node> function_with_argtypes
213 %type <list> function_with_argtypes_list
214 %type <chr> TriggerOneEvent
216 %type <list> stmtblock stmtmulti
217 OptTableElementList TableElementList OptInherit definition
218 opt_distinct opt_definition func_args
219 func_args_list func_as createfunc_opt_list
220 oper_argtypes RuleActionList RuleActionMulti
221 opt_column_list columnList opt_name_list
222 sort_clause opt_sort_clause sortby_list index_params
223 name_list from_clause from_list opt_array_bounds
224 qualified_name_list any_name any_name_list
225 any_operator expr_list dotted_name attrs
226 target_list update_target_list insert_column_list
227 insert_target_list def_list opt_indirection
228 group_clause TriggerFuncArgs select_limit
229 opt_select_limit opclass_item_list transaction_mode_list
230 transaction_mode_list_or_empty
232 prep_type_clause prep_type_list
235 %type <range> into_clause OptTempTableName
237 %type <defelt> createfunc_opt_item
238 %type <fun_param> func_arg
239 %type <typnam> func_return func_type aggr_argtype
241 %type <boolean> arg_class TriggerForType OptTemp
242 %type <oncommit> OnCommitOption
243 %type <withoids> OptWithOids WithOidsAs
245 %type <list> for_update_clause opt_for_update_clause update_list
246 %type <boolean> opt_all
248 %type <node> join_outer join_qual
249 %type <jtype> join_type
251 %type <list> extract_list overlay_list position_list
252 %type <list> substr_list trim_list
253 %type <ival> opt_interval
254 %type <node> overlay_placing substr_from substr_for
256 %type <boolean> opt_instead opt_analyze
257 %type <boolean> index_opt_unique opt_verbose opt_full
258 %type <boolean> opt_freeze opt_default opt_recheck
259 %type <defelt> opt_binary opt_oids copy_delimiter
261 %type <boolean> copy_from opt_hold
263 %type <ival> fetch_count opt_column event cursor_options
264 %type <objtype> reindex_type drop_type comment_type
266 %type <node> fetch_direction select_limit_value select_offset_value
268 %type <list> OptSeqList
269 %type <defelt> OptSeqElem
271 %type <istmt> insert_rest
273 %type <vsetstmt> set_rest
275 %type <node> TableElement ConstraintElem TableFuncElement
276 %type <node> columnDef
277 %type <defelt> def_elem
278 %type <node> def_arg columnElem where_clause insert_column_item
279 a_expr b_expr c_expr AexprConst
280 in_expr having_clause func_table array_expr
281 %type <list> row type_list array_expr_list
282 %type <node> case_expr case_arg when_clause case_default
283 %type <list> when_clause_list
284 %type <ival> sub_type
285 %type <list> OptCreateAs CreateAsList
286 %type <node> CreateAsElement
287 %type <value> NumericOnly FloatOnly IntegerOnly
288 %type <columnref> columnref
289 %type <alias> alias_clause
290 %type <sortby> sortby
291 %type <ielem> index_elem
292 %type <node> table_ref
293 %type <jexpr> joined_table
294 %type <range> relation_expr
295 %type <target> target_el insert_target_el update_target_el
297 %type <typnam> Typename SimpleTypename ConstTypename
298 GenericType Numeric opt_float
299 Character ConstCharacter
300 CharacterWithLength CharacterWithoutLength
301 ConstDatetime ConstInterval
302 Bit ConstBit BitWithLength BitWithoutLength
303 %type <str> character
304 %type <str> extract_arg
305 %type <str> opt_charset
306 %type <ival> opt_numeric opt_decimal
307 %type <boolean> opt_varying opt_timezone
310 %type <str> Sconst comment_text
311 %type <str> UserId opt_boolean ColId_or_Sconst
312 %type <list> var_list var_list_or_default
313 %type <str> ColId ColLabel type_name param_name
314 %type <node> var_value zone_value
316 %type <keyword> unreserved_keyword func_name_keyword
317 %type <keyword> col_name_keyword reserved_keyword
319 %type <node> TableConstraint TableLikeClause
320 %type <list> ColQualList
321 %type <node> ColConstraint ColConstraintElem ConstraintAttr
322 %type <ival> key_actions key_delete key_match key_update key_action
323 %type <ival> ConstraintAttributeSpec ConstraintDeferrabilitySpec
326 %type <list> constraints_set_list
327 %type <boolean> constraints_set_mode
331 * If you make any token changes, update the keyword table in
332 * parser/keywords.c and add new keywords to the appropriate one of
333 * the reserved-or-not-so-reserved keyword lists, below.
336 /* ordinary key words in alphabetical order */
337 %token <keyword> ABORT_P ABSOLUTE_P ACCESS ACTION ADD AFTER
338 AGGREGATE ALL ALSO ALTER ANALYSE ANALYZE AND ANY ARRAY AS ASC
339 ASSERTION ASSIGNMENT AT AUTHORIZATION
341 BACKWARD BEFORE BEGIN_P BETWEEN BIGINT BINARY BIT
344 CACHE CALLED CASCADE CASE CAST CHAIN CHAR_P
345 CHARACTER CHARACTERISTICS CHECK CHECKPOINT CLASS CLOSE
346 CLUSTER COALESCE COLLATE COLUMN COMMENT COMMIT
347 COMMITTED CONSTRAINT CONSTRAINTS CONVERSION_P CONVERT COPY CREATE CREATEDB
348 CREATEUSER CROSS CSV CURRENT_DATE CURRENT_TIME
349 CURRENT_TIMESTAMP CURRENT_USER CURSOR CYCLE
351 DATABASE DAY_P DEALLOCATE DEC DECIMAL_P DECLARE DEFAULT DEFAULTS
352 DEFERRABLE DEFERRED DEFINER DELETE_P DELIMITER DELIMITERS
353 DESC DISTINCT DO DOMAIN_P DOUBLE_P DROP
355 EACH ELSE ENCODING ENCRYPTED END_P ESCAPE EXCEPT EXCLUDING
356 EXCLUSIVE EXECUTE EXISTS EXPLAIN EXTERNAL EXTRACT
358 FALSE_P FETCH FIRST_P FLOAT_P FOR FORCE FOREIGN FORWARD
359 FREEZE FROM FULL FUNCTION
363 HANDLER HAVING HOLD HOUR_P
365 ILIKE IMMEDIATE IMMUTABLE IMPLICIT_P IN_P INCLUDING INCREMENT
366 INDEX INHERITS INITIALLY INNER_P INOUT INPUT_P
367 INSENSITIVE INSERT INSTEAD INT_P INTEGER INTERSECT
368 INTERVAL INTO INVOKER IS ISNULL ISOLATION
374 LANCOMPILER LANGUAGE LARGE_P LAST_P LEADING LEFT LEVEL LIKE LIMIT
375 LISTEN LOAD LOCAL LOCALTIME LOCALTIMESTAMP LOCATION
378 MATCH MAXVALUE MINUTE_P MINVALUE MODE MONTH_P MOVE
380 NAMES NATIONAL NATURAL NCHAR NEW NEXT NO NOCREATEDB
381 NOCREATEUSER NONE NOT NOTHING NOTIFY NOTNULL NOWAIT NULL_P
384 OBJECT_P OF OFF OFFSET OIDS OLD ON ONLY OPERATOR OPTION OR
385 ORDER OUT_P OUTER_P OVERLAPS OVERLAY OWNER
387 PARTIAL PASSWORD PATH_P PENDANT PLACING POSITION
388 PRECISION PRESERVE PREPARE PRIMARY
389 PRIOR PRIVILEGES PROCEDURAL PROCEDURE
393 READ REAL RECHECK REFERENCES REINDEX RELATIVE_P RENAME REPEATABLE REPLACE
394 RESET RESTART RESTRICT RETURNS REVOKE RIGHT ROLLBACK ROW ROWS
397 SCHEMA SCROLL SECOND_P SECURITY SELECT SEQUENCE
398 SERIALIZABLE SESSION SESSION_USER SET SETOF SHARE
399 SHOW SIMILAR SIMPLE SMALLINT SOME STABLE START STATEMENT
400 STATISTICS STDIN STDOUT STORAGE STRICT_P SUBSTRING SYSID
402 TABLE TEMP TEMPLATE TEMPORARY THEN TIME TIMESTAMP
403 TO TOAST TRAILING TRANSACTION TREAT TRIGGER TRIM TRUE_P
404 TRUNCATE TRUSTED TYPE_P
406 UNCOMMITTED UNENCRYPTED UNION UNIQUE UNKNOWN UNLISTEN UNTIL
407 UPDATE USAGE USER USING
409 VACUUM VALID VALIDATOR VALUES VARCHAR VARYING
410 VERBOSE VERSION VIEW VOLATILE
412 WHEN WHERE WITH WITHOUT WORK WRITE
418 /* The grammar thinks these are keywords, but they are not in the keywords.c
419 * list and so can never be entered directly. The filter in parser.c
420 * creates these tokens when required.
424 /* Special keywords, not in the query language - see the "lex" file */
425 %token <str> IDENT FCONST SCONST BCONST XCONST Op
426 %token <ival> ICONST PARAM
428 /* precedence: lowest to highest */
436 %nonassoc LIKE ILIKE SIMILAR
441 %left POSTFIXOP /* dummy for postfix Op rules */
442 %left Op OPERATOR /* multi-character ops and user-defined operators */
445 %nonassoc IS NULL_P TRUE_P FALSE_P UNKNOWN /* sets precedence for IS NULL, etc */
449 /* Unary Operators */
450 %left AT ZONE /* sets precedence for AT TIME ZONE */
457 * These might seem to be low-precedence, but actually they are not part
458 * of the arithmetic hierarchy at all in their use as JOIN operators.
459 * We make them high-precedence to support their use as function names.
460 * They wouldn't be given a precedence at all, were it not that we need
461 * left-associativity among the JOIN rules themselves.
463 %left JOIN UNIONJOIN CROSS LEFT FULL RIGHT INNER_P NATURAL
467 * Handle comment-only lines, and ;; SELECT * FROM pg_class ;;;
468 * psql already handles such cases, but other interfaces don't.
471 stmtblock: stmtmulti { parsetree = $1; }
474 /* the thrashing around here is to discard "empty" statements... */
475 stmtmulti: stmtmulti ';' stmt
477 $$ = lappend($1, $3);
491 | AlterDatabaseSetStmt
508 | CreateConversionStmt
566 /*****************************************************************************
568 * Create a new Postgres DBMS user
571 *****************************************************************************/
574 CREATE USER UserId opt_with OptUserList
576 CreateUserStmt *n = makeNode(CreateUserStmt);
588 /*****************************************************************************
590 * Alter a postgresql DBMS user
593 *****************************************************************************/
596 ALTER USER UserId opt_with OptUserList
598 AlterUserStmt *n = makeNode(AlterUserStmt);
607 ALTER USER UserId SET set_rest
609 AlterUserSetStmt *n = makeNode(AlterUserSetStmt);
611 n->variable = $5->name;
615 | ALTER USER UserId VariableResetStmt
617 AlterUserSetStmt *n = makeNode(AlterUserSetStmt);
619 n->variable = ((VariableResetStmt *)$4)->name;
626 /*****************************************************************************
628 * Drop a postgresql DBMS user
630 * XXX Ideally this would have CASCADE/RESTRICT options, but since a user
631 * might own objects in multiple databases, there is presently no way to
632 * implement either cascading or restricting. Caveat DBA.
633 *****************************************************************************/
638 DropUserStmt *n = makeNode(DropUserStmt);
645 * Options for CREATE USER and ALTER USER
648 OptUserList OptUserElem { $$ = lappend($1, $2); }
649 | /* EMPTY */ { $$ = NIL; }
655 $$ = makeDefElem("password", (Node *)makeString($2));
657 | ENCRYPTED PASSWORD Sconst
659 $$ = makeDefElem("encryptedPassword", (Node *)makeString($3));
661 | UNENCRYPTED PASSWORD Sconst
663 $$ = makeDefElem("unencryptedPassword", (Node *)makeString($3));
667 $$ = makeDefElem("sysid", (Node *)makeInteger($2));
671 $$ = makeDefElem("createdb", (Node *)makeInteger(TRUE));
675 $$ = makeDefElem("createdb", (Node *)makeInteger(FALSE));
679 $$ = makeDefElem("createuser", (Node *)makeInteger(TRUE));
683 $$ = makeDefElem("createuser", (Node *)makeInteger(FALSE));
685 | IN_P GROUP_P user_list
687 $$ = makeDefElem("groupElts", (Node *)$3);
691 $$ = makeDefElem("validUntil", (Node *)makeString($3));
695 user_list: user_list ',' UserId { $$ = lappend($1, makeString($3)); }
696 | UserId { $$ = makeList1(makeString($1)); }
701 /*****************************************************************************
703 * Create a postgresql group
706 *****************************************************************************/
709 CREATE GROUP_P UserId opt_with OptGroupList
711 CreateGroupStmt *n = makeNode(CreateGroupStmt);
719 * Options for CREATE GROUP
722 OptGroupList OptGroupElem { $$ = lappend($1, $2); }
723 | /* EMPTY */ { $$ = NIL; }
729 $$ = makeDefElem("userElts", (Node *)$2);
733 $$ = makeDefElem("sysid", (Node *)makeInteger($2));
738 /*****************************************************************************
740 * Alter a postgresql group
743 *****************************************************************************/
746 ALTER GROUP_P UserId add_drop USER user_list
748 AlterGroupStmt *n = makeNode(AlterGroupStmt);
756 add_drop: ADD { $$ = +1; }
761 /*****************************************************************************
763 * Drop a postgresql group
765 * XXX see above notes about cascading DROP USER; groups have same problem.
766 *****************************************************************************/
771 DropGroupStmt *n = makeNode(DropGroupStmt);
778 /*****************************************************************************
780 * Manipulate a schema
782 *****************************************************************************/
785 CREATE SCHEMA OptSchemaName AUTHORIZATION UserId OptSchemaEltList
787 CreateSchemaStmt *n = makeNode(CreateSchemaStmt);
788 /* One can omit the schema name or the authorization id. */
797 | CREATE SCHEMA ColId OptSchemaEltList
799 CreateSchemaStmt *n = makeNode(CreateSchemaStmt);
800 /* ...but not both */
810 | /* EMPTY */ { $$ = NULL; }
814 OptSchemaEltList schema_stmt { $$ = lappend($1, $2); }
815 | /* EMPTY */ { $$ = NIL; }
819 * schema_stmt are the ones that can show up inside a CREATE SCHEMA
820 * statement (in addition to by themselves).
832 /*****************************************************************************
834 * Set PG internal variable
835 * SET name TO 'var_value'
836 * Include SQL92 syntax (thomas 1997-10-22):
837 * SET TIME ZONE 'var_value'
839 *****************************************************************************/
844 VariableSetStmt *n = $2;
850 VariableSetStmt *n = $3;
854 | SET SESSION set_rest
856 VariableSetStmt *n = $3;
862 set_rest: ColId TO var_list_or_default
864 VariableSetStmt *n = makeNode(VariableSetStmt);
869 | ColId '=' var_list_or_default
871 VariableSetStmt *n = makeNode(VariableSetStmt);
876 | TIME ZONE zone_value
878 VariableSetStmt *n = makeNode(VariableSetStmt);
879 n->name = "timezone";
881 n->args = makeList1($3);
884 | TRANSACTION transaction_mode_list
886 VariableSetStmt *n = makeNode(VariableSetStmt);
887 n->name = "TRANSACTION";
891 | SESSION CHARACTERISTICS AS TRANSACTION transaction_mode_list
893 VariableSetStmt *n = makeNode(VariableSetStmt);
894 n->name = "SESSION CHARACTERISTICS";
900 VariableSetStmt *n = makeNode(VariableSetStmt);
901 n->name = "client_encoding";
903 n->args = makeList1(makeStringConst($2, NULL));
906 | SESSION AUTHORIZATION ColId_or_Sconst
908 VariableSetStmt *n = makeNode(VariableSetStmt);
909 n->name = "session_authorization";
910 n->args = makeList1(makeStringConst($3, NULL));
913 | SESSION AUTHORIZATION DEFAULT
915 VariableSetStmt *n = makeNode(VariableSetStmt);
916 n->name = "session_authorization";
923 var_list { $$ = $1; }
924 | DEFAULT { $$ = NIL; }
927 var_list: var_value { $$ = makeList1($1); }
928 | var_list ',' var_value { $$ = lappend($1, $3); }
931 var_value: opt_boolean
932 { $$ = makeStringConst($1, NULL); }
934 { $$ = makeStringConst($1, NULL); }
936 { $$ = makeAConst($1); }
939 iso_level: READ UNCOMMITTED { $$ = "read uncommitted"; }
940 | READ COMMITTED { $$ = "read committed"; }
941 | REPEATABLE READ { $$ = "repeatable read"; }
942 | SERIALIZABLE { $$ = "serializable"; }
946 TRUE_P { $$ = "true"; }
947 | FALSE_P { $$ = "false"; }
949 | OFF { $$ = "off"; }
952 /* Timezone values can be:
953 * - a string such as 'pst8pdt'
954 * - an identifier such as "pst8pdt"
955 * - an integer or floating point number
956 * - a time interval per SQL99
957 * ColId gives reduce/reduce errors against ConstInterval and LOCAL,
958 * so use IDENT and reject anything which is a reserved word.
963 $$ = makeStringConst($1, NULL);
967 $$ = makeStringConst($1, NULL);
969 | ConstInterval Sconst opt_interval
971 A_Const *n = (A_Const *) makeStringConst($2, $1);
972 if ($3 != INTERVAL_FULL_RANGE)
974 if (($3 & ~(INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE))) != 0)
976 (errcode(ERRCODE_SYNTAX_ERROR),
977 errmsg("time zone interval must be HOUR or HOUR TO MINUTE")));
978 n->typename->typmod = INTERVAL_TYPMOD(INTERVAL_FULL_PRECISION, $3);
982 | ConstInterval '(' Iconst ')' Sconst opt_interval
984 A_Const *n = (A_Const *) makeStringConst($5, $1);
987 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
988 errmsg("INTERVAL(%d) precision must not be negative",
990 if ($3 > MAX_INTERVAL_PRECISION)
993 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
994 errmsg("INTERVAL(%d) precision reduced to maximum allowed, %d",
995 $3, MAX_INTERVAL_PRECISION)));
996 $3 = MAX_INTERVAL_PRECISION;
999 if (($6 != INTERVAL_FULL_RANGE)
1000 && (($6 & ~(INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE))) != 0))
1002 (errcode(ERRCODE_SYNTAX_ERROR),
1003 errmsg("time zone interval must be HOUR or HOUR TO MINUTE")));
1005 n->typename->typmod = INTERVAL_TYPMOD($3, $6);
1009 | NumericOnly { $$ = makeAConst($1); }
1010 | DEFAULT { $$ = NULL; }
1011 | LOCAL { $$ = NULL; }
1016 | DEFAULT { $$ = NULL; }
1017 | /*EMPTY*/ { $$ = NULL; }
1022 | SCONST { $$ = $1; }
1029 VariableShowStmt *n = makeNode(VariableShowStmt);
1035 VariableShowStmt *n = makeNode(VariableShowStmt);
1036 n->name = "timezone";
1039 | SHOW TRANSACTION ISOLATION LEVEL
1041 VariableShowStmt *n = makeNode(VariableShowStmt);
1042 n->name = "transaction_isolation";
1045 | SHOW SESSION AUTHORIZATION
1047 VariableShowStmt *n = makeNode(VariableShowStmt);
1048 n->name = "session_authorization";
1053 VariableShowStmt *n = makeNode(VariableShowStmt);
1062 VariableResetStmt *n = makeNode(VariableResetStmt);
1068 VariableResetStmt *n = makeNode(VariableResetStmt);
1069 n->name = "timezone";
1072 | RESET TRANSACTION ISOLATION LEVEL
1074 VariableResetStmt *n = makeNode(VariableResetStmt);
1075 n->name = "transaction_isolation";
1078 | RESET SESSION AUTHORIZATION
1080 VariableResetStmt *n = makeNode(VariableResetStmt);
1081 n->name = "session_authorization";
1086 VariableResetStmt *n = makeNode(VariableResetStmt);
1094 SET CONSTRAINTS constraints_set_list constraints_set_mode
1096 ConstraintsSetStmt *n = makeNode(ConstraintsSetStmt);
1097 n->constraints = $3;
1103 constraints_set_list:
1105 | name_list { $$ = $1; }
1108 constraints_set_mode:
1109 DEFERRED { $$ = TRUE; }
1110 | IMMEDIATE { $$ = FALSE; }
1115 * Checkpoint statement
1120 CheckPointStmt *n = makeNode(CheckPointStmt);
1126 /*****************************************************************************
1128 * ALTER TABLE variations
1130 *****************************************************************************/
1133 ALTER TABLE relation_expr alter_table_cmds
1135 AlterTableStmt *n = makeNode(AlterTableStmt);
1143 alter_table_cmd { $$ = makeList1($1); }
1144 | alter_table_cmds ',' alter_table_cmd { $$ = lappend($1, $3); }
1148 /* ALTER TABLE <relation> ADD [COLUMN] <coldef> */
1149 ADD opt_column columnDef
1151 AlterTableCmd *n = makeNode(AlterTableCmd);
1152 n->subtype = AT_AddColumn;
1156 /* ALTER TABLE <relation> ALTER [COLUMN] <colname> {SET DEFAULT <expr>|DROP DEFAULT} */
1157 | ALTER opt_column ColId alter_column_default
1159 AlterTableCmd *n = makeNode(AlterTableCmd);
1160 n->subtype = AT_ColumnDefault;
1165 /* ALTER TABLE <relation> ALTER [COLUMN] <colname> DROP NOT NULL */
1166 | ALTER opt_column ColId DROP NOT NULL_P
1168 AlterTableCmd *n = makeNode(AlterTableCmd);
1169 n->subtype = AT_DropNotNull;
1173 /* ALTER TABLE <relation> ALTER [COLUMN] <colname> SET NOT NULL */
1174 | ALTER opt_column ColId SET NOT NULL_P
1176 AlterTableCmd *n = makeNode(AlterTableCmd);
1177 n->subtype = AT_SetNotNull;
1181 /* ALTER TABLE <relation> ALTER [COLUMN] <colname> SET STATISTICS <IntegerOnly> */
1182 | ALTER opt_column ColId SET STATISTICS IntegerOnly
1184 AlterTableCmd *n = makeNode(AlterTableCmd);
1185 n->subtype = AT_SetStatistics;
1187 n->def = (Node *) $6;
1190 /* ALTER TABLE <relation> ALTER [COLUMN] <colname> SET STORAGE <storagemode> */
1191 | ALTER opt_column ColId SET STORAGE ColId
1193 AlterTableCmd *n = makeNode(AlterTableCmd);
1194 n->subtype = AT_SetStorage;
1196 n->def = (Node *) makeString($6);
1199 /* ALTER TABLE <relation> DROP [COLUMN] <colname> [RESTRICT|CASCADE] */
1200 | DROP opt_column ColId opt_drop_behavior
1202 AlterTableCmd *n = makeNode(AlterTableCmd);
1203 n->subtype = AT_DropColumn;
1209 * ALTER TABLE <relation> ALTER [COLUMN] <colname> TYPE <typename>
1210 * [ USING <expression> ]
1212 | ALTER opt_column ColId TYPE_P Typename alter_using
1214 AlterTableCmd *n = makeNode(AlterTableCmd);
1215 n->subtype = AT_AlterColumnType;
1217 n->def = (Node *) $5;
1221 /* ALTER TABLE <relation> ADD CONSTRAINT ... */
1222 | ADD TableConstraint
1224 AlterTableCmd *n = makeNode(AlterTableCmd);
1225 n->subtype = AT_AddConstraint;
1229 /* ALTER TABLE <relation> DROP CONSTRAINT <name> [RESTRICT|CASCADE] */
1230 | DROP CONSTRAINT name opt_drop_behavior
1232 AlterTableCmd *n = makeNode(AlterTableCmd);
1233 n->subtype = AT_DropConstraint;
1238 /* ALTER TABLE <relation> SET WITHOUT OIDS */
1241 AlterTableCmd *n = makeNode(AlterTableCmd);
1242 n->subtype = AT_DropOids;
1245 /* ALTER TABLE <name> CREATE TOAST TABLE -- ONLY */
1246 | CREATE TOAST TABLE
1248 AlterTableCmd *n = makeNode(AlterTableCmd);
1249 n->subtype = AT_ToastTable;
1252 /* ALTER TABLE <name> OWNER TO UserId */
1255 AlterTableCmd *n = makeNode(AlterTableCmd);
1256 n->subtype = AT_ChangeOwner;
1260 /* ALTER TABLE <name> CLUSTER ON <indexname> */
1263 AlterTableCmd *n = makeNode(AlterTableCmd);
1264 n->subtype = AT_ClusterOn;
1270 alter_column_default:
1273 /* Treat SET DEFAULT NULL the same as DROP DEFAULT */
1274 if (exprIsNullConstant($3))
1279 | DROP DEFAULT { $$ = NULL; }
1283 CASCADE { $$ = DROP_CASCADE; }
1284 | RESTRICT { $$ = DROP_RESTRICT; }
1285 | /* EMPTY */ { $$ = DROP_RESTRICT; /* default */ }
1289 USING a_expr { $$ = $2; }
1290 | /* EMPTY */ { $$ = NULL; }
1293 /*****************************************************************************
1296 * close <portalname>
1298 *****************************************************************************/
1303 ClosePortalStmt *n = makeNode(ClosePortalStmt);
1310 /*****************************************************************************
1313 * COPY <relname> ['(' columnList ')'] FROM/TO [WITH options]
1315 * BINARY, OIDS, and DELIMITERS kept in old locations
1316 * for backward compatibility. 2002-06-18
1318 *****************************************************************************/
1320 CopyStmt: COPY opt_binary qualified_name opt_column_list opt_oids
1321 copy_from copy_file_name copy_delimiter opt_with copy_opt_list
1323 CopyStmt *n = makeNode(CopyStmt);
1330 /* Concatenate user-supplied flags */
1332 n->options = lappend(n->options, $2);
1334 n->options = lappend(n->options, $5);
1336 n->options = lappend(n->options, $8);
1338 n->options = nconc(n->options, $10);
1345 | TO { $$ = FALSE; }
1349 * copy_file_name NULL indicates stdio is used. Whether stdin or stdout is
1350 * used depends on the direction. (It really doesn't make sense to copy from
1351 * stdout. We silently correct the "typo". - AY 9/94
1355 | STDIN { $$ = NULL; }
1356 | STDOUT { $$ = NULL; }
1362 copy_opt_list copy_opt_item { $$ = lappend($1, $2); }
1363 | /* EMPTY */ { $$ = NIL; }
1370 $$ = makeDefElem("binary", (Node *)makeInteger(TRUE));
1374 $$ = makeDefElem("oids", (Node *)makeInteger(TRUE));
1376 | DELIMITER opt_as Sconst
1378 $$ = makeDefElem("delimiter", (Node *)makeString($3));
1380 | NULL_P opt_as Sconst
1382 $$ = makeDefElem("null", (Node *)makeString($3));
1386 $$ = makeDefElem("csv", (Node *)makeInteger(TRUE));
1388 | QUOTE opt_as Sconst
1390 $$ = makeDefElem("quote", (Node *)makeString($3));
1392 | ESCAPE opt_as Sconst
1394 $$ = makeDefElem("escape", (Node *)makeString($3));
1396 | FORCE QUOTE columnList
1398 $$ = makeDefElem("force_quote", (Node *)$3);
1400 | FORCE NOT NULL_P columnList
1402 $$ = makeDefElem("force_notnull", (Node *)$4);
1406 /* The following exist for backward compatibility */
1411 $$ = makeDefElem("binary", (Node *)makeInteger(TRUE));
1413 | /*EMPTY*/ { $$ = NULL; }
1419 $$ = makeDefElem("oids", (Node *)makeInteger(TRUE));
1421 | /*EMPTY*/ { $$ = NULL; }
1425 /* USING DELIMITERS kept for backward compatibility. 2002-06-15 */
1426 opt_using DELIMITERS Sconst
1428 $$ = makeDefElem("delimiter", (Node *)makeString($3));
1430 | /*EMPTY*/ { $$ = NULL; }
1439 /*****************************************************************************
1442 * CREATE TABLE relname
1444 *****************************************************************************/
1446 CreateStmt: CREATE OptTemp TABLE qualified_name '(' OptTableElementList ')'
1447 OptInherit OptWithOids OnCommitOption
1449 CreateStmt *n = makeNode(CreateStmt);
1453 n->inhRelations = $8;
1454 n->constraints = NIL;
1459 | CREATE OptTemp TABLE qualified_name OF qualified_name
1460 '(' OptTableElementList ')' OptWithOids OnCommitOption
1462 /* SQL99 CREATE TABLE OF <UDT> (cols) seems to be satisfied
1463 * by our inheritance capabilities. Let's try it...
1465 CreateStmt *n = makeNode(CreateStmt);
1469 n->inhRelations = makeList1($6);
1470 n->constraints = NIL;
1478 * Redundancy here is needed to avoid shift/reduce conflicts,
1479 * since TEMP is not a reserved word. See also OptTempTableName.
1481 * NOTE: we accept both GLOBAL and LOCAL options; since we have no modules
1482 * the LOCAL keyword is really meaningless.
1484 OptTemp: TEMPORARY { $$ = TRUE; }
1485 | TEMP { $$ = TRUE; }
1486 | LOCAL TEMPORARY { $$ = TRUE; }
1487 | LOCAL TEMP { $$ = TRUE; }
1488 | GLOBAL TEMPORARY { $$ = TRUE; }
1489 | GLOBAL TEMP { $$ = TRUE; }
1490 | /*EMPTY*/ { $$ = FALSE; }
1493 OptTableElementList:
1494 TableElementList { $$ = $1; }
1495 | /*EMPTY*/ { $$ = NIL; }
1503 | TableElementList ',' TableElement
1505 $$ = lappend($1, $3);
1510 columnDef { $$ = $1; }
1511 | TableLikeClause { $$ = $1; }
1512 | TableConstraint { $$ = $1; }
1515 columnDef: ColId Typename ColQualList
1517 ColumnDef *n = makeNode(ColumnDef);
1520 n->constraints = $3;
1527 ColQualList ColConstraint { $$ = lappend($1, $2); }
1528 | /*EMPTY*/ { $$ = NIL; }
1532 CONSTRAINT name ColConstraintElem
1534 switch (nodeTag($3))
1538 Constraint *n = (Constraint *)$3;
1542 case T_FkConstraint:
1544 FkConstraint *n = (FkConstraint *)$3;
1545 n->constr_name = $2;
1553 | ColConstraintElem { $$ = $1; }
1554 | ConstraintAttr { $$ = $1; }
1557 /* DEFAULT NULL is already the default for Postgres.
1558 * But define it here and carry it forward into the system
1559 * to make it explicit.
1560 * - thomas 1998-09-13
1562 * WITH NULL and NULL are not SQL92-standard syntax elements,
1563 * so leave them out. Use DEFAULT NULL to explicitly indicate
1564 * that a column may have that value. WITH NULL leads to
1565 * shift/reduce conflicts with WITH TIME ZONE anyway.
1566 * - thomas 1999-01-08
1568 * DEFAULT expression must be b_expr not a_expr to prevent shift/reduce
1569 * conflict on NOT (since NOT might start a subsequent NOT NULL constraint,
1570 * or be part of a_expr NOT LIKE or similar constructs).
1575 Constraint *n = makeNode(Constraint);
1576 n->contype = CONSTR_NOTNULL;
1579 n->cooked_expr = NULL;
1585 Constraint *n = makeNode(Constraint);
1586 n->contype = CONSTR_NULL;
1589 n->cooked_expr = NULL;
1595 Constraint *n = makeNode(Constraint);
1596 n->contype = CONSTR_UNIQUE;
1599 n->cooked_expr = NULL;
1605 Constraint *n = makeNode(Constraint);
1606 n->contype = CONSTR_PRIMARY;
1609 n->cooked_expr = NULL;
1613 | CHECK '(' a_expr ')'
1615 Constraint *n = makeNode(Constraint);
1616 n->contype = CONSTR_CHECK;
1619 n->cooked_expr = NULL;
1625 Constraint *n = makeNode(Constraint);
1626 n->contype = CONSTR_DEFAULT;
1628 if (exprIsNullConstant($2))
1630 /* DEFAULT NULL should be reported as empty expr */
1637 n->cooked_expr = NULL;
1641 | REFERENCES qualified_name opt_column_list key_match key_actions
1643 FkConstraint *n = makeNode(FkConstraint);
1644 n->constr_name = NULL;
1648 n->fk_matchtype = $4;
1649 n->fk_upd_action = (char) ($5 >> 8);
1650 n->fk_del_action = (char) ($5 & 0xFF);
1651 n->deferrable = FALSE;
1652 n->initdeferred = FALSE;
1658 * ConstraintAttr represents constraint attributes, which we parse as if
1659 * they were independent constraint clauses, in order to avoid shift/reduce
1660 * conflicts (since NOT might start either an independent NOT NULL clause
1661 * or an attribute). analyze.c is responsible for attaching the attribute
1662 * information to the preceding "real" constraint node, and for complaining
1663 * if attribute clauses appear in the wrong place or wrong combinations.
1665 * See also ConstraintAttributeSpec, which can be used in places where
1666 * there is no parsing conflict.
1671 Constraint *n = makeNode(Constraint);
1672 n->contype = CONSTR_ATTR_DEFERRABLE;
1677 Constraint *n = makeNode(Constraint);
1678 n->contype = CONSTR_ATTR_NOT_DEFERRABLE;
1681 | INITIALLY DEFERRED
1683 Constraint *n = makeNode(Constraint);
1684 n->contype = CONSTR_ATTR_DEFERRED;
1687 | INITIALLY IMMEDIATE
1689 Constraint *n = makeNode(Constraint);
1690 n->contype = CONSTR_ATTR_IMMEDIATE;
1697 * SQL99 supports wholesale borrowing of a table definition via the LIKE clause.
1698 * This seems to be a poor man's inheritance capability, with the resulting
1699 * tables completely decoupled except for the original commonality in definitions.
1701 * This is very similar to CREATE TABLE AS except for the INCLUDING DEFAULTS extension
1702 * which is a part of SQL 200N
1705 LIKE qualified_name like_including_defaults
1707 InhRelation *n = makeNode(InhRelation);
1709 n->including_defaults = $3;
1715 like_including_defaults:
1716 INCLUDING DEFAULTS { $$ = true; }
1717 | EXCLUDING DEFAULTS { $$ = false; }
1718 | /* EMPTY */ { $$ = false; }
1722 /* ConstraintElem specifies constraint syntax which is not embedded into
1723 * a column definition. ColConstraintElem specifies the embedded form.
1724 * - thomas 1997-12-03
1727 CONSTRAINT name ConstraintElem
1729 switch (nodeTag($3))
1733 Constraint *n = (Constraint *)$3;
1737 case T_FkConstraint:
1739 FkConstraint *n = (FkConstraint *)$3;
1740 n->constr_name = $2;
1748 | ConstraintElem { $$ = $1; }
1752 CHECK '(' a_expr ')'
1754 Constraint *n = makeNode(Constraint);
1755 n->contype = CONSTR_CHECK;
1758 n->cooked_expr = NULL;
1761 | UNIQUE '(' columnList ')'
1763 Constraint *n = makeNode(Constraint);
1764 n->contype = CONSTR_UNIQUE;
1767 n->cooked_expr = NULL;
1771 | PRIMARY KEY '(' columnList ')'
1773 Constraint *n = makeNode(Constraint);
1774 n->contype = CONSTR_PRIMARY;
1777 n->cooked_expr = NULL;
1781 | FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
1782 opt_column_list key_match key_actions ConstraintAttributeSpec
1784 FkConstraint *n = makeNode(FkConstraint);
1785 n->constr_name = NULL;
1789 n->fk_matchtype = $9;
1790 n->fk_upd_action = (char) ($10 >> 8);
1791 n->fk_del_action = (char) ($10 & 0xFF);
1792 n->deferrable = ($11 & 1) != 0;
1793 n->initdeferred = ($11 & 2) != 0;
1799 '(' columnList ')' { $$ = $2; }
1800 | /*EMPTY*/ { $$ = NIL; }
1804 columnElem { $$ = makeList1($1); }
1805 | columnList ',' columnElem { $$ = lappend($1, $3); }
1810 $$ = (Node *) makeString($1);
1814 key_match: MATCH FULL
1816 $$ = FKCONSTR_MATCH_FULL;
1821 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1822 errmsg("MATCH PARTIAL not yet implemented")));
1823 $$ = FKCONSTR_MATCH_PARTIAL;
1827 $$ = FKCONSTR_MATCH_UNSPECIFIED;
1831 $$ = FKCONSTR_MATCH_UNSPECIFIED;
1836 * We combine the update and delete actions into one value temporarily
1837 * for simplicity of parsing, and then break them down again in the
1838 * calling production. update is in the left 8 bits, delete in the right.
1839 * Note that NOACTION is the default.
1843 { $$ = ($1 << 8) | (FKCONSTR_ACTION_NOACTION & 0xFF); }
1845 { $$ = (FKCONSTR_ACTION_NOACTION << 8) | ($1 & 0xFF); }
1846 | key_update key_delete
1847 { $$ = ($1 << 8) | ($2 & 0xFF); }
1848 | key_delete key_update
1849 { $$ = ($2 << 8) | ($1 & 0xFF); }
1851 { $$ = (FKCONSTR_ACTION_NOACTION << 8) | (FKCONSTR_ACTION_NOACTION & 0xFF); }
1854 key_update: ON UPDATE key_action { $$ = $3; }
1857 key_delete: ON DELETE_P key_action { $$ = $3; }
1861 NO ACTION { $$ = FKCONSTR_ACTION_NOACTION; }
1862 | RESTRICT { $$ = FKCONSTR_ACTION_RESTRICT; }
1863 | CASCADE { $$ = FKCONSTR_ACTION_CASCADE; }
1864 | SET NULL_P { $$ = FKCONSTR_ACTION_SETNULL; }
1865 | SET DEFAULT { $$ = FKCONSTR_ACTION_SETDEFAULT; }
1868 OptInherit: INHERITS '(' qualified_name_list ')' { $$ = $3; }
1869 | /*EMPTY*/ { $$ = NIL; }
1873 WITH OIDS { $$ = MUST_HAVE_OIDS; }
1874 | WITHOUT OIDS { $$ = MUST_NOT_HAVE_OIDS; }
1875 | /*EMPTY*/ { $$ = DEFAULT_OIDS; }
1878 OnCommitOption: ON COMMIT DROP { $$ = ONCOMMIT_DROP; }
1879 | ON COMMIT DELETE_P ROWS { $$ = ONCOMMIT_DELETE_ROWS; }
1880 | ON COMMIT PRESERVE ROWS { $$ = ONCOMMIT_PRESERVE_ROWS; }
1881 | /*EMPTY*/ { $$ = ONCOMMIT_NOOP; }
1886 * Note: CREATE TABLE ... AS SELECT ... is just another spelling for
1891 CREATE OptTemp TABLE qualified_name OptCreateAs WithOidsAs SelectStmt
1894 * When the SelectStmt is a set-operation tree, we must
1895 * stuff the INTO information into the leftmost component
1896 * Select, because that's where analyze.c will expect
1897 * to find it. Similarly, the output column names must
1898 * be attached to that Select's target list.
1900 SelectStmt *n = findLeftmostSelect((SelectStmt *) $7);
1901 if (n->into != NULL)
1903 (errcode(ERRCODE_SYNTAX_ERROR),
1904 errmsg("CREATE TABLE AS may not specify INTO")));
1907 n->intoColNames = $5;
1908 n->intoHasOids = $6;
1914 * To avoid a shift/reduce conflict in CreateAsStmt, we need to
1915 * include the 'AS' terminal in the parsing of WITH/WITHOUT
1916 * OIDS. Unfortunately that means this production is effectively a
1917 * duplicate of OptWithOids.
1920 WITH OIDS AS { $$ = MUST_HAVE_OIDS; }
1921 | WITHOUT OIDS AS { $$ = MUST_NOT_HAVE_OIDS; }
1922 | AS { $$ = DEFAULT_OIDS; }
1926 '(' CreateAsList ')' { $$ = $2; }
1927 | /*EMPTY*/ { $$ = NIL; }
1931 CreateAsElement { $$ = makeList1($1); }
1932 | CreateAsList ',' CreateAsElement { $$ = lappend($1, $3); }
1938 ColumnDef *n = makeNode(ColumnDef);
1943 n->is_not_null = false;
1944 n->raw_default = NULL;
1945 n->cooked_default = NULL;
1946 n->constraints = NIL;
1953 /*****************************************************************************
1956 * CREATE SEQUENCE seqname
1957 * ALTER SEQUENCE seqname
1959 *****************************************************************************/
1962 CREATE OptTemp SEQUENCE qualified_name OptSeqList
1964 CreateSeqStmt *n = makeNode(CreateSeqStmt);
1973 ALTER SEQUENCE qualified_name OptSeqList
1975 AlterSeqStmt *n = makeNode(AlterSeqStmt);
1982 OptSeqList: OptSeqList OptSeqElem { $$ = lappend($1, $2); }
1983 | /*EMPTY*/ { $$ = NIL; }
1986 OptSeqElem: CACHE NumericOnly
1988 $$ = makeDefElem("cache", (Node *)$2);
1992 $$ = makeDefElem("cycle", (Node *)makeInteger(TRUE));
1996 $$ = makeDefElem("cycle", (Node *)makeInteger(FALSE));
1998 | INCREMENT opt_by NumericOnly
2000 $$ = makeDefElem("increment", (Node *)$3);
2002 | MAXVALUE NumericOnly
2004 $$ = makeDefElem("maxvalue", (Node *)$2);
2006 | MINVALUE NumericOnly
2008 $$ = makeDefElem("minvalue", (Node *)$2);
2012 $$ = makeDefElem("maxvalue", NULL);
2016 $$ = makeDefElem("minvalue", NULL);
2018 | START opt_with NumericOnly
2020 $$ = makeDefElem("start", (Node *)$3);
2022 | RESTART opt_with NumericOnly
2024 $$ = makeDefElem("restart", (Node *)$3);
2033 FloatOnly { $$ = $1; }
2034 | IntegerOnly { $$ = $1; }
2037 FloatOnly: FCONST { $$ = makeFloat($1); }
2048 $$ = makeInteger($1);
2052 $$ = makeInteger($2);
2053 $$->val.ival = - $$->val.ival;
2057 /*****************************************************************************
2060 * CREATE PROCEDURAL LANGUAGE ...
2061 * DROP PROCEDURAL LANGUAGE ...
2063 *****************************************************************************/
2066 CREATE opt_trusted opt_procedural LANGUAGE ColId_or_Sconst
2067 HANDLER handler_name opt_validator opt_lancompiler
2069 CreatePLangStmt *n = makeNode(CreatePLangStmt);
2072 n->plvalidator = $8;
2079 TRUSTED { $$ = TRUE; }
2080 | /*EMPTY*/ { $$ = FALSE; }
2083 /* This ought to be just func_name, but that causes reduce/reduce conflicts
2084 * (CREATE LANGUAGE is the only place where func_name isn't followed by '(').
2085 * Work around by using name and dotted_name separately.
2089 { $$ = makeList1(makeString($1)); }
2090 | dotted_name { $$ = $1; }
2094 LANCOMPILER Sconst { $$ = $2; }
2095 | /*EMPTY*/ { $$ = ""; }
2099 VALIDATOR handler_name { $$ = $2; }
2100 | /*EMPTY*/ { $$ = NULL; }
2104 DROP opt_procedural LANGUAGE ColId_or_Sconst opt_drop_behavior
2106 DropPLangStmt *n = makeNode(DropPLangStmt);
2118 /*****************************************************************************
2121 * CREATE TRIGGER ...
2124 *****************************************************************************/
2127 CREATE TRIGGER name TriggerActionTime TriggerEvents ON
2128 qualified_name TriggerForSpec EXECUTE PROCEDURE
2129 func_name '(' TriggerFuncArgs ')'
2131 CreateTrigStmt *n = makeNode(CreateTrigStmt);
2138 memcpy(n->actions, $5, 4);
2139 n->isconstraint = FALSE;
2140 n->deferrable = FALSE;
2141 n->initdeferred = FALSE;
2142 n->constrrel = NULL;
2145 | CREATE CONSTRAINT TRIGGER name AFTER TriggerEvents ON
2146 qualified_name OptConstrFromTable
2147 ConstraintAttributeSpec
2148 FOR EACH ROW EXECUTE PROCEDURE
2149 func_name '(' TriggerFuncArgs ')'
2151 CreateTrigStmt *n = makeNode(CreateTrigStmt);
2158 memcpy(n->actions, $6, 4);
2159 n->isconstraint = TRUE;
2160 n->deferrable = ($10 & 1) != 0;
2161 n->initdeferred = ($10 & 2) != 0;
2169 BEFORE { $$ = TRUE; }
2170 | AFTER { $$ = FALSE; }
2176 char *e = palloc(4);
2177 e[0] = $1; e[1] = '\0';
2180 | TriggerOneEvent OR TriggerOneEvent
2182 char *e = palloc(4);
2183 e[0] = $1; e[1] = $3; e[2] = '\0';
2186 | TriggerOneEvent OR TriggerOneEvent OR TriggerOneEvent
2188 char *e = palloc(4);
2189 e[0] = $1; e[1] = $3; e[2] = $5; e[3] = '\0';
2195 INSERT { $$ = 'i'; }
2196 | DELETE_P { $$ = 'd'; }
2197 | UPDATE { $$ = 'u'; }
2201 FOR TriggerForOpt TriggerForType
2208 * If ROW/STATEMENT not specified, default to
2209 * STATEMENT, per SQL
2222 | STATEMENT { $$ = FALSE; }
2226 TriggerFuncArg { $$ = makeList1($1); }
2227 | TriggerFuncArgs ',' TriggerFuncArg { $$ = lappend($1, $3); }
2228 | /*EMPTY*/ { $$ = NIL; }
2235 snprintf(buf, sizeof(buf), "%d", $1);
2236 $$ = makeString(pstrdup(buf));
2238 | FCONST { $$ = makeString($1); }
2239 | Sconst { $$ = makeString($1); }
2240 | BCONST { $$ = makeString($1); }
2241 | XCONST { $$ = makeString($1); }
2242 | ColId { $$ = makeString($1); }
2246 FROM qualified_name { $$ = $2; }
2247 | /*EMPTY*/ { $$ = NULL; }
2250 ConstraintAttributeSpec:
2251 ConstraintDeferrabilitySpec
2253 | ConstraintDeferrabilitySpec ConstraintTimeSpec
2255 if ($1 == 0 && $2 != 0)
2257 (errcode(ERRCODE_SYNTAX_ERROR),
2258 errmsg("constraint declared INITIALLY DEFERRED must be DEFERRABLE")));
2261 | ConstraintTimeSpec
2268 | ConstraintTimeSpec ConstraintDeferrabilitySpec
2270 if ($2 == 0 && $1 != 0)
2272 (errcode(ERRCODE_SYNTAX_ERROR),
2273 errmsg("constraint declared INITIALLY DEFERRED must be DEFERRABLE")));
2280 ConstraintDeferrabilitySpec:
2281 NOT DEFERRABLE { $$ = 0; }
2282 | DEFERRABLE { $$ = 1; }
2286 INITIALLY IMMEDIATE { $$ = 0; }
2287 | INITIALLY DEFERRED { $$ = 2; }
2292 DROP TRIGGER name ON qualified_name opt_drop_behavior
2294 DropPropertyStmt *n = makeNode(DropPropertyStmt);
2298 n->removeType = OBJECT_TRIGGER;
2304 /*****************************************************************************
2307 * CREATE ASSERTION ...
2308 * DROP ASSERTION ...
2310 *****************************************************************************/
2313 CREATE ASSERTION name CHECK '(' a_expr ')'
2314 ConstraintAttributeSpec
2316 CreateTrigStmt *n = makeNode(CreateTrigStmt);
2318 n->args = makeList1($6);
2319 n->isconstraint = TRUE;
2320 n->deferrable = ($8 & 1) != 0;
2321 n->initdeferred = ($8 & 2) != 0;
2324 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2325 errmsg("CREATE ASSERTION is not yet implemented")));
2332 DROP ASSERTION name opt_drop_behavior
2334 DropPropertyStmt *n = makeNode(DropPropertyStmt);
2338 n->removeType = OBJECT_TRIGGER; /* XXX */
2340 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2341 errmsg("DROP ASSERTION is not yet implemented")));
2347 /*****************************************************************************
2350 * define (aggregate,operator,type)
2352 *****************************************************************************/
2355 CREATE AGGREGATE func_name definition
2357 DefineStmt *n = makeNode(DefineStmt);
2358 n->kind = OBJECT_AGGREGATE;
2363 | CREATE OPERATOR any_operator definition
2365 DefineStmt *n = makeNode(DefineStmt);
2366 n->kind = OBJECT_OPERATOR;
2371 | CREATE TYPE_P any_name definition
2373 DefineStmt *n = makeNode(DefineStmt);
2374 n->kind = OBJECT_TYPE;
2379 | CREATE TYPE_P any_name AS '(' TableFuncElementList ')'
2381 CompositeTypeStmt *n = makeNode(CompositeTypeStmt);
2382 RangeVar *r = makeNode(RangeVar);
2384 /* can't use qualified_name, sigh */
2388 r->catalogname = NULL;
2389 r->schemaname = NULL;
2390 r->relname = strVal(linitial($3));
2393 r->catalogname = NULL;
2394 r->schemaname = strVal(linitial($3));
2395 r->relname = strVal(lsecond($3));
2398 r->catalogname = strVal(linitial($3));
2399 r->schemaname = strVal(lsecond($3));
2400 r->relname = strVal(lthird($3));
2404 (errcode(ERRCODE_SYNTAX_ERROR),
2405 errmsg("improper qualified name (too many dotted names): %s",
2406 NameListToString($3))));
2415 definition: '(' def_list ')' { $$ = $2; }
2418 def_list: def_elem { $$ = makeList1($1); }
2419 | def_list ',' def_elem { $$ = lappend($1, $3); }
2422 def_elem: ColLabel '=' def_arg
2424 $$ = makeDefElem($1, (Node *)$3);
2428 $$ = makeDefElem($1, NULL);
2432 /* Note: any simple identifier will be returned as a type name! */
2433 def_arg: func_return { $$ = (Node *)$1; }
2434 | qual_all_Op { $$ = (Node *)$1; }
2435 | NumericOnly { $$ = (Node *)$1; }
2436 | Sconst { $$ = (Node *)makeString($1); }
2440 /*****************************************************************************
2443 * CREATE OPERATOR CLASS ...
2444 * DROP OPERATOR CLASS ...
2446 *****************************************************************************/
2449 CREATE OPERATOR CLASS any_name opt_default FOR TYPE_P Typename
2450 USING access_method AS opclass_item_list
2452 CreateOpClassStmt *n = makeNode(CreateOpClassStmt);
2453 n->opclassname = $4;
2463 opclass_item { $$ = makeList1($1); }
2464 | opclass_item_list ',' opclass_item { $$ = lappend($1, $3); }
2468 OPERATOR Iconst any_operator opt_recheck
2470 CreateOpClassItem *n = makeNode(CreateOpClassItem);
2471 n->itemtype = OPCLASS_ITEM_OPERATOR;
2478 | OPERATOR Iconst any_operator '(' oper_argtypes ')' opt_recheck
2480 CreateOpClassItem *n = makeNode(CreateOpClassItem);
2481 n->itemtype = OPCLASS_ITEM_OPERATOR;
2488 | FUNCTION Iconst func_name func_args
2490 CreateOpClassItem *n = makeNode(CreateOpClassItem);
2491 n->itemtype = OPCLASS_ITEM_FUNCTION;
2493 n->args = extractArgTypes($4);
2499 CreateOpClassItem *n = makeNode(CreateOpClassItem);
2500 n->itemtype = OPCLASS_ITEM_STORAGETYPE;
2506 opt_default: DEFAULT { $$ = TRUE; }
2507 | /*EMPTY*/ { $$ = FALSE; }
2510 opt_recheck: RECHECK { $$ = TRUE; }
2511 | /*EMPTY*/ { $$ = FALSE; }
2516 DROP OPERATOR CLASS any_name USING access_method opt_drop_behavior
2518 RemoveOpClassStmt *n = makeNode(RemoveOpClassStmt);
2519 n->opclassname = $4;
2527 /*****************************************************************************
2531 * DROP itemtype itemname [, itemname ...] [ RESTRICT | CASCADE ]
2533 *****************************************************************************/
2535 DropStmt: DROP drop_type any_name_list opt_drop_behavior
2537 DropStmt *n = makeNode(DropStmt);
2545 drop_type: TABLE { $$ = OBJECT_TABLE; }
2546 | SEQUENCE { $$ = OBJECT_SEQUENCE; }
2547 | VIEW { $$ = OBJECT_VIEW; }
2548 | INDEX { $$ = OBJECT_INDEX; }
2549 | TYPE_P { $$ = OBJECT_TYPE; }
2550 | DOMAIN_P { $$ = OBJECT_DOMAIN; }
2551 | CONVERSION_P { $$ = OBJECT_CONVERSION; }
2552 | SCHEMA { $$ = OBJECT_SCHEMA; }
2556 any_name { $$ = makeList1($1); }
2557 | any_name_list ',' any_name { $$ = lappend($1, $3); }
2560 any_name: ColId { $$ = makeList1(makeString($1)); }
2561 | dotted_name { $$ = $1; }
2564 /*****************************************************************************
2567 * truncate table relname
2569 *****************************************************************************/
2572 TRUNCATE opt_table qualified_name
2574 TruncateStmt *n = makeNode(TruncateStmt);
2580 /*****************************************************************************
2582 * The COMMENT ON statement can take different forms based upon the type of
2583 * the object associated with the comment. The form of the statement is:
2585 * COMMENT ON [ [ DATABASE | DOMAIN | INDEX | SEQUENCE | TABLE | TYPE | VIEW |
2586 * CONVERSION | LANGUAGE | OPERATOR CLASS | LARGE OBJECT |
2587 * CAST ] <objname> |
2588 * AGGREGATE <aggname> (<aggtype>) |
2589 * FUNCTION <funcname> (arg1, arg2, ...) |
2590 * OPERATOR <op> (leftoperand_typ, rightoperand_typ) |
2591 * TRIGGER <triggername> ON <relname> |
2592 * RULE <rulename> ON <relname> ]
2595 *****************************************************************************/
2598 COMMENT ON comment_type any_name IS comment_text
2600 CommentStmt *n = makeNode(CommentStmt);
2607 | COMMENT ON AGGREGATE func_name '(' aggr_argtype ')'
2610 CommentStmt *n = makeNode(CommentStmt);
2611 n->objtype = OBJECT_AGGREGATE;
2613 n->objargs = makeList1($6);
2617 | COMMENT ON FUNCTION func_name func_args IS comment_text
2619 CommentStmt *n = makeNode(CommentStmt);
2620 n->objtype = OBJECT_FUNCTION;
2622 n->objargs = extractArgTypes($5);
2626 | COMMENT ON OPERATOR any_operator '(' oper_argtypes ')'
2629 CommentStmt *n = makeNode(CommentStmt);
2630 n->objtype = OBJECT_OPERATOR;
2636 | COMMENT ON CONSTRAINT name ON any_name IS comment_text
2638 CommentStmt *n = makeNode(CommentStmt);
2639 n->objtype = OBJECT_CONSTRAINT;
2640 n->objname = lappend($6, makeString($4));
2645 | COMMENT ON RULE name ON any_name IS comment_text
2647 CommentStmt *n = makeNode(CommentStmt);
2648 n->objtype = OBJECT_RULE;
2649 n->objname = lappend($6, makeString($4));
2654 | COMMENT ON RULE name IS comment_text
2656 /* Obsolete syntax supported for awhile for compatibility */
2657 CommentStmt *n = makeNode(CommentStmt);
2658 n->objtype = OBJECT_RULE;
2659 n->objname = makeList1(makeString($4));
2664 | COMMENT ON TRIGGER name ON any_name IS comment_text
2666 CommentStmt *n = makeNode(CommentStmt);
2667 n->objtype = OBJECT_TRIGGER;
2668 n->objname = lappend($6, makeString($4));
2673 | COMMENT ON OPERATOR CLASS any_name USING access_method IS comment_text
2675 CommentStmt *n = makeNode(CommentStmt);
2676 n->objtype = OBJECT_OPCLASS;
2678 n->objargs = makeList1(makeString($7));
2682 | COMMENT ON LARGE_P OBJECT_P NumericOnly IS comment_text
2684 CommentStmt *n = makeNode(CommentStmt);
2685 n->objtype = OBJECT_LARGEOBJECT;
2686 n->objname = makeList1($5);
2691 | COMMENT ON CAST '(' Typename AS Typename ')' IS comment_text
2693 CommentStmt *n = makeNode(CommentStmt);
2694 n->objtype = OBJECT_CAST;
2695 n->objname = makeList1($5);
2696 n->objargs = makeList1($7);
2700 | COMMENT ON opt_procedural LANGUAGE any_name IS comment_text
2702 CommentStmt *n = makeNode(CommentStmt);
2703 n->objtype = OBJECT_LANGUAGE;
2712 COLUMN { $$ = OBJECT_COLUMN; }
2713 | DATABASE { $$ = OBJECT_DATABASE; }
2714 | SCHEMA { $$ = OBJECT_SCHEMA; }
2715 | INDEX { $$ = OBJECT_INDEX; }
2716 | SEQUENCE { $$ = OBJECT_SEQUENCE; }
2717 | TABLE { $$ = OBJECT_TABLE; }
2718 | DOMAIN_P { $$ = OBJECT_TYPE; }
2719 | TYPE_P { $$ = OBJECT_TYPE; }
2720 | VIEW { $$ = OBJECT_VIEW; }
2721 | CONVERSION_P { $$ = OBJECT_CONVERSION; }
2726 | NULL_P { $$ = NULL; }
2729 /*****************************************************************************
2734 *****************************************************************************/
2736 FetchStmt: FETCH fetch_direction from_in name
2738 FetchStmt *n = (FetchStmt *) $2;
2745 FetchStmt *n = makeNode(FetchStmt);
2746 n->direction = FETCH_FORWARD;
2752 | MOVE fetch_direction from_in name
2754 FetchStmt *n = (FetchStmt *) $2;
2761 FetchStmt *n = makeNode(FetchStmt);
2762 n->direction = FETCH_FORWARD;
2773 FetchStmt *n = makeNode(FetchStmt);
2774 n->direction = FETCH_FORWARD;
2780 FetchStmt *n = makeNode(FetchStmt);
2781 n->direction = FETCH_FORWARD;
2787 FetchStmt *n = makeNode(FetchStmt);
2788 n->direction = FETCH_BACKWARD;
2794 FetchStmt *n = makeNode(FetchStmt);
2795 n->direction = FETCH_ABSOLUTE;
2801 FetchStmt *n = makeNode(FetchStmt);
2802 n->direction = FETCH_ABSOLUTE;
2806 | ABSOLUTE_P fetch_count
2808 FetchStmt *n = makeNode(FetchStmt);
2809 n->direction = FETCH_ABSOLUTE;
2813 | RELATIVE_P fetch_count
2815 FetchStmt *n = makeNode(FetchStmt);
2816 n->direction = FETCH_RELATIVE;
2822 FetchStmt *n = makeNode(FetchStmt);
2823 n->direction = FETCH_FORWARD;
2829 FetchStmt *n = makeNode(FetchStmt);
2830 n->direction = FETCH_FORWARD;
2831 n->howMany = FETCH_ALL;
2836 FetchStmt *n = makeNode(FetchStmt);
2837 n->direction = FETCH_FORWARD;
2841 | FORWARD fetch_count
2843 FetchStmt *n = makeNode(FetchStmt);
2844 n->direction = FETCH_FORWARD;
2850 FetchStmt *n = makeNode(FetchStmt);
2851 n->direction = FETCH_FORWARD;
2852 n->howMany = FETCH_ALL;
2857 FetchStmt *n = makeNode(FetchStmt);
2858 n->direction = FETCH_BACKWARD;
2862 | BACKWARD fetch_count
2864 FetchStmt *n = makeNode(FetchStmt);
2865 n->direction = FETCH_BACKWARD;
2871 FetchStmt *n = makeNode(FetchStmt);
2872 n->direction = FETCH_BACKWARD;
2873 n->howMany = FETCH_ALL;
2880 | '-' Iconst { $$ = - $2; }
2888 /*****************************************************************************
2890 * GRANT and REVOKE statements
2892 *****************************************************************************/
2894 GrantStmt: GRANT privileges ON privilege_target TO grantee_list
2895 opt_grant_grant_option
2897 GrantStmt *n = makeNode(GrantStmt);
2900 n->objtype = ($4)->objtype;
2901 n->objects = ($4)->objs;
2903 n->grant_option = $7;
2908 RevokeStmt: REVOKE opt_revoke_grant_option privileges ON privilege_target
2909 FROM grantee_list opt_drop_behavior
2911 GrantStmt *n = makeNode(GrantStmt);
2912 n->is_grant = false;
2914 n->objtype = ($5)->objtype;
2915 n->objects = ($5)->objs;
2917 n->grant_option = $2;
2925 /* either ALL [PRIVILEGES] or a list of individual privileges */
2926 privileges: privilege_list { $$ = $1; }
2927 | ALL { $$ = makeListi1(ACL_ALL_RIGHTS); }
2928 | ALL PRIVILEGES { $$ = makeListi1(ACL_ALL_RIGHTS); }
2932 privilege { $$ = makeListi1($1); }
2933 | privilege_list ',' privilege { $$ = lappendi($1, $3); }
2936 /* Not all of these privilege types apply to all objects, but that
2937 * gets sorted out later.
2939 privilege: SELECT { $$ = ACL_SELECT; }
2940 | INSERT { $$ = ACL_INSERT; }
2941 | UPDATE { $$ = ACL_UPDATE; }
2942 | DELETE_P { $$ = ACL_DELETE; }
2943 | RULE { $$ = ACL_RULE; }
2944 | REFERENCES { $$ = ACL_REFERENCES; }
2945 | TRIGGER { $$ = ACL_TRIGGER; }
2946 | EXECUTE { $$ = ACL_EXECUTE; }
2947 | USAGE { $$ = ACL_USAGE; }
2948 | CREATE { $$ = ACL_CREATE; }
2949 | TEMPORARY { $$ = ACL_CREATE_TEMP; }
2950 | TEMP { $$ = ACL_CREATE_TEMP; }
2954 /* Don't bother trying to fold the first two rules into one using
2955 opt_table. You're going to get conflicts. */
2959 PrivTarget *n = makeNode(PrivTarget);
2960 n->objtype = ACL_OBJECT_RELATION;
2964 | TABLE qualified_name_list
2966 PrivTarget *n = makeNode(PrivTarget);
2967 n->objtype = ACL_OBJECT_RELATION;
2971 | FUNCTION function_with_argtypes_list
2973 PrivTarget *n = makeNode(PrivTarget);
2974 n->objtype = ACL_OBJECT_FUNCTION;
2978 | DATABASE name_list
2980 PrivTarget *n = makeNode(PrivTarget);
2981 n->objtype = ACL_OBJECT_DATABASE;
2985 | LANGUAGE name_list
2987 PrivTarget *n = makeNode(PrivTarget);
2988 n->objtype = ACL_OBJECT_LANGUAGE;
2994 PrivTarget *n = makeNode(PrivTarget);
2995 n->objtype = ACL_OBJECT_NAMESPACE;
3003 grantee { $$ = makeList1($1); }
3004 | grantee_list ',' grantee { $$ = lappend($1, $3); }
3009 PrivGrantee *n = makeNode(PrivGrantee);
3010 /* This hack lets us avoid reserving PUBLIC as a keyword*/
3011 if (strcmp($1, "public") == 0)
3015 n->groupname = NULL;
3020 PrivGrantee *n = makeNode(PrivGrantee);
3021 /* Treat GROUP PUBLIC as a synonym for PUBLIC */
3022 if (strcmp($2, "public") == 0)
3023 n->groupname = NULL;
3032 opt_grant_grant_option:
3033 WITH GRANT OPTION { $$ = TRUE; }
3034 | /*EMPTY*/ { $$ = FALSE; }
3037 opt_revoke_grant_option:
3038 GRANT OPTION FOR { $$ = TRUE; }
3039 | /*EMPTY*/ { $$ = FALSE; }
3043 function_with_argtypes_list:
3044 function_with_argtypes { $$ = makeList1($1); }
3045 | function_with_argtypes_list ',' function_with_argtypes
3046 { $$ = lappend($1, $3); }
3049 function_with_argtypes:
3052 FuncWithArgs *n = makeNode(FuncWithArgs);
3054 n->funcargs = extractArgTypes($2);
3060 /*****************************************************************************
3063 * create index <indexname> on <relname>
3064 * [ using <access> ] "(" ( <col> [ using <opclass> ] )+ ")"
3065 * [ where <predicate> ]
3067 *****************************************************************************/
3069 IndexStmt: CREATE index_opt_unique INDEX index_name ON qualified_name
3070 access_method_clause '(' index_params ')' where_clause
3072 IndexStmt *n = makeNode(IndexStmt);
3076 n->accessMethod = $7;
3077 n->indexParams = $9;
3078 n->whereClause = $11;
3084 UNIQUE { $$ = TRUE; }
3085 | /*EMPTY*/ { $$ = FALSE; }
3088 access_method_clause:
3089 USING access_method { $$ = $2; }
3090 | /*EMPTY*/ { $$ = DEFAULT_INDEX_TYPE; }
3093 index_params: index_elem { $$ = makeList1($1); }
3094 | index_params ',' index_elem { $$ = lappend($1, $3); }
3098 * Index attributes can be either simple column references, or arbitrary
3099 * expressions in parens. For backwards-compatibility reasons, we allow
3100 * an expression that's just a function call to be written without parens.
3102 index_elem: attr_name opt_class
3104 $$ = makeNode(IndexElem);
3109 | func_name '(' expr_list ')' opt_class
3111 FuncCall *n = makeNode(FuncCall);
3114 n->agg_star = FALSE;
3115 n->agg_distinct = FALSE;
3117 $$ = makeNode(IndexElem);
3119 $$->expr = (Node *)n;
3122 | '(' a_expr ')' opt_class
3124 $$ = makeNode(IndexElem);
3131 opt_class: any_name { $$ = $1; }
3132 | USING any_name { $$ = $2; }
3133 | /*EMPTY*/ { $$ = NIL; }
3136 /*****************************************************************************
3139 * create [or replace] function <fname>
3140 * [(<type-1> { , <type-n>})]
3142 * as <filename or code in language as appropriate>
3143 * language <lang> [with parameters]
3145 *****************************************************************************/
3148 CREATE opt_or_replace FUNCTION func_name func_args
3149 RETURNS func_return createfunc_opt_list opt_definition
3151 CreateFunctionStmt *n = makeNode(CreateFunctionStmt);
3163 OR REPLACE { $$ = TRUE; }
3164 | /*EMPTY*/ { $$ = FALSE; }
3167 func_args: '(' func_args_list ')' { $$ = $2; }
3168 | '(' ')' { $$ = NIL; }
3172 func_arg { $$ = makeList1($1); }
3173 | func_args_list ',' func_arg { $$ = lappend($1, $3); }
3176 /* We can catch over-specified arguments here if we want to,
3177 * but for now better to silently swallow typmod, etc.
3178 * - thomas 2000-03-22
3181 arg_class param_name func_type
3183 FunctionParameter *n = makeNode(FunctionParameter);
3188 | arg_class func_type
3190 FunctionParameter *n = makeNode(FunctionParameter);
3197 arg_class: IN_P { $$ = FALSE; }
3201 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3202 errmsg("CREATE FUNCTION / OUT parameters are not implemented")));
3208 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3209 errmsg("CREATE FUNCTION / INOUT parameters are not implemented")));
3212 | /*EMPTY*/ { $$ = FALSE; }
3216 * Ideally param_name should be ColId, but that causes too many conflicts.
3218 param_name: function_name
3224 /* We can catch over-specified arguments here if we want to,
3225 * but for now better to silently swallow typmod, etc.
3226 * - thomas 2000-03-22
3233 * We would like to make the second production here be ColId attrs etc,
3234 * but that causes reduce/reduce conflicts. type_name is next best choice.
3236 func_type: Typename { $$ = $1; }
3237 | type_name attrs '%' TYPE_P
3239 $$ = makeNode(TypeName);
3240 $$->names = lcons(makeString($1), $2);
3241 $$->pct_type = true;
3247 createfunc_opt_list:
3248 /* Must be at least one to prevent conflict */
3249 createfunc_opt_item { $$ = makeList1($1); }
3250 | createfunc_opt_list createfunc_opt_item { $$ = lappend($1, $2); }
3253 createfunc_opt_item:
3256 $$ = makeDefElem("as", (Node *)$2);
3258 | LANGUAGE ColId_or_Sconst
3260 $$ = makeDefElem("language", (Node *)makeString($2));
3264 $$ = makeDefElem("volatility", (Node *)makeString("immutable"));
3268 $$ = makeDefElem("volatility", (Node *)makeString("stable"));
3272 $$ = makeDefElem("volatility", (Node *)makeString("volatile"));
3274 | CALLED ON NULL_P INPUT_P
3276 $$ = makeDefElem("strict", (Node *)makeInteger(FALSE));
3278 | RETURNS NULL_P ON NULL_P INPUT_P
3280 $$ = makeDefElem("strict", (Node *)makeInteger(TRUE));
3284 $$ = makeDefElem("strict", (Node *)makeInteger(TRUE));
3286 | EXTERNAL SECURITY DEFINER
3288 $$ = makeDefElem("security", (Node *)makeInteger(TRUE));
3290 | EXTERNAL SECURITY INVOKER
3292 $$ = makeDefElem("security", (Node *)makeInteger(FALSE));
3296 $$ = makeDefElem("security", (Node *)makeInteger(TRUE));
3300 $$ = makeDefElem("security", (Node *)makeInteger(FALSE));
3304 func_as: Sconst { $$ = makeList1(makeString($1)); }
3307 $$ = makeList2(makeString($1), makeString($3));
3312 WITH definition { $$ = $2; }
3313 | /*EMPTY*/ { $$ = NIL; }
3317 /*****************************************************************************
3321 * DROP FUNCTION funcname (arg1, arg2, ...) [ RESTRICT | CASCADE ]
3322 * DROP AGGREGATE aggname (aggtype) [ RESTRICT | CASCADE ]
3323 * DROP OPERATOR opname (leftoperand_typ, rightoperand_typ) [ RESTRICT | CASCADE ]
3325 *****************************************************************************/
3328 DROP FUNCTION func_name func_args opt_drop_behavior
3330 RemoveFuncStmt *n = makeNode(RemoveFuncStmt);
3332 n->args = extractArgTypes($4);
3339 DROP AGGREGATE func_name '(' aggr_argtype ')' opt_drop_behavior
3341 RemoveAggrStmt *n = makeNode(RemoveAggrStmt);
3350 Typename { $$ = $1; }
3351 | '*' { $$ = NULL; }
3355 DROP OPERATOR any_operator '(' oper_argtypes ')' opt_drop_behavior
3357 RemoveOperStmt *n = makeNode(RemoveOperStmt);
3369 (errcode(ERRCODE_SYNTAX_ERROR),
3370 errmsg("missing argument"),
3371 errhint("Use NONE to denote the missing argument of a unary operator.")));
3373 | Typename ',' Typename
3374 { $$ = makeList2($1, $3); }
3375 | NONE ',' Typename /* left unary */
3376 { $$ = makeList2(NULL, $3); }
3377 | Typename ',' NONE /* right unary */
3378 { $$ = makeList2($1, NULL); }
3383 { $$ = makeList1(makeString($1)); }
3384 | ColId '.' any_operator
3385 { $$ = lcons(makeString($1), $3); }
3389 /*****************************************************************************
3391 * CREATE CAST / DROP CAST
3393 *****************************************************************************/
3395 CreateCastStmt: CREATE CAST '(' Typename AS Typename ')'
3396 WITH FUNCTION function_with_argtypes cast_context
3398 CreateCastStmt *n = makeNode(CreateCastStmt);
3401 n->func = (FuncWithArgs *) $10;
3402 n->context = (CoercionContext) $11;
3405 | CREATE CAST '(' Typename AS Typename ')'
3406 WITHOUT FUNCTION cast_context
3408 CreateCastStmt *n = makeNode(CreateCastStmt);
3412 n->context = (CoercionContext) $10;
3417 cast_context: AS IMPLICIT_P { $$ = COERCION_IMPLICIT; }
3418 | AS ASSIGNMENT { $$ = COERCION_ASSIGNMENT; }
3419 | /*EMPTY*/ { $$ = COERCION_EXPLICIT; }
3423 DropCastStmt: DROP CAST '(' Typename AS Typename ')' opt_drop_behavior
3425 DropCastStmt *n = makeNode(DropCastStmt);
3435 /*****************************************************************************
3439 * REINDEX type <typename> [FORCE] [ALL]
3441 *****************************************************************************/
3444 REINDEX reindex_type qualified_name opt_force
3446 ReindexStmt *n = makeNode(ReindexStmt);
3453 | REINDEX DATABASE name opt_force
3455 ReindexStmt *n = makeNode(ReindexStmt);
3456 n->kind = OBJECT_DATABASE;
3465 INDEX { $$ = OBJECT_INDEX; }
3466 | TABLE { $$ = OBJECT_TABLE; }
3469 opt_force: FORCE { $$ = TRUE; }
3470 | /* EMPTY */ { $$ = FALSE; }
3474 /*****************************************************************************
3476 * ALTER THING name RENAME TO newname
3478 *****************************************************************************/
3480 RenameStmt: ALTER AGGREGATE func_name '(' aggr_argtype ')' RENAME TO name
3482 RenameStmt *n = makeNode(RenameStmt);
3483 n->renameType = OBJECT_AGGREGATE;
3485 n->objarg = makeList1($5);
3489 | ALTER CONVERSION_P any_name RENAME TO name
3491 RenameStmt *n = makeNode(RenameStmt);
3492 n->renameType = OBJECT_CONVERSION;
3497 | ALTER DATABASE database_name RENAME TO database_name
3499 RenameStmt *n = makeNode(RenameStmt);
3500 n->renameType = OBJECT_DATABASE;
3505 | ALTER FUNCTION func_name func_args RENAME TO name
3507 RenameStmt *n = makeNode(RenameStmt);
3508 n->renameType = OBJECT_FUNCTION;
3510 n->objarg = extractArgTypes($4);
3514 | ALTER GROUP_P UserId RENAME TO UserId
3516 RenameStmt *n = makeNode(RenameStmt);
3517 n->renameType = OBJECT_GROUP;
3522 | ALTER LANGUAGE name RENAME TO name
3524 RenameStmt *n = makeNode(RenameStmt);
3525 n->renameType = OBJECT_LANGUAGE;
3530 | ALTER OPERATOR CLASS any_name USING access_method RENAME TO name
3532 RenameStmt *n = makeNode(RenameStmt);
3533 n->renameType = OBJECT_OPCLASS;
3539 | ALTER SCHEMA name RENAME TO name
3541 RenameStmt *n = makeNode(RenameStmt);
3542 n->renameType = OBJECT_SCHEMA;
3547 | ALTER TABLE relation_expr RENAME TO name
3549 RenameStmt *n = makeNode(RenameStmt);
3550 n->renameType = OBJECT_TABLE;
3556 | ALTER TABLE relation_expr RENAME opt_column name TO name
3558 RenameStmt *n = makeNode(RenameStmt);
3559 n->renameType = OBJECT_COLUMN;
3565 | ALTER TRIGGER name ON relation_expr RENAME TO name
3567 RenameStmt *n = makeNode(RenameStmt);
3571 n->renameType = OBJECT_TRIGGER;
3574 | ALTER USER UserId RENAME TO UserId
3576 RenameStmt *n = makeNode(RenameStmt);
3577 n->renameType = OBJECT_USER;
3584 opt_column: COLUMN { $$ = COLUMN; }
3585 | /*EMPTY*/ { $$ = 0; }
3589 /*****************************************************************************
3591 * QUERY: Define Rewrite Rule
3593 *****************************************************************************/
3595 RuleStmt: CREATE opt_or_replace RULE name AS
3596 { QueryIsRule=TRUE; }
3597 ON event TO qualified_name where_clause
3598 DO opt_instead RuleActionList
3600 RuleStmt *n = makeNode(RuleStmt);
3604 n->whereClause = $11;
3614 NOTHING { $$ = NIL; }
3615 | RuleActionStmt { $$ = makeList1($1); }
3616 | '(' RuleActionMulti ')' { $$ = $2; }
3619 /* the thrashing around here is to discard "empty" statements... */
3621 RuleActionMulti ';' RuleActionStmtOrEmpty
3623 $$ = lappend($1, $3);
3627 | RuleActionStmtOrEmpty
3643 RuleActionStmtOrEmpty:
3644 RuleActionStmt { $$ = $1; }
3645 | /*EMPTY*/ { $$ = NULL; }
3648 /* change me to select, update, etc. some day */
3649 event: SELECT { $$ = CMD_SELECT; }
3650 | UPDATE { $$ = CMD_UPDATE; }
3651 | DELETE_P { $$ = CMD_DELETE; }
3652 | INSERT { $$ = CMD_INSERT; }
3656 INSTEAD { $$ = TRUE; }
3657 | ALSO { $$ = FALSE; }
3658 | /*EMPTY*/ { $$ = FALSE; }
3663 DROP RULE name ON qualified_name opt_drop_behavior
3665 DropPropertyStmt *n = makeNode(DropPropertyStmt);
3669 n->removeType = OBJECT_RULE;
3675 /*****************************************************************************
3678 * NOTIFY <qualified_name> can appear both in rule bodies and
3679 * as a query-level command
3681 *****************************************************************************/
3683 NotifyStmt: NOTIFY qualified_name
3685 NotifyStmt *n = makeNode(NotifyStmt);
3691 ListenStmt: LISTEN qualified_name
3693 ListenStmt *n = makeNode(ListenStmt);
3700 UNLISTEN qualified_name
3702 UnlistenStmt *n = makeNode(UnlistenStmt);
3708 UnlistenStmt *n = makeNode(UnlistenStmt);
3709 n->relation = makeNode(RangeVar);
3710 n->relation->relname = "*";
3711 n->relation->schemaname = NULL;
3717 /*****************************************************************************
3721 * BEGIN / COMMIT / ROLLBACK
3722 * (also older versions END / ABORT)
3724 *****************************************************************************/
3727 ABORT_P opt_transaction
3729 TransactionStmt *n = makeNode(TransactionStmt);
3730 n->kind = TRANS_STMT_ROLLBACK;
3734 | BEGIN_P opt_transaction transaction_mode_list_or_empty
3736 TransactionStmt *n = makeNode(TransactionStmt);
3737 n->kind = TRANS_STMT_BEGIN;
3741 | START TRANSACTION transaction_mode_list_or_empty
3743 TransactionStmt *n = makeNode(TransactionStmt);
3744 n->kind = TRANS_STMT_START;
3748 | COMMIT opt_transaction
3750 TransactionStmt *n = makeNode(TransactionStmt);
3751 n->kind = TRANS_STMT_COMMIT;
3755 | END_P opt_transaction
3757 TransactionStmt *n = makeNode(TransactionStmt);
3758 n->kind = TRANS_STMT_COMMIT;
3762 | ROLLBACK opt_transaction
3764 TransactionStmt *n = makeNode(TransactionStmt);
3765 n->kind = TRANS_STMT_ROLLBACK;
3771 opt_transaction: WORK {}
3776 transaction_mode_list:
3777 ISOLATION LEVEL iso_level
3778 { $$ = makeList1(makeDefElem("transaction_isolation",
3779 makeStringConst($3, NULL))); }
3780 | transaction_access_mode
3781 { $$ = makeList1(makeDefElem("transaction_read_only",
3782 makeIntConst($1))); }
3783 | ISOLATION LEVEL iso_level transaction_access_mode
3785 $$ = makeList2(makeDefElem("transaction_isolation",
3786 makeStringConst($3, NULL)),
3787 makeDefElem("transaction_read_only",
3790 | transaction_access_mode ISOLATION LEVEL iso_level
3792 $$ = makeList2(makeDefElem("transaction_read_only",
3794 makeDefElem("transaction_isolation",
3795 makeStringConst($4, NULL)));
3799 transaction_mode_list_or_empty:
3800 transaction_mode_list
3805 transaction_access_mode:
3806 READ ONLY { $$ = TRUE; }
3807 | READ WRITE { $$ = FALSE; }
3811 /*****************************************************************************
3814 * create view <viewname> '('target-list ')' AS <query>
3816 *****************************************************************************/
3818 ViewStmt: CREATE opt_or_replace VIEW qualified_name opt_column_list
3821 ViewStmt *n = makeNode(ViewStmt);
3825 n->query = (Query *) $7;
3831 /*****************************************************************************
3836 *****************************************************************************/
3838 LoadStmt: LOAD file_name
3840 LoadStmt *n = makeNode(LoadStmt);
3847 /*****************************************************************************
3851 *****************************************************************************/
3854 CREATE DATABASE database_name opt_with createdb_opt_list
3856 CreatedbStmt *n = makeNode(CreatedbStmt);
3864 createdb_opt_list createdb_opt_item { $$ = lappend($1, $2); }
3865 | /* EMPTY */ { $$ = NIL; }
3869 LOCATION opt_equal Sconst
3871 $$ = makeDefElem("location", (Node *)makeString($3));
3873 | LOCATION opt_equal DEFAULT
3875 $$ = makeDefElem("location", NULL);
3877 | TEMPLATE opt_equal name
3879 $$ = makeDefElem("template", (Node *)makeString($3));
3881 | TEMPLATE opt_equal DEFAULT
3883 $$ = makeDefElem("template", NULL);
3885 | ENCODING opt_equal Sconst
3887 $$ = makeDefElem("encoding", (Node *)makeString($3));
3889 | ENCODING opt_equal Iconst
3891 $$ = makeDefElem("encoding", (Node *)makeInteger($3));
3893 | ENCODING opt_equal DEFAULT
3895 $$ = makeDefElem("encoding", NULL);
3897 | OWNER opt_equal name
3899 $$ = makeDefElem("owner", (Node *)makeString($3));
3901 | OWNER opt_equal DEFAULT
3903 $$ = makeDefElem("owner", NULL);
3908 * Though the equals sign doesn't match other WITH options, pg_dump uses
3909 * equals for backward compability, and it doesn't seem worth removing it.
3917 /*****************************************************************************
3921 *****************************************************************************/
3923 AlterDbOwnerStmt: ALTER DATABASE database_name OWNER TO UserId
3925 AlterDbOwnerStmt *n = makeNode(AlterDbOwnerStmt);
3932 AlterDatabaseSetStmt:
3933 ALTER DATABASE database_name SET set_rest
3935 AlterDatabaseSetStmt *n = makeNode(AlterDatabaseSetStmt);
3937 n->variable = $5->name;
3938 n->value = $5->args;
3941 | ALTER DATABASE database_name VariableResetStmt
3943 AlterDatabaseSetStmt *n = makeNode(AlterDatabaseSetStmt);
3945 n->variable = ((VariableResetStmt *)$4)->name;
3952 /*****************************************************************************
3956 * This is implicitly CASCADE, no need for drop behavior
3957 *****************************************************************************/
3959 DropdbStmt: DROP DATABASE database_name
3961 DropdbStmt *n = makeNode(DropdbStmt);
3968 /*****************************************************************************
3970 * Manipulate a domain
3972 *****************************************************************************/
3975 CREATE DOMAIN_P any_name opt_as Typename ColQualList
3977 CreateDomainStmt *n = makeNode(CreateDomainStmt);
3980 n->constraints = $6;
3986 /* ALTER DOMAIN <domain> {SET DEFAULT <expr>|DROP DEFAULT} */
3987 ALTER DOMAIN_P any_name alter_column_default
3989 AlterDomainStmt *n = makeNode(AlterDomainStmt);
3995 /* ALTER DOMAIN <domain> DROP NOT NULL */
3996 | ALTER DOMAIN_P any_name DROP NOT NULL_P
3998 AlterDomainStmt *n = makeNode(AlterDomainStmt);
4003 /* ALTER DOMAIN <domain> SET NOT NULL */
4004 | ALTER DOMAIN_P any_name SET NOT NULL_P
4006 AlterDomainStmt *n = makeNode(AlterDomainStmt);
4011 /* ALTER DOMAIN <domain> ADD CONSTRAINT ... */
4012 | ALTER DOMAIN_P any_name ADD TableConstraint
4014 AlterDomainStmt *n = makeNode(AlterDomainStmt);
4020 /* ALTER DOMAIN <domain> DROP CONSTRAINT <name> [RESTRICT|CASCADE] */
4021 | ALTER DOMAIN_P any_name DROP CONSTRAINT name opt_drop_behavior
4023 AlterDomainStmt *n = makeNode(AlterDomainStmt);
4030 /* ALTER DOMAIN <domain> OWNER TO UserId */
4031 | ALTER DOMAIN_P any_name OWNER TO UserId
4033 AlterDomainStmt *n = makeNode(AlterDomainStmt);
4046 /*****************************************************************************
4048 * Manipulate a conversion
4050 * CREATE [DEFAULT] CONVERSION <conversion_name>
4051 * FOR <encoding_name> TO <encoding_name> FROM <func_name>
4053 *****************************************************************************/
4055 CreateConversionStmt:
4056 CREATE opt_default CONVERSION_P any_name FOR Sconst
4057 TO Sconst FROM any_name
4059 CreateConversionStmt *n = makeNode(CreateConversionStmt);
4060 n->conversion_name = $4;
4061 n->for_encoding_name = $6;
4062 n->to_encoding_name = $8;
4069 /*****************************************************************************
4072 * cluster <index_name> on <qualified_name>
4073 * cluster <qualified_name>
4076 *****************************************************************************/
4079 CLUSTER index_name ON qualified_name
4081 ClusterStmt *n = makeNode(ClusterStmt);
4086 | CLUSTER qualified_name
4088 ClusterStmt *n = makeNode(ClusterStmt);
4090 n->indexname = NULL;
4095 ClusterStmt *n = makeNode(ClusterStmt);
4097 n->indexname = NULL;
4102 /*****************************************************************************
4108 *****************************************************************************/
4110 VacuumStmt: VACUUM opt_full opt_freeze opt_verbose
4112 VacuumStmt *n = makeNode(VacuumStmt);
4122 | VACUUM opt_full opt_freeze opt_verbose qualified_name
4124 VacuumStmt *n = makeNode(VacuumStmt);
4134 | VACUUM opt_full opt_freeze opt_verbose AnalyzeStmt
4136 VacuumStmt *n = (VacuumStmt *) $5;
4146 analyze_keyword opt_verbose
4148 VacuumStmt *n = makeNode(VacuumStmt);
4158 | analyze_keyword opt_verbose qualified_name opt_name_list
4160 VacuumStmt *n = makeNode(VacuumStmt);
4174 | ANALYSE /* British */ {}
4178 VERBOSE { $$ = TRUE; }
4179 | /*EMPTY*/ { $$ = FALSE; }
4182 opt_full: FULL { $$ = TRUE; }
4183 | /*EMPTY*/ { $$ = FALSE; }
4186 opt_freeze: FREEZE { $$ = TRUE; }
4187 | /*EMPTY*/ { $$ = FALSE; }
4191 '(' name_list ')' { $$ = $2; }
4192 | /*EMPTY*/ { $$ = NIL; }
4196 /*****************************************************************************
4199 * EXPLAIN [ANALYZE] [VERBOSE] query
4201 *****************************************************************************/
4203 ExplainStmt: EXPLAIN opt_analyze opt_verbose ExplainableStmt
4205 ExplainStmt *n = makeNode(ExplainStmt);
4208 n->query = (Query*)$4;
4219 | ExecuteStmt /* by default all are $$=$1 */
4223 analyze_keyword { $$ = TRUE; }
4224 | /* EMPTY */ { $$ = FALSE; }
4227 /*****************************************************************************
4230 * PREPARE <plan_name> [(args, ...)] AS <query>
4232 *****************************************************************************/
4234 PrepareStmt: PREPARE name prep_type_clause AS PreparableStmt
4236 PrepareStmt *n = makeNode(PrepareStmt);
4239 n->query = (Query *) $5;
4244 prep_type_clause: '(' prep_type_list ')' { $$ = $2; }
4245 | /* EMPTY */ { $$ = NIL; }
4248 prep_type_list: Typename { $$ = makeList1($1); }
4249 | prep_type_list ',' Typename
4250 { $$ = lappend($1, $3); }
4257 | DeleteStmt /* by default all are $$=$1 */
4260 /*****************************************************************************
4262 * EXECUTE <plan_name> [(params, ...)]
4263 * CREATE TABLE <name> AS EXECUTE <plan_name> [(params, ...)]
4265 *****************************************************************************/
4267 ExecuteStmt: EXECUTE name execute_param_clause
4269 ExecuteStmt *n = makeNode(ExecuteStmt);
4275 | CREATE OptTemp TABLE qualified_name OptCreateAs AS EXECUTE name execute_param_clause
4277 ExecuteStmt *n = makeNode(ExecuteStmt);
4284 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
4285 errmsg("column name list not allowed in CREATE TABLE / AS EXECUTE")));
4286 /* ... because it's not implemented, but it could be */
4291 execute_param_clause: '(' expr_list ')' { $$ = $2; }
4292 | /* EMPTY */ { $$ = NIL; }
4295 /*****************************************************************************
4298 * DEALLOCATE [PREPARE] <plan_name>
4300 *****************************************************************************/
4302 DeallocateStmt: DEALLOCATE name
4304 DeallocateStmt *n = makeNode(DeallocateStmt);
4308 | DEALLOCATE PREPARE name
4310 DeallocateStmt *n = makeNode(DeallocateStmt);
4316 /*****************************************************************************
4321 *****************************************************************************/
4324 INSERT INTO qualified_name insert_rest
4332 VALUES '(' insert_target_list ')'
4334 $$ = makeNode(InsertStmt);
4336 $$->targetList = $3;
4337 $$->selectStmt = NULL;
4341 $$ = makeNode(InsertStmt);
4343 $$->targetList = NIL;
4344 $$->selectStmt = NULL;
4348 $$ = makeNode(InsertStmt);
4350 $$->targetList = NIL;
4351 $$->selectStmt = $1;
4353 | '(' insert_column_list ')' VALUES '(' insert_target_list ')'
4355 $$ = makeNode(InsertStmt);
4357 $$->targetList = $6;
4358 $$->selectStmt = NULL;
4360 | '(' insert_column_list ')' SelectStmt
4362 $$ = makeNode(InsertStmt);
4364 $$->targetList = NIL;
4365 $$->selectStmt = $4;
4370 insert_column_item { $$ = makeList1($1); }
4371 | insert_column_list ',' insert_column_item
4372 { $$ = lappend($1, $3); }
4376 ColId opt_indirection
4378 ResTarget *n = makeNode(ResTarget);
4380 n->indirection = $2;
4387 /*****************************************************************************
4392 *****************************************************************************/
4394 DeleteStmt: DELETE_P FROM relation_expr where_clause
4396 DeleteStmt *n = makeNode(DeleteStmt);
4398 n->whereClause = $4;
4403 LockStmt: LOCK_P opt_table qualified_name_list opt_lock opt_nowait
4405 LockStmt *n = makeNode(LockStmt);
4414 opt_lock: IN_P lock_type MODE { $$ = $2; }
4415 | /*EMPTY*/ { $$ = AccessExclusiveLock; }
4418 lock_type: ACCESS SHARE { $$ = AccessShareLock; }
4419 | ROW SHARE { $$ = RowShareLock; }
4420 | ROW EXCLUSIVE { $$ = RowExclusiveLock; }
4421 | SHARE UPDATE EXCLUSIVE { $$ = ShareUpdateExclusiveLock; }
4422 | SHARE { $$ = ShareLock; }
4423 | SHARE ROW EXCLUSIVE { $$ = ShareRowExclusiveLock; }
4424 | EXCLUSIVE { $$ = ExclusiveLock; }
4425 | ACCESS EXCLUSIVE { $$ = AccessExclusiveLock; }
4428 opt_nowait: NOWAIT { $$ = TRUE; }
4429 | /*EMPTY*/ { $$ = FALSE; }
4433 /*****************************************************************************
4436 * UpdateStmt (UPDATE)
4438 *****************************************************************************/
4440 UpdateStmt: UPDATE relation_expr
4441 SET update_target_list
4445 UpdateStmt *n = makeNode(UpdateStmt);
4449 n->whereClause = $6;
4455 /*****************************************************************************
4460 *****************************************************************************/
4461 DeclareCursorStmt: DECLARE name cursor_options CURSOR opt_hold FOR SelectStmt
4463 DeclareCursorStmt *n = makeNode(DeclareCursorStmt);
4468 n->options |= CURSOR_OPT_HOLD;
4473 cursor_options: /*EMPTY*/ { $$ = 0; }
4474 | cursor_options NO SCROLL { $$ = $1 | CURSOR_OPT_NO_SCROLL; }
4475 | cursor_options SCROLL { $$ = $1 | CURSOR_OPT_SCROLL; }
4476 | cursor_options BINARY { $$ = $1 | CURSOR_OPT_BINARY; }
4477 | cursor_options INSENSITIVE { $$ = $1 | CURSOR_OPT_INSENSITIVE; }
4480 opt_hold: /* EMPTY */ { $$ = FALSE; }
4481 | WITH HOLD { $$ = TRUE; }
4482 | WITHOUT HOLD { $$ = FALSE; }
4485 /*****************************************************************************
4490 *****************************************************************************/
4492 /* A complete SELECT statement looks like this.
4494 * The rule returns either a single SelectStmt node or a tree of them,
4495 * representing a set-operation tree.
4497 * There is an ambiguity when a sub-SELECT is within an a_expr and there
4498 * are excess parentheses: do the parentheses belong to the sub-SELECT or
4499 * to the surrounding a_expr? We don't really care, but yacc wants to know.
4500 * To resolve the ambiguity, we are careful to define the grammar so that
4501 * the decision is staved off as long as possible: as long as we can keep
4502 * absorbing parentheses into the sub-SELECT, we will do so, and only when
4503 * it's no longer possible to do that will we decide that parens belong to
4504 * the expression. For example, in "SELECT (((SELECT 2)) + 3)" the extra
4505 * parentheses are treated as part of the sub-select. The necessity of doing
4506 * it that way is shown by "SELECT (((SELECT 2)) UNION SELECT 2)". Had we
4507 * parsed "((SELECT 2))" as an a_expr, it'd be too late to go back to the
4508 * SELECT viewpoint when we see the UNION.
4510 * This approach is implemented by defining a nonterminal select_with_parens,
4511 * which represents a SELECT with at least one outer layer of parentheses,
4512 * and being careful to use select_with_parens, never '(' SelectStmt ')',
4513 * in the expression grammar. We will then have shift-reduce conflicts
4514 * which we can resolve in favor of always treating '(' <select> ')' as
4515 * a select_with_parens. To resolve the conflicts, the productions that
4516 * conflict with the select_with_parens productions are manually given
4517 * precedences lower than the precedence of ')', thereby ensuring that we
4518 * shift ')' (and then reduce to select_with_parens) rather than trying to
4519 * reduce the inner <select> nonterminal to something else. We use UMINUS
4520 * precedence for this, which is a fairly arbitrary choice.
4522 * To be able to define select_with_parens itself without ambiguity, we need
4523 * a nonterminal select_no_parens that represents a SELECT structure with no
4524 * outermost parentheses. This is a little bit tedious, but it works.
4526 * In non-expression contexts, we use SelectStmt which can represent a SELECT
4527 * with or without outer parentheses.
4530 SelectStmt: select_no_parens %prec UMINUS
4531 | select_with_parens %prec UMINUS
4535 '(' select_no_parens ')' { $$ = $2; }
4536 | '(' select_with_parens ')' { $$ = $2; }
4540 * FOR UPDATE may be before or after LIMIT/OFFSET.
4541 * In <=7.2.X, LIMIT/OFFSET had to be after FOR UPDATE
4542 * We now support both orderings, but prefer LIMIT/OFFSET before FOR UPDATE
4546 simple_select { $$ = $1; }
4547 | select_clause sort_clause
4549 insertSelectOptions((SelectStmt *) $1, $2, NIL,
4553 | select_clause opt_sort_clause for_update_clause opt_select_limit
4555 insertSelectOptions((SelectStmt *) $1, $2, $3,
4556 nth(0, $4), nth(1, $4));
4559 | select_clause opt_sort_clause select_limit opt_for_update_clause
4561 insertSelectOptions((SelectStmt *) $1, $2, $4,
4562 nth(0, $3), nth(1, $3));
4568 simple_select { $$ = $1; }
4569 | select_with_parens { $$ = $1; }
4573 * This rule parses SELECT statements that can appear within set operations,
4574 * including UNION, INTERSECT and EXCEPT. '(' and ')' can be used to specify
4575 * the ordering of the set operations. Without '(' and ')' we want the
4576 * operations to be ordered per the precedence specs at the head of this file.
4578 * As with select_no_parens, simple_select cannot have outer parentheses,
4579 * but can have parenthesized subclauses.
4581 * Note that sort clauses cannot be included at this level --- SQL92 requires
4582 * SELECT foo UNION SELECT bar ORDER BY baz
4584 * (SELECT foo UNION SELECT bar) ORDER BY baz
4586 * SELECT foo UNION (SELECT bar ORDER BY baz)
4587 * Likewise FOR UPDATE and LIMIT. Therefore, those clauses are described
4588 * as part of the select_no_parens production, not simple_select.
4589 * This does not limit functionality, because you can reintroduce sort and
4590 * limit clauses inside parentheses.
4592 * NOTE: only the leftmost component SelectStmt should have INTO.
4593 * However, this is not checked by the grammar; parse analysis must check it.
4596 SELECT opt_distinct target_list
4597 into_clause from_clause where_clause
4598 group_clause having_clause
4600 SelectStmt *n = makeNode(SelectStmt);
4601 n->distinctClause = $2;
4604 n->intoColNames = NIL;
4605 n->intoHasOids = DEFAULT_OIDS;
4607 n->whereClause = $6;
4608 n->groupClause = $7;
4609 n->havingClause = $8;
4612 | select_clause UNION opt_all select_clause
4614 $$ = makeSetOp(SETOP_UNION, $3, $1, $4);
4616 | select_clause INTERSECT opt_all select_clause
4618 $$ = makeSetOp(SETOP_INTERSECT, $3, $1, $4);
4620 | select_clause EXCEPT opt_all select_clause
4622 $$ = makeSetOp(SETOP_EXCEPT, $3, $1, $4);
4627 INTO OptTempTableName { $$ = $2; }
4628 | /*EMPTY*/ { $$ = NULL; }
4632 * Redundancy here is needed to avoid shift/reduce conflicts,
4633 * since TEMP is not a reserved word. See also OptTemp.
4636 TEMPORARY opt_table qualified_name
4641 | TEMP opt_table qualified_name
4646 | LOCAL TEMPORARY opt_table qualified_name
4651 | LOCAL TEMP opt_table qualified_name
4656 | GLOBAL TEMPORARY opt_table qualified_name
4661 | GLOBAL TEMP opt_table qualified_name
4666 | TABLE qualified_name
4682 opt_all: ALL { $$ = TRUE; }
4683 | DISTINCT { $$ = FALSE; }
4684 | /*EMPTY*/ { $$ = FALSE; }
4687 /* We use (NIL) as a placeholder to indicate that all target expressions
4688 * should be placed in the DISTINCT list during parsetree analysis.
4691 DISTINCT { $$ = makeList1(NIL); }
4692 | DISTINCT ON '(' expr_list ')' { $$ = $4; }
4694 | /*EMPTY*/ { $$ = NIL; }
4698 sort_clause { $$ = $1;}
4699 | /*EMPTY*/ { $$ = NIL; }
4703 ORDER BY sortby_list { $$ = $3; }
4707 sortby { $$ = makeList1($1); }
4708 | sortby_list ',' sortby { $$ = lappend($1, $3); }
4711 sortby: a_expr USING qual_all_Op
4713 $$ = makeNode(SortBy);
4715 $$->sortby_kind = SORTBY_USING;
4720 $$ = makeNode(SortBy);
4722 $$->sortby_kind = SORTBY_ASC;
4727 $$ = makeNode(SortBy);
4729 $$->sortby_kind = SORTBY_DESC;
4734 $$ = makeNode(SortBy);
4736 $$->sortby_kind = SORTBY_ASC; /* default */
4743 LIMIT select_limit_value OFFSET select_offset_value
4744 { $$ = makeList2($4, $2); }
4745 | OFFSET select_offset_value LIMIT select_limit_value
4746 { $$ = makeList2($2, $4); }
4747 | LIMIT select_limit_value
4748 { $$ = makeList2(NULL, $2); }
4749 | OFFSET select_offset_value
4750 { $$ = makeList2($2, NULL); }
4751 | LIMIT select_limit_value ',' select_offset_value
4753 /* Disabled because it was too confusing, bjm 2002-02-18 */
4755 (errcode(ERRCODE_SYNTAX_ERROR),
4756 errmsg("LIMIT #,# syntax is not supported"),
4757 errhint("Use separate LIMIT and OFFSET clauses.")));
4762 select_limit { $$ = $1; }
4764 { $$ = makeList2(NULL,NULL); }
4771 /* LIMIT ALL is represented as a NULL constant */
4772 A_Const *n = makeNode(A_Const);
4773 n->val.type = T_Null;
4778 select_offset_value:
4783 * jimmy bell-style recursive queries aren't supported in the
4786 * ...however, recursive addattr and rename supported. make special
4791 GROUP_P BY expr_list { $$ = $3; }
4792 | /*EMPTY*/ { $$ = NIL; }
4796 HAVING a_expr { $$ = $2; }
4797 | /*EMPTY*/ { $$ = NULL; }
4801 FOR UPDATE update_list { $$ = $3; }
4802 | FOR READ ONLY { $$ = NULL; }
4805 opt_for_update_clause:
4806 for_update_clause { $$ = $1; }
4807 | /* EMPTY */ { $$ = NULL; }
4811 OF name_list { $$ = $2; }
4812 | /* EMPTY */ { $$ = makeList1(NULL); }
4815 /*****************************************************************************
4817 * clauses common to all Optimizable Stmts:
4818 * from_clause - allow list of both JOIN expressions and table names
4819 * where_clause - qualifications for joins or restrictions
4821 *****************************************************************************/
4824 FROM from_list { $$ = $2; }
4825 | /*EMPTY*/ { $$ = NIL; }
4829 table_ref { $$ = makeList1($1); }
4830 | from_list ',' table_ref { $$ = lappend($1, $3); }
4834 * table_ref is where an alias clause can be attached. Note we cannot make
4835 * alias_clause have an empty production because that causes parse conflicts
4836 * between table_ref := '(' joined_table ')' alias_clause
4837 * and joined_table := '(' joined_table ')'. So, we must have the
4838 * redundant-looking productions here instead.
4840 table_ref: relation_expr
4844 | relation_expr alias_clause
4851 RangeFunction *n = makeNode(RangeFunction);
4852 n->funccallnode = $1;
4853 n->coldeflist = NIL;
4856 | func_table alias_clause
4858 RangeFunction *n = makeNode(RangeFunction);
4859 n->funccallnode = $1;
4861 n->coldeflist = NIL;
4864 | func_table AS '(' TableFuncElementList ')'
4866 RangeFunction *n = makeNode(RangeFunction);
4867 n->funccallnode = $1;
4871 | func_table AS ColId '(' TableFuncElementList ')'
4873 RangeFunction *n = makeNode(RangeFunction);
4874 Alias *a = makeNode(Alias);
4875 n->funccallnode = $1;
4881 | func_table ColId '(' TableFuncElementList ')'
4883 RangeFunction *n = makeNode(RangeFunction);
4884 Alias *a = makeNode(Alias);
4885 n->funccallnode = $1;
4891 | select_with_parens
4894 * The SQL spec does not permit a subselect
4895 * (<derived_table>) without an alias clause,
4896 * so we don't either. This avoids the problem
4897 * of needing to invent a unique refname for it.
4898 * That could be surmounted if there's sufficient
4899 * popular demand, but for now let's just implement
4900 * the spec and see if anyone complains.
4901 * However, it does seem like a good idea to emit
4902 * an error message that's better than "syntax error".
4905 (errcode(ERRCODE_SYNTAX_ERROR),
4906 errmsg("subquery in FROM must have an alias"),
4907 errhint("For example, FROM (SELECT ...) [AS] foo.")));
4910 | select_with_parens alias_clause
4912 RangeSubselect *n = makeNode(RangeSubselect);
4921 | '(' joined_table ')' alias_clause
4930 * It may seem silly to separate joined_table from table_ref, but there is
4931 * method in SQL92's madness: if you don't do it this way you get reduce-
4932 * reduce conflicts, because it's not clear to the parser generator whether
4933 * to expect alias_clause after ')' or not. For the same reason we must
4934 * treat 'JOIN' and 'join_type JOIN' separately, rather than allowing
4935 * join_type to expand to empty; if we try it, the parser generator can't
4936 * figure out when to reduce an empty join_type right after table_ref.
4938 * Note that a CROSS JOIN is the same as an unqualified
4939 * INNER JOIN, and an INNER JOIN/ON has the same shape
4940 * but a qualification expression to limit membership.
4941 * A NATURAL JOIN implicitly matches column names between
4942 * tables and the shape is determined by which columns are
4943 * in common. We'll collect columns during the later transformations.
4947 '(' joined_table ')'
4951 | table_ref CROSS JOIN table_ref
4953 /* CROSS JOIN is same as unqualified inner join */
4954 JoinExpr *n = makeNode(JoinExpr);
4955 n->jointype = JOIN_INNER;
4956 n->isNatural = FALSE;
4963 | table_ref UNIONJOIN table_ref
4965 /* UNION JOIN is made into 1 token to avoid shift/reduce
4966 * conflict against regular UNION keyword.
4968 JoinExpr *n = makeNode(JoinExpr);
4969 n->jointype = JOIN_UNION;
4970 n->isNatural = FALSE;
4977 | table_ref join_type JOIN table_ref join_qual
4979 JoinExpr *n = makeNode(JoinExpr);
4981 n->isNatural = FALSE;
4984 if ($5 != NULL && IsA($5, List))
4985 n->using = (List *) $5; /* USING clause */
4987 n->quals = $5; /* ON clause */
4990 | table_ref JOIN table_ref join_qual
4992 /* letting join_type reduce to empty doesn't work */
4993 JoinExpr *n = makeNode(JoinExpr);
4994 n->jointype = JOIN_INNER;
4995 n->isNatural = FALSE;
4998 if ($4 != NULL && IsA($4, List))
4999 n->using = (List *) $4; /* USING clause */
5001 n->quals = $4; /* ON clause */
5004 | table_ref NATURAL join_type JOIN table_ref
5006 JoinExpr *n = makeNode(JoinExpr);
5008 n->isNatural = TRUE;
5011 n->using = NIL; /* figure out which columns later... */
5012 n->quals = NULL; /* fill later */
5015 | table_ref NATURAL JOIN table_ref
5017 /* letting join_type reduce to empty doesn't work */
5018 JoinExpr *n = makeNode(JoinExpr);
5019 n->jointype = JOIN_INNER;
5020 n->isNatural = TRUE;
5023 n->using = NIL; /* figure out which columns later... */
5024 n->quals = NULL; /* fill later */
5030 AS ColId '(' name_list ')'
5032 $$ = makeNode(Alias);
5038 $$ = makeNode(Alias);
5041 | ColId '(' name_list ')'
5043 $$ = makeNode(Alias);
5049 $$ = makeNode(Alias);
5054 join_type: FULL join_outer { $$ = JOIN_FULL; }
5055 | LEFT join_outer { $$ = JOIN_LEFT; }
5056 | RIGHT join_outer { $$ = JOIN_RIGHT; }
5057 | INNER_P { $$ = JOIN_INNER; }
5060 /* OUTER is just noise... */
5061 join_outer: OUTER_P { $$ = NULL; }
5062 | /*EMPTY*/ { $$ = NULL; }
5065 /* JOIN qualification clauses
5066 * Possibilities are:
5067 * USING ( column list ) allows only unqualified column names,
5068 * which must match between tables.
5069 * ON expr allows more general qualifications.
5071 * We return USING as a List node, while an ON-expr will not be a List.
5074 join_qual: USING '(' name_list ')' { $$ = (Node *) $3; }
5075 | ON a_expr { $$ = $2; }
5082 /* default inheritance */
5084 $$->inhOpt = INH_DEFAULT;
5087 | qualified_name '*'
5089 /* inheritance query */
5091 $$->inhOpt = INH_YES;
5094 | ONLY qualified_name
5096 /* no inheritance */
5098 $$->inhOpt = INH_NO;
5101 | ONLY '(' qualified_name ')'
5103 /* no inheritance, SQL99-style syntax */
5105 $$->inhOpt = INH_NO;
5111 func_table: func_name '(' ')'
5113 FuncCall *n = makeNode(FuncCall);
5116 n->agg_star = FALSE;
5117 n->agg_distinct = FALSE;
5120 | func_name '(' expr_list ')'
5122 FuncCall *n = makeNode(FuncCall);
5125 n->agg_star = FALSE;
5126 n->agg_distinct = FALSE;
5133 WHERE a_expr { $$ = $2; }
5134 | /*EMPTY*/ { $$ = NULL; }
5138 TableFuncElementList:
5143 | TableFuncElementList ',' TableFuncElement
5145 $$ = lappend($1, $3);
5149 TableFuncElement: ColId Typename
5151 ColumnDef *n = makeNode(ColumnDef);
5154 n->constraints = NIL;
5160 /*****************************************************************************
5163 * SQL92 introduces a large amount of type-specific syntax.
5164 * Define individual clauses to handle these cases, and use
5165 * the generic case to handle regular type-extensible Postgres syntax.
5166 * - thomas 1997-10-10
5168 *****************************************************************************/
5170 Typename: SimpleTypename opt_array_bounds
5173 $$->arrayBounds = $2;
5175 | SETOF SimpleTypename opt_array_bounds
5178 $$->arrayBounds = $3;
5181 | SimpleTypename ARRAY '[' Iconst ']'
5183 /* SQL99's redundant syntax */
5185 $$->arrayBounds = makeList1(makeInteger($4));
5187 | SETOF SimpleTypename ARRAY '[' Iconst ']'
5189 /* SQL99's redundant syntax */
5191 $$->arrayBounds = makeList1(makeInteger($5));
5197 opt_array_bounds '[' ']'
5198 { $$ = lappend($1, makeInteger(-1)); }
5199 | opt_array_bounds '[' Iconst ']'
5200 { $$ = lappend($1, makeInteger($3)); }
5206 * XXX ideally, the production for a qualified typename should be ColId attrs
5207 * (there's no obvious reason why the first name should need to be restricted)
5208 * and should be an alternative of GenericType (so that it can be used to
5209 * specify a type for a literal in AExprConst). However doing either causes
5210 * reduce/reduce conflicts that I haven't been able to find a workaround
5214 GenericType { $$ = $1; }
5215 | Numeric { $$ = $1; }
5217 | Character { $$ = $1; }
5218 | ConstDatetime { $$ = $1; }
5219 | ConstInterval opt_interval
5222 if ($2 != INTERVAL_FULL_RANGE)
5223 $$->typmod = INTERVAL_TYPMOD(INTERVAL_FULL_PRECISION, $2);
5225 | ConstInterval '(' Iconst ')' opt_interval
5230 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5231 errmsg("INTERVAL(%d) precision must not be negative",
5233 if ($3 > MAX_INTERVAL_PRECISION)
5236 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5237 errmsg("INTERVAL(%d) precision reduced to maximum allowed, %d",
5238 $3, MAX_INTERVAL_PRECISION)));
5239 $3 = MAX_INTERVAL_PRECISION;
5241 $$->typmod = INTERVAL_TYPMOD($3, $5);
5245 $$ = makeNode(TypeName);
5246 $$->names = lcons(makeString($1), $2);
5251 /* We have a separate ConstTypename to allow defaulting fixed-length
5252 * types such as CHAR() and BIT() to an unspecified length.
5253 * SQL9x requires that these default to a length of one, but this
5254 * makes no sense for constructs like CHAR 'hi' and BIT '0101',
5255 * where there is an obvious better choice to make.
5256 * Note that ConstInterval is not included here since it must
5257 * be pushed up higher in the rules to accomodate the postfix
5258 * options (e.g. INTERVAL '1' YEAR).
5261 GenericType { $$ = $1; }
5262 | Numeric { $$ = $1; }
5263 | ConstBit { $$ = $1; }
5264 | ConstCharacter { $$ = $1; }
5265 | ConstDatetime { $$ = $1; }
5271 $$ = makeTypeName($1);
5275 /* SQL92 numeric data types
5276 * Check FLOAT() precision limits assuming IEEE floating types.
5277 * - thomas 1997-09-18
5278 * Provide real DECIMAL() and NUMERIC() implementations now - Jan 1998-12-30
5282 $$ = SystemTypeName("int4");
5286 $$ = SystemTypeName("int4");
5290 $$ = SystemTypeName("int2");
5294 $$ = SystemTypeName("int8");
5298 $$ = SystemTypeName("float4");
5304 | DOUBLE_P PRECISION
5306 $$ = SystemTypeName("float8");
5308 | DECIMAL_P opt_decimal
5310 $$ = SystemTypeName("numeric");
5315 $$ = SystemTypeName("numeric");
5318 | NUMERIC opt_numeric
5320 $$ = SystemTypeName("numeric");
5325 $$ = SystemTypeName("bool");
5329 opt_float: '(' Iconst ')'
5333 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5334 errmsg("precision for type float must be at least 1 bit")));
5336 $$ = SystemTypeName("float4");
5338 $$ = SystemTypeName("float8");
5341 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5342 errmsg("precision for type float must be less than 54 bits")));
5346 $$ = SystemTypeName("float8");
5351 '(' Iconst ',' Iconst ')'
5353 if ($2 < 1 || $2 > NUMERIC_MAX_PRECISION)
5355 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5356 errmsg("NUMERIC precision %d must be between 1 and %d",
5357 $2, NUMERIC_MAX_PRECISION)));
5358 if ($4 < 0 || $4 > $2)
5360 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5361 errmsg("NUMERIC scale %d must be between 0 and precision %d",
5364 $$ = (($2 << 16) | $4) + VARHDRSZ;
5368 if ($2 < 1 || $2 > NUMERIC_MAX_PRECISION)
5370 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5371 errmsg("NUMERIC precision %d must be between 1 and %d",
5372 $2, NUMERIC_MAX_PRECISION)));
5374 $$ = ($2 << 16) + VARHDRSZ;
5378 /* Insert "-1" meaning "no limit" */
5384 '(' Iconst ',' Iconst ')'
5386 if ($2 < 1 || $2 > NUMERIC_MAX_PRECISION)
5388 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5389 errmsg("DECIMAL precision %d must be between 1 and %d",
5390 $2, NUMERIC_MAX_PRECISION)));
5391 if ($4 < 0 || $4 > $2)
5393 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5394 errmsg("DECIMAL scale %d must be between 0 and precision %d",
5397 $$ = (($2 << 16) | $4) + VARHDRSZ;
5401 if ($2 < 1 || $2 > NUMERIC_MAX_PRECISION)
5403 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5404 errmsg("DECIMAL precision %d must be between 1 and %d",
5405 $2, NUMERIC_MAX_PRECISION)));
5407 $$ = ($2 << 16) + VARHDRSZ;
5411 /* Insert "-1" meaning "no limit" */
5418 * SQL92 bit-field data types
5419 * The following implements BIT() and BIT VARYING().
5431 /* ConstBit is like Bit except "BIT" defaults to unspecified length */
5432 /* See notes for ConstCharacter, which addresses same issue for "CHAR" */
5433 ConstBit: BitWithLength
5445 BIT opt_varying '(' Iconst ')'
5449 typname = $2 ? "varbit" : "bit";
5450 $$ = SystemTypeName(typname);
5453 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5454 errmsg("length for type %s must be at least 1",
5456 else if ($4 > (MaxAttrSize * BITS_PER_BYTE))
5458 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5459 errmsg("length for type %s cannot exceed %d",
5460 typname, MaxAttrSize * BITS_PER_BYTE)));
5468 /* bit defaults to bit(1), varbit to no limit */
5471 $$ = SystemTypeName("varbit");
5476 $$ = SystemTypeName("bit");
5484 * SQL92 character data types
5485 * The following implements CHAR() and VARCHAR().
5487 Character: CharacterWithLength
5491 | CharacterWithoutLength
5497 ConstCharacter: CharacterWithLength
5501 | CharacterWithoutLength
5503 /* Length was not specified so allow to be unrestricted.
5504 * This handles problems with fixed-length (bpchar) strings
5505 * which in column definitions must default to a length
5506 * of one, but should not be constrained if the length
5507 * was not specified.
5514 CharacterWithLength: character '(' Iconst ')' opt_charset
5516 if (($5 != NULL) && (strcmp($5, "sql_text") != 0))
5520 type = palloc(strlen($1) + 1 + strlen($5) + 1);
5527 $$ = SystemTypeName($1);
5531 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5532 errmsg("length for type %s must be at least 1",
5534 else if ($3 > MaxAttrSize)
5536 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5537 errmsg("length for type %s cannot exceed %d",
5540 /* we actually implement these like a varlen, so
5541 * the first 4 bytes is the length. (the difference
5542 * between these and "text" is that we blank-pad and
5543 * truncate where necessary)
5545 $$->typmod = VARHDRSZ + $3;
5549 CharacterWithoutLength: character opt_charset
5551 if (($2 != NULL) && (strcmp($2, "sql_text") != 0))
5555 type = palloc(strlen($1) + 1 + strlen($2) + 1);
5562 $$ = SystemTypeName($1);
5564 /* char defaults to char(1), varchar to no limit */
5565 if (strcmp($1, "bpchar") == 0)
5566 $$->typmod = VARHDRSZ + 1;
5572 character: CHARACTER opt_varying
5573 { $$ = $2 ? "varchar": "bpchar"; }
5574 | CHAR_P opt_varying
5575 { $$ = $2 ? "varchar": "bpchar"; }
5578 | NATIONAL CHARACTER opt_varying
5579 { $$ = $3 ? "varchar": "bpchar"; }
5580 | NATIONAL CHAR_P opt_varying
5581 { $$ = $3 ? "varchar": "bpchar"; }
5583 { $$ = $2 ? "varchar": "bpchar"; }
5587 VARYING { $$ = TRUE; }
5588 | /*EMPTY*/ { $$ = FALSE; }
5592 CHARACTER SET ColId { $$ = $3; }
5593 | /*EMPTY*/ { $$ = NULL; }
5597 TIMESTAMP '(' Iconst ')' opt_timezone
5600 $$ = SystemTypeName("timestamptz");
5602 $$ = SystemTypeName("timestamp");
5603 /* XXX the timezone field seems to be unused
5604 * - thomas 2001-09-06
5609 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5610 errmsg("TIMESTAMP(%d)%s precision must not be negative",
5611 $3, ($5 ? " WITH TIME ZONE": ""))));
5612 if ($3 > MAX_TIMESTAMP_PRECISION)
5615 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5616 errmsg("TIMESTAMP(%d)%s precision reduced to maximum allowed, %d",
5617 $3, ($5 ? " WITH TIME ZONE": ""),
5618 MAX_TIMESTAMP_PRECISION)));
5619 $3 = MAX_TIMESTAMP_PRECISION;
5623 | TIMESTAMP opt_timezone
5626 $$ = SystemTypeName("timestamptz");
5628 $$ = SystemTypeName("timestamp");
5629 /* XXX the timezone field seems to be unused
5630 * - thomas 2001-09-06
5633 /* SQL99 specified a default precision of six
5634 * for schema definitions. But for timestamp
5635 * literals we don't want to throw away precision
5636 * so leave this as unspecified for now.
5637 * Later, we may want a different production
5638 * for schemas. - thomas 2001-12-07
5642 | TIME '(' Iconst ')' opt_timezone
5645 $$ = SystemTypeName("timetz");
5647 $$ = SystemTypeName("time");
5650 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5651 errmsg("TIME(%d)%s precision must not be negative",
5652 $3, ($5 ? " WITH TIME ZONE": ""))));
5653 if ($3 > MAX_TIME_PRECISION)
5656 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5657 errmsg("TIME(%d)%s precision reduced to maximum allowed, %d",
5658 $3, ($5 ? " WITH TIME ZONE": ""),
5659 MAX_TIME_PRECISION)));
5660 $3 = MAX_TIME_PRECISION;
5667 $$ = SystemTypeName("timetz");
5669 $$ = SystemTypeName("time");
5670 /* SQL99 specified a default precision of zero.
5671 * See comments for timestamp above on why we will
5672 * leave this unspecified for now. - thomas 2001-12-07
5679 INTERVAL { $$ = SystemTypeName("interval"); }
5683 WITH TIME ZONE { $$ = TRUE; }
5684 | WITHOUT TIME ZONE { $$ = FALSE; }
5685 | /*EMPTY*/ { $$ = FALSE; }
5689 YEAR_P { $$ = INTERVAL_MASK(YEAR); }
5690 | MONTH_P { $$ = INTERVAL_MASK(MONTH); }
5691 | DAY_P { $$ = INTERVAL_MASK(DAY); }
5692 | HOUR_P { $$ = INTERVAL_MASK(HOUR); }
5693 | MINUTE_P { $$ = INTERVAL_MASK(MINUTE); }
5694 | SECOND_P { $$ = INTERVAL_MASK(SECOND); }
5696 { $$ = INTERVAL_MASK(YEAR) | INTERVAL_MASK(MONTH); }
5698 { $$ = INTERVAL_MASK(DAY) | INTERVAL_MASK(HOUR); }
5700 { $$ = INTERVAL_MASK(DAY) | INTERVAL_MASK(HOUR)
5701 | INTERVAL_MASK(MINUTE); }
5703 { $$ = INTERVAL_MASK(DAY) | INTERVAL_MASK(HOUR)
5704 | INTERVAL_MASK(MINUTE) | INTERVAL_MASK(SECOND); }
5705 | HOUR_P TO MINUTE_P
5706 { $$ = INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE); }
5707 | HOUR_P TO SECOND_P
5708 { $$ = INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE)
5709 | INTERVAL_MASK(SECOND); }
5710 | MINUTE_P TO SECOND_P
5711 { $$ = INTERVAL_MASK(MINUTE) | INTERVAL_MASK(SECOND); }
5712 | /*EMPTY*/ { $$ = INTERVAL_FULL_RANGE; }
5716 /*****************************************************************************
5718 * expression grammar
5720 *****************************************************************************/
5723 * General expressions
5724 * This is the heart of the expression syntax.
5726 * We have two expression types: a_expr is the unrestricted kind, and
5727 * b_expr is a subset that must be used in some places to avoid shift/reduce
5728 * conflicts. For example, we can't do BETWEEN as "BETWEEN a_expr AND a_expr"
5729 * because that use of AND conflicts with AND as a boolean operator. So,
5730 * b_expr is used in BETWEEN and we remove boolean keywords from b_expr.
5732 * Note that '(' a_expr ')' is a b_expr, so an unrestricted expression can
5733 * always be used by surrounding it with parens.
5735 * c_expr is all the productions that are common to a_expr and b_expr;
5736 * it's factored out just to eliminate redundant coding.
5738 a_expr: c_expr { $$ = $1; }
5739 | a_expr TYPECAST Typename
5740 { $$ = makeTypeCast($1, $3); }
5741 | a_expr AT TIME ZONE c_expr
5743 FuncCall *n = makeNode(FuncCall);
5744 n->funcname = SystemFuncName("timezone");
5745 n->args = makeList2($5, $1);
5746 n->agg_star = FALSE;
5747 n->agg_distinct = FALSE;
5751 * These operators must be called out explicitly in order to make use
5752 * of yacc/bison's automatic operator-precedence handling. All other
5753 * operator names are handled by the generic productions using "Op",
5754 * below; and all those operators will have the same precedence.
5756 * If you add more explicitly-known operators, be sure to add them
5757 * also to b_expr and to the MathOp list above.
5759 | '+' a_expr %prec UMINUS
5760 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "+", NULL, $2); }
5761 | '-' a_expr %prec UMINUS
5762 { $$ = doNegate($2); }
5764 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "%", NULL, $2); }
5766 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "^", NULL, $2); }
5768 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "%", $1, NULL); }
5770 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "^", $1, NULL); }
5772 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "+", $1, $3); }
5774 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "-", $1, $3); }
5776 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "*", $1, $3); }
5778 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "/", $1, $3); }
5780 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "%", $1, $3); }
5782 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "^", $1, $3); }
5784 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "<", $1, $3); }
5786 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, ">", $1, $3); }
5788 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "=", $1, $3); }
5790 | a_expr qual_Op a_expr %prec Op
5791 { $$ = (Node *) makeA_Expr(AEXPR_OP, $2, $1, $3); }
5792 | qual_Op a_expr %prec Op
5793 { $$ = (Node *) makeA_Expr(AEXPR_OP, $1, NULL, $2); }
5794 | a_expr qual_Op %prec POSTFIXOP
5795 { $$ = (Node *) makeA_Expr(AEXPR_OP, $2, $1, NULL); }
5798 { $$ = (Node *) makeA_Expr(AEXPR_AND, NIL, $1, $3); }
5800 { $$ = (Node *) makeA_Expr(AEXPR_OR, NIL, $1, $3); }
5802 { $$ = (Node *) makeA_Expr(AEXPR_NOT, NIL, NULL, $2); }
5804 | a_expr LIKE a_expr
5805 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "~~", $1, $3); }
5806 | a_expr LIKE a_expr ESCAPE a_expr
5808 FuncCall *n = makeNode(FuncCall);
5809 n->funcname = SystemFuncName("like_escape");
5810 n->args = makeList2($3, $5);
5811 n->agg_star = FALSE;
5812 n->agg_distinct = FALSE;
5813 $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "~~", $1, (Node *) n);
5815 | a_expr NOT LIKE a_expr
5816 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "!~~", $1, $4); }
5817 | a_expr NOT LIKE a_expr ESCAPE a_expr
5819 FuncCall *n = makeNode(FuncCall);
5820 n->funcname = SystemFuncName("like_escape");
5821 n->args = makeList2($4, $6);
5822 n->agg_star = FALSE;
5823 n->agg_distinct = FALSE;
5824 $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "!~~", $1, (Node *) n);
5826 | a_expr ILIKE a_expr
5827 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "~~*", $1, $3); }
5828 | a_expr ILIKE a_expr ESCAPE a_expr
5830 FuncCall *n = makeNode(FuncCall);
5831 n->funcname = SystemFuncName("like_escape");
5832 n->args = makeList2($3, $5);
5833 n->agg_star = FALSE;
5834 n->agg_distinct = FALSE;
5835 $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "~~*", $1, (Node *) n);
5837 | a_expr NOT ILIKE a_expr
5838 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "!~~*", $1, $4); }
5839 | a_expr NOT ILIKE a_expr ESCAPE a_expr
5841 FuncCall *n = makeNode(FuncCall);
5842 n->funcname = SystemFuncName("like_escape");
5843 n->args = makeList2($4, $6);
5844 n->agg_star = FALSE;
5845 n->agg_distinct = FALSE;
5846 $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "!~~*", $1, (Node *) n);
5849 | a_expr SIMILAR TO a_expr %prec SIMILAR
5851 A_Const *c = makeNode(A_Const);
5852 FuncCall *n = makeNode(FuncCall);
5853 c->val.type = T_Null;
5854 n->funcname = SystemFuncName("similar_escape");
5855 n->args = makeList2($4, (Node *) c);
5856 n->agg_star = FALSE;
5857 n->agg_distinct = FALSE;
5858 $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "~", $1, (Node *) n);
5860 | a_expr SIMILAR TO a_expr ESCAPE a_expr
5862 FuncCall *n = makeNode(FuncCall);
5863 n->funcname = SystemFuncName("similar_escape");
5864 n->args = makeList2($4, $6);
5865 n->agg_star = FALSE;
5866 n->agg_distinct = FALSE;
5867 $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "~", $1, (Node *) n);
5869 | a_expr NOT SIMILAR TO a_expr %prec SIMILAR
5871 A_Const *c = makeNode(A_Const);
5872 FuncCall *n = makeNode(FuncCall);
5873 c->val.type = T_Null;
5874 n->funcname = SystemFuncName("similar_escape");
5875 n->args = makeList2($5, (Node *) c);
5876 n->agg_star = FALSE;
5877 n->agg_distinct = FALSE;
5878 $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "!~", $1, (Node *) n);
5880 | a_expr NOT SIMILAR TO a_expr ESCAPE a_expr
5882 FuncCall *n = makeNode(FuncCall);
5883 n->funcname = SystemFuncName("similar_escape");
5884 n->args = makeList2($5, $7);
5885 n->agg_star = FALSE;
5886 n->agg_distinct = FALSE;
5887 $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "!~", $1, (Node *) n);
5891 * Define SQL92-style Null test clause.
5892 * Allow two forms described in the standard:
5895 * Allow two SQL extensions
5901 if (IsA($1, RowExpr))
5902 $$ = makeRowNullTest(IS_NULL, (RowExpr *) $1);
5905 NullTest *n = makeNode(NullTest);
5906 n->arg = (Expr *) $1;
5907 n->nulltesttype = IS_NULL;
5913 if (IsA($1, RowExpr))
5914 $$ = makeRowNullTest(IS_NULL, (RowExpr *) $1);
5917 NullTest *n = makeNode(NullTest);
5918 n->arg = (Expr *) $1;
5919 n->nulltesttype = IS_NULL;
5925 if (IsA($1, RowExpr))
5926 $$ = makeRowNullTest(IS_NOT_NULL, (RowExpr *) $1);
5929 NullTest *n = makeNode(NullTest);
5930 n->arg = (Expr *) $1;
5931 n->nulltesttype = IS_NOT_NULL;
5935 | a_expr IS NOT NULL_P
5937 if (IsA($1, RowExpr))
5938 $$ = makeRowNullTest(IS_NOT_NULL, (RowExpr *) $1);
5941 NullTest *n = makeNode(NullTest);
5942 n->arg = (Expr *) $1;
5943 n->nulltesttype = IS_NOT_NULL;
5949 $$ = (Node *)makeOverlaps($1, $3);
5953 BooleanTest *b = makeNode(BooleanTest);
5954 b->arg = (Expr *) $1;
5955 b->booltesttype = IS_TRUE;
5958 | a_expr IS NOT TRUE_P
5960 BooleanTest *b = makeNode(BooleanTest);
5961 b->arg = (Expr *) $1;
5962 b->booltesttype = IS_NOT_TRUE;
5967 BooleanTest *b = makeNode(BooleanTest);
5968 b->arg = (Expr *) $1;
5969 b->booltesttype = IS_FALSE;
5972 | a_expr IS NOT FALSE_P
5974 BooleanTest *b = makeNode(BooleanTest);
5975 b->arg = (Expr *) $1;
5976 b->booltesttype = IS_NOT_FALSE;
5981 BooleanTest *b = makeNode(BooleanTest);
5982 b->arg = (Expr *) $1;
5983 b->booltesttype = IS_UNKNOWN;
5986 | a_expr IS NOT UNKNOWN
5988 BooleanTest *b = makeNode(BooleanTest);
5989 b->arg = (Expr *) $1;
5990 b->booltesttype = IS_NOT_UNKNOWN;
5993 | a_expr IS DISTINCT FROM a_expr %prec IS
5995 $$ = (Node *) makeSimpleA_Expr(AEXPR_DISTINCT, "=", $1, $5);
5997 | a_expr IS OF '(' type_list ')' %prec IS
5999 $$ = (Node *) makeSimpleA_Expr(AEXPR_OF, "=", $1, (Node *) $5);
6001 | a_expr IS NOT OF '(' type_list ')' %prec IS
6003 $$ = (Node *) makeSimpleA_Expr(AEXPR_OF, "!=", $1, (Node *) $6);
6005 | a_expr BETWEEN b_expr AND b_expr %prec BETWEEN
6007 $$ = (Node *) makeA_Expr(AEXPR_AND, NIL,
6008 (Node *) makeSimpleA_Expr(AEXPR_OP, ">=", $1, $3),
6009 (Node *) makeSimpleA_Expr(AEXPR_OP, "<=", $1, $5));
6011 | a_expr NOT BETWEEN b_expr AND b_expr %prec BETWEEN
6013 $$ = (Node *) makeA_Expr(AEXPR_OR, NIL,
6014 (Node *) makeSimpleA_Expr(AEXPR_OP, "<", $1, $4),
6015 (Node *) makeSimpleA_Expr(AEXPR_OP, ">", $1, $6));
6017 | a_expr IN_P in_expr
6019 /* in_expr returns a SubLink or a list of a_exprs */
6020 if (IsA($3, SubLink))
6022 SubLink *n = (SubLink *)$3;
6023 n->subLinkType = ANY_SUBLINK;
6024 if (IsA($1, RowExpr))
6025 n->lefthand = ((RowExpr *) $1)->args;
6027 n->lefthand = makeList1($1);
6028 n->operName = makeList1(makeString("="));
6035 foreach(l, (List *) $3)
6038 cmp = (Node *) makeSimpleA_Expr(AEXPR_OP, "=", $1, lfirst(l));
6042 n = (Node *) makeA_Expr(AEXPR_OR, NIL, n, cmp);
6047 | a_expr NOT IN_P in_expr
6049 /* in_expr returns a SubLink or a list of a_exprs */
6050 if (IsA($4, SubLink))
6052 /* Make an IN node */
6053 SubLink *n = (SubLink *)$4;
6054 n->subLinkType = ANY_SUBLINK;
6055 if (IsA($1, RowExpr))
6056 n->lefthand = ((RowExpr *) $1)->args;
6058 n->lefthand = makeList1($1);
6059 n->operName = makeList1(makeString("="));
6060 /* Stick a NOT on top */
6061 $$ = (Node *) makeA_Expr(AEXPR_NOT, NIL, NULL, (Node *) n);
6067 foreach(l, (List *) $4)
6070 cmp = (Node *) makeSimpleA_Expr(AEXPR_OP, "<>", $1, lfirst(l));
6074 n = (Node *) makeA_Expr(AEXPR_AND, NIL, n, cmp);
6079 | a_expr subquery_Op sub_type select_with_parens %prec Op
6081 SubLink *n = makeNode(SubLink);
6082 n->subLinkType = $3;
6083 if (IsA($1, RowExpr))
6084 n->lefthand = ((RowExpr *) $1)->args;
6086 n->lefthand = makeList1($1);
6091 | a_expr subquery_Op sub_type '(' a_expr ')' %prec Op
6093 if ($3 == ANY_SUBLINK)
6094 $$ = (Node *) makeA_Expr(AEXPR_OP_ANY, $2, $1, $5);
6096 $$ = (Node *) makeA_Expr(AEXPR_OP_ALL, $2, $1, $5);
6098 | UNIQUE select_with_parens %prec Op
6100 /* Not sure how to get rid of the parentheses
6101 * but there are lots of shift/reduce errors without them.
6103 * Should be able to implement this by plopping the entire
6104 * select into a node, then transforming the target expressions
6105 * from whatever they are into count(*), and testing the
6106 * entire result equal to one.
6107 * But, will probably implement a separate node in the executor.
6110 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
6111 errmsg("UNIQUE predicate is not yet implemented")));
6116 * Restricted expressions
6118 * b_expr is a subset of the complete expression syntax defined by a_expr.
6120 * Presently, AND, NOT, IS, and IN are the a_expr keywords that would
6121 * cause trouble in the places where b_expr is used. For simplicity, we
6122 * just eliminate all the boolean-keyword-operator productions from b_expr.
6126 | b_expr TYPECAST Typename
6127 { $$ = makeTypeCast($1, $3); }
6128 | '+' b_expr %prec UMINUS
6129 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "+", NULL, $2); }
6130 | '-' b_expr %prec UMINUS
6131 { $$ = doNegate($2); }
6133 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "%", NULL, $2); }
6135 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "^", NULL, $2); }
6137 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "%", $1, NULL); }
6139 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "^", $1, NULL); }
6141 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "+", $1, $3); }
6143 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "-", $1, $3); }
6145 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "*", $1, $3); }
6147 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "/", $1, $3); }
6149 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "%", $1, $3); }
6151 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "^", $1, $3); }
6153 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "<", $1, $3); }
6155 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, ">", $1, $3); }
6157 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "=", $1, $3); }
6158 | b_expr qual_Op b_expr %prec Op
6159 { $$ = (Node *) makeA_Expr(AEXPR_OP, $2, $1, $3); }
6160 | qual_Op b_expr %prec Op
6161 { $$ = (Node *) makeA_Expr(AEXPR_OP, $1, NULL, $2); }
6162 | b_expr qual_Op %prec POSTFIXOP
6163 { $$ = (Node *) makeA_Expr(AEXPR_OP, $2, $1, NULL); }
6164 | b_expr IS DISTINCT FROM b_expr %prec IS
6166 $$ = (Node *) makeSimpleA_Expr(AEXPR_DISTINCT, "=", $1, $5);
6168 | b_expr IS OF '(' type_list ')' %prec IS
6170 $$ = (Node *) makeSimpleA_Expr(AEXPR_OF, "=", $1, (Node *) $5);
6172 | b_expr IS NOT OF '(' type_list ')' %prec IS
6174 $$ = (Node *) makeSimpleA_Expr(AEXPR_OF, "!=", $1, (Node *) $6);
6179 * Productions that can be used in both a_expr and b_expr.
6181 * Note: productions that refer recursively to a_expr or b_expr mostly
6182 * cannot appear here. However, it's OK to refer to a_exprs that occur
6183 * inside parentheses, such as function arguments; that cannot introduce
6184 * ambiguity to the b_expr syntax.
6186 c_expr: columnref { $$ = (Node *) $1; }
6187 | AexprConst { $$ = $1; }
6188 | PARAM attrs opt_indirection
6191 * PARAM without field names is considered a constant,
6192 * but with 'em, it is not. Not very consistent ...
6194 ParamRef *n = makeNode(ParamRef);
6197 n->indirection = $3;
6200 | '(' a_expr ')' attrs opt_indirection
6202 ExprFieldSelect *n = makeNode(ExprFieldSelect);
6205 n->indirection = $5;
6208 | '(' a_expr ')' opt_indirection
6212 ExprFieldSelect *n = makeNode(ExprFieldSelect);
6215 n->indirection = $4;
6225 FuncCall *n = makeNode(FuncCall);
6228 n->agg_star = FALSE;
6229 n->agg_distinct = FALSE;
6232 | func_name '(' expr_list ')'
6234 FuncCall *n = makeNode(FuncCall);
6237 n->agg_star = FALSE;
6238 n->agg_distinct = FALSE;
6241 | func_name '(' ALL expr_list ')'
6243 FuncCall *n = makeNode(FuncCall);
6246 n->agg_star = FALSE;
6247 n->agg_distinct = FALSE;
6248 /* Ideally we'd mark the FuncCall node to indicate
6249 * "must be an aggregate", but there's no provision
6250 * for that in FuncCall at the moment.
6254 | func_name '(' DISTINCT expr_list ')'
6256 FuncCall *n = makeNode(FuncCall);
6259 n->agg_star = FALSE;
6260 n->agg_distinct = TRUE;
6263 | func_name '(' '*' ')'
6266 * For now, we transform AGGREGATE(*) into AGGREGATE(1).
6268 * This does the right thing for COUNT(*) (in fact,
6269 * any certainly-non-null expression would do for COUNT),
6270 * and there are no other aggregates in SQL92 that accept
6273 * The FuncCall node is also marked agg_star = true,
6274 * so that later processing can detect what the argument
6277 FuncCall *n = makeNode(FuncCall);
6278 A_Const *star = makeNode(A_Const);
6280 star->val.type = T_Integer;
6281 star->val.val.ival = 1;
6283 n->args = makeList1(star);
6285 n->agg_distinct = FALSE;
6291 * Translate as "'now'::text::date".
6293 * We cannot use "'now'::date" because coerce_type() will
6294 * immediately reduce that to a constant representing
6295 * today's date. We need to delay the conversion until
6296 * runtime, else the wrong things will happen when
6297 * CURRENT_DATE is used in a column default value or rule.
6299 * This could be simplified if we had a way to generate
6300 * an expression tree representing runtime application
6301 * of type-input conversion functions...
6303 A_Const *s = makeNode(A_Const);
6306 s->val.type = T_String;
6307 s->val.val.str = "now";
6308 s->typename = SystemTypeName("text");
6310 d = SystemTypeName("date");
6312 $$ = (Node *)makeTypeCast((Node *)s, d);
6317 * Translate as "'now'::text::timetz".
6318 * See comments for CURRENT_DATE.
6320 A_Const *s = makeNode(A_Const);
6323 s->val.type = T_String;
6324 s->val.val.str = "now";
6325 s->typename = SystemTypeName("text");
6327 d = SystemTypeName("timetz");
6328 /* SQL99 mandates a default precision of zero for TIME
6329 * fields in schemas. However, for CURRENT_TIME
6330 * let's preserve the microsecond precision we
6331 * might see from the system clock. - thomas 2001-12-07
6335 $$ = (Node *)makeTypeCast((Node *)s, d);
6337 | CURRENT_TIME '(' Iconst ')'
6340 * Translate as "'now'::text::timetz(n)".
6341 * See comments for CURRENT_DATE.
6343 A_Const *s = makeNode(A_Const);
6346 s->val.type = T_String;
6347 s->val.val.str = "now";
6348 s->typename = SystemTypeName("text");
6349 d = SystemTypeName("timetz");
6352 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
6353 errmsg("CURRENT_TIME(%d) precision must not be negative",
6355 if ($3 > MAX_TIME_PRECISION)
6358 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
6359 errmsg("CURRENT_TIME(%d) precision reduced to maximum allowed, %d",
6360 $3, MAX_TIME_PRECISION)));
6361 $3 = MAX_TIME_PRECISION;
6365 $$ = (Node *)makeTypeCast((Node *)s, d);
6370 * Translate as "'now'::text::timestamptz".
6371 * See comments for CURRENT_DATE.
6373 A_Const *s = makeNode(A_Const);
6376 s->val.type = T_String;
6377 s->val.val.str = "now";
6378 s->typename = SystemTypeName("text");
6380 d = SystemTypeName("timestamptz");
6381 /* SQL99 mandates a default precision of 6 for timestamp.
6382 * Also, that is about as precise as we will get since
6383 * we are using a microsecond time interface.
6384 * - thomas 2001-12-07
6388 $$ = (Node *)makeTypeCast((Node *)s, d);
6390 | CURRENT_TIMESTAMP '(' Iconst ')'
6393 * Translate as "'now'::text::timestamptz(n)".
6394 * See comments for CURRENT_DATE.
6396 A_Const *s = makeNode(A_Const);
6399 s->val.type = T_String;
6400 s->val.val.str = "now";
6401 s->typename = SystemTypeName("text");
6403 d = SystemTypeName("timestamptz");
6406 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
6407 errmsg("CURRENT_TIMESTAMP(%d) precision must not be negative",
6409 if ($3 > MAX_TIMESTAMP_PRECISION)
6412 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
6413 errmsg("CURRENT_TIMESTAMP(%d) precision reduced to maximum allowed, %d",
6414 $3, MAX_TIMESTAMP_PRECISION)));
6415 $3 = MAX_TIMESTAMP_PRECISION;
6419 $$ = (Node *)makeTypeCast((Node *)s, d);
6424 * Translate as "'now'::text::time".
6425 * See comments for CURRENT_DATE.
6427 A_Const *s = makeNode(A_Const);
6430 s->val.type = T_String;
6431 s->val.val.str = "now";
6432 s->typename = SystemTypeName("text");
6434 d = SystemTypeName("time");
6435 /* SQL99 mandates a default precision of zero for TIME
6436 * fields in schemas. However, for LOCALTIME
6437 * let's preserve the microsecond precision we
6438 * might see from the system clock. - thomas 2001-12-07
6442 $$ = (Node *)makeTypeCast((Node *)s, d);
6444 | LOCALTIME '(' Iconst ')'
6447 * Translate as "'now'::text::time(n)".
6448 * See comments for CURRENT_DATE.
6450 A_Const *s = makeNode(A_Const);
6453 s->val.type = T_String;
6454 s->val.val.str = "now";
6455 s->typename = SystemTypeName("text");
6456 d = SystemTypeName("time");
6459 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
6460 errmsg("LOCALTIME(%d) precision must not be negative",
6462 if ($3 > MAX_TIME_PRECISION)
6465 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
6466 errmsg("LOCALTIME(%d) precision reduced to maximum allowed, %d",
6467 $3, MAX_TIME_PRECISION)));
6468 $3 = MAX_TIME_PRECISION;
6472 $$ = (Node *)makeTypeCast((Node *)s, d);
6477 * Translate as "'now'::text::timestamp".
6478 * See comments for CURRENT_DATE.
6480 A_Const *s = makeNode(A_Const);
6483 s->val.type = T_String;
6484 s->val.val.str = "now";
6485 s->typename = SystemTypeName("text");
6487 d = SystemTypeName("timestamp");
6488 /* SQL99 mandates a default precision of 6 for timestamp.
6489 * Also, that is about as precise as we will get since
6490 * we are using a microsecond time interface.
6491 * - thomas 2001-12-07
6495 $$ = (Node *)makeTypeCast((Node *)s, d);
6497 | LOCALTIMESTAMP '(' Iconst ')'
6500 * Translate as "'now'::text::timestamp(n)".
6501 * See comments for CURRENT_DATE.
6503 A_Const *s = makeNode(A_Const);
6506 s->val.type = T_String;
6507 s->val.val.str = "now";
6508 s->typename = SystemTypeName("text");
6510 d = SystemTypeName("timestamp");
6513 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
6514 errmsg("LOCALTIMESTAMP(%d) precision must not be negative",
6516 if ($3 > MAX_TIMESTAMP_PRECISION)
6519 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
6520 errmsg("LOCALTIMESTAMP(%d) precision reduced to maximum allowed, %d",
6521 $3, MAX_TIMESTAMP_PRECISION)));
6522 $3 = MAX_TIMESTAMP_PRECISION;
6526 $$ = (Node *)makeTypeCast((Node *)s, d);
6530 FuncCall *n = makeNode(FuncCall);
6531 n->funcname = SystemFuncName("current_user");
6533 n->agg_star = FALSE;
6534 n->agg_distinct = FALSE;
6539 FuncCall *n = makeNode(FuncCall);
6540 n->funcname = SystemFuncName("session_user");
6542 n->agg_star = FALSE;
6543 n->agg_distinct = FALSE;
6548 FuncCall *n = makeNode(FuncCall);
6549 n->funcname = SystemFuncName("current_user");
6551 n->agg_star = FALSE;
6552 n->agg_distinct = FALSE;
6555 | CAST '(' a_expr AS Typename ')'
6556 { $$ = makeTypeCast($3, $5); }
6557 | EXTRACT '(' extract_list ')'
6559 FuncCall *n = makeNode(FuncCall);
6560 n->funcname = SystemFuncName("date_part");
6562 n->agg_star = FALSE;
6563 n->agg_distinct = FALSE;
6566 | OVERLAY '(' overlay_list ')'
6568 /* overlay(A PLACING B FROM C FOR D) is converted to
6569 * substring(A, 1, C-1) || B || substring(A, C+1, C+D)
6570 * overlay(A PLACING B FROM C) is converted to
6571 * substring(A, 1, C-1) || B || substring(A, C+1, C+char_length(B))
6573 FuncCall *n = makeNode(FuncCall);
6574 n->funcname = SystemFuncName("overlay");
6576 n->agg_star = FALSE;
6577 n->agg_distinct = FALSE;
6580 | POSITION '(' position_list ')'
6582 /* position(A in B) is converted to position(B, A) */
6583 FuncCall *n = makeNode(FuncCall);
6584 n->funcname = SystemFuncName("position");
6586 n->agg_star = FALSE;
6587 n->agg_distinct = FALSE;
6590 | SUBSTRING '(' substr_list ')'
6592 /* substring(A from B for C) is converted to
6593 * substring(A, B, C) - thomas 2000-11-28
6595 FuncCall *n = makeNode(FuncCall);
6596 n->funcname = SystemFuncName("substring");
6598 n->agg_star = FALSE;
6599 n->agg_distinct = FALSE;
6602 | TREAT '(' a_expr AS Typename ')'
6604 /* TREAT(expr AS target) converts expr of a particular type to target,
6605 * which is defined to be a subtype of the original expression.
6606 * In SQL99, this is intended for use with structured UDTs,
6607 * but let's make this a generally useful form allowing stronger
6608 * coersions than are handled by implicit casting.
6610 FuncCall *n = makeNode(FuncCall);
6611 /* Convert SystemTypeName() to SystemFuncName() even though
6612 * at the moment they result in the same thing.
6614 n->funcname = SystemFuncName(((Value *)llast($5->names))->val.str);
6615 n->args = makeList1($3);
6618 | TRIM '(' BOTH trim_list ')'
6620 /* various trim expressions are defined in SQL92
6621 * - thomas 1997-07-19
6623 FuncCall *n = makeNode(FuncCall);
6624 n->funcname = SystemFuncName("btrim");
6626 n->agg_star = FALSE;
6627 n->agg_distinct = FALSE;
6630 | TRIM '(' LEADING trim_list ')'
6632 FuncCall *n = makeNode(FuncCall);
6633 n->funcname = SystemFuncName("ltrim");
6635 n->agg_star = FALSE;
6636 n->agg_distinct = FALSE;
6639 | TRIM '(' TRAILING trim_list ')'
6641 FuncCall *n = makeNode(FuncCall);
6642 n->funcname = SystemFuncName("rtrim");
6644 n->agg_star = FALSE;
6645 n->agg_distinct = FALSE;
6648 | TRIM '(' trim_list ')'
6650 FuncCall *n = makeNode(FuncCall);
6651 n->funcname = SystemFuncName("btrim");
6653 n->agg_star = FALSE;
6654 n->agg_distinct = FALSE;
6657 | CONVERT '(' a_expr USING any_name ')'
6659 FuncCall *n = makeNode(FuncCall);
6660 A_Const *c = makeNode(A_Const);
6662 c->val.type = T_String;
6663 c->val.val.str = NameListToQuotedString($5);
6665 n->funcname = SystemFuncName("convert_using");
6666 n->args = makeList2($3, c);
6667 n->agg_star = FALSE;
6668 n->agg_distinct = FALSE;
6671 | CONVERT '(' expr_list ')'
6673 FuncCall *n = makeNode(FuncCall);
6674 n->funcname = SystemFuncName("convert");
6676 n->agg_star = FALSE;
6677 n->agg_distinct = FALSE;
6680 | select_with_parens %prec UMINUS
6682 SubLink *n = makeNode(SubLink);
6683 n->subLinkType = EXPR_SUBLINK;
6689 | EXISTS select_with_parens
6691 SubLink *n = makeNode(SubLink);
6692 n->subLinkType = EXISTS_SUBLINK;
6698 | ARRAY select_with_parens
6700 SubLink *n = makeNode(SubLink);
6701 n->subLinkType = ARRAY_SUBLINK;
6711 RowExpr *r = makeNode(RowExpr);
6713 r->row_typeid = InvalidOid; /* not analyzed yet */
6719 * Supporting nonterminals for expressions.
6722 /* Explicit row production.
6724 * SQL99 allows an optional ROW keyword, so we can now do single-element rows
6725 * without conflicting with the parenthesized a_expr production. Without the
6726 * ROW keyword, there must be more than one a_expr inside the parens.
6728 row: ROW '(' expr_list ')' { $$ = $3; }
6729 | ROW '(' ')' { $$ = NIL; }
6730 | '(' expr_list ',' a_expr ')' { $$ = lappend($2, $4); }
6733 sub_type: ANY { $$ = ANY_SUBLINK; }
6734 | SOME { $$ = ANY_SUBLINK; }
6735 | ALL { $$ = ALL_SUBLINK; }
6738 all_Op: Op { $$ = $1; }
6739 | MathOp { $$ = $1; }
6742 MathOp: '+' { $$ = "+"; }
6754 { $$ = makeList1(makeString($1)); }
6755 | OPERATOR '(' any_operator ')'
6761 { $$ = makeList1(makeString($1)); }
6762 | OPERATOR '(' any_operator ')'
6768 { $$ = makeList1(makeString($1)); }
6769 | OPERATOR '(' any_operator ')'
6772 { $$ = makeList1(makeString("~~")); }
6774 { $$ = makeList1(makeString("!~~")); }
6776 { $$ = makeList1(makeString("~~*")); }
6778 { $$ = makeList1(makeString("!~~*")); }
6779 /* cannot put SIMILAR TO here, because SIMILAR TO is a hack.
6780 * the regular expression is preprocessed by a function (similar_escape),
6781 * and the ~ operator for posix regular expressions is used.
6782 * x SIMILAR TO y -> x ~ similar_escape(y)
6783 * this transformation is made on the fly by the parser upwards.
6784 * however the SubLink structure which handles any/some/all stuff
6785 * is not ready for such a thing.
6790 opt_indirection '[' a_expr ']'
6792 A_Indices *ai = makeNode(A_Indices);
6795 $$ = lappend($1, ai);
6797 | opt_indirection '[' a_expr ':' a_expr ']'
6799 A_Indices *ai = makeNode(A_Indices);
6802 $$ = lappend($1, ai);
6810 FastList *dst = (FastList *) &$$;
6811 makeFastList1(dst, $1);
6813 | expr_list ',' a_expr
6815 FastList *dst = (FastList *) &$$;
6816 FastList *src = (FastList *) &$1;
6818 FastAppend(dst, $3);
6823 extract_arg FROM a_expr
6825 A_Const *n = makeNode(A_Const);
6826 n->val.type = T_String;
6827 n->val.val.str = $1;
6828 $$ = makeList2((Node *) n, $3);
6830 | /*EMPTY*/ { $$ = NIL; }
6833 type_list: type_list ',' Typename
6835 $$ = lappend($1, $3);
6843 array_expr_list: array_expr
6844 { $$ = makeList1($1); }
6845 | array_expr_list ',' array_expr
6846 { $$ = lappend($1, $3); }
6849 array_expr: '[' expr_list ']'
6851 ArrayExpr *n = makeNode(ArrayExpr);
6855 | '[' array_expr_list ']'
6857 ArrayExpr *n = makeNode(ArrayExpr);
6863 /* Allow delimited string SCONST in extract_arg as an SQL extension.
6864 * - thomas 2001-04-12
6869 | YEAR_P { $$ = "year"; }
6870 | MONTH_P { $$ = "month"; }
6871 | DAY_P { $$ = "day"; }
6872 | HOUR_P { $$ = "hour"; }
6873 | MINUTE_P { $$ = "minute"; }
6874 | SECOND_P { $$ = "second"; }
6875 | SCONST { $$ = $1; }
6878 /* OVERLAY() arguments
6879 * SQL99 defines the OVERLAY() function:
6880 * o overlay(text placing text from int for int)
6881 * o overlay(text placing text from int)
6884 a_expr overlay_placing substr_from substr_for
6886 $$ = makeList4($1, $2, $3, $4);
6888 | a_expr overlay_placing substr_from
6890 $$ = makeList3($1, $2, $3);
6899 /* position_list uses b_expr not a_expr to avoid conflict with general IN */
6902 b_expr IN_P b_expr { $$ = makeList2($3, $1); }
6903 | /*EMPTY*/ { $$ = NIL; }
6906 /* SUBSTRING() arguments
6907 * SQL9x defines a specific syntax for arguments to SUBSTRING():
6908 * o substring(text from int for int)
6909 * o substring(text from int) get entire string from starting point "int"
6910 * o substring(text from pattern) get entire string matching pattern
6911 * o substring(text for int) get first "int" characters of string
6912 * We also want to implement generic substring functions which accept
6913 * the usual generic list of arguments. So we will accept both styles
6914 * here, and convert the SQL9x style to the generic list for further
6915 * processing. - thomas 2000-11-28
6918 a_expr substr_from substr_for
6920 $$ = makeList3($1, $2, $3);
6922 | a_expr substr_for substr_from
6924 $$ = makeList3($1, $3, $2);
6926 | a_expr substr_from
6928 $$ = makeList2($1, $2);
6932 A_Const *n = makeNode(A_Const);
6933 n->val.type = T_Integer;
6934 n->val.val.ival = 1;
6935 $$ = makeList3($1, (Node *)n, $2);
6946 FROM a_expr { $$ = $2; }
6949 substr_for: FOR a_expr { $$ = $2; }
6952 trim_list: a_expr FROM expr_list { $$ = lappend($3, $1); }
6953 | FROM expr_list { $$ = $2; }
6954 | expr_list { $$ = $1; }
6957 in_expr: select_with_parens
6959 SubLink *n = makeNode(SubLink);
6961 /* other fields will be filled later */
6964 | '(' expr_list ')' { $$ = (Node *)$2; }
6968 * Define SQL92-style case clause.
6969 * Allow all four forms described in the standard:
6970 * - Full specification
6971 * CASE WHEN a = b THEN c ... ELSE d END
6972 * - Implicit argument
6973 * CASE a WHEN b THEN c ... ELSE d END
6974 * - Conditional NULL
6976 * same as CASE WHEN x = y THEN NULL ELSE x END
6977 * - Conditional substitution from list, use first non-null argument
6979 * same as CASE WHEN a IS NOT NULL THEN a WHEN b IS NOT NULL THEN b ... END
6980 * - thomas 1998-11-09
6982 * NULLIF and COALESCE have become first class nodes to
6983 * prevent double evaluation of arguments.
6984 * - Kris Jurka 2003-02-11
6986 case_expr: CASE case_arg when_clause_list case_default END_P
6988 CaseExpr *c = makeNode(CaseExpr);
6989 c->casetype = InvalidOid; /* not analyzed yet */
6990 c->arg = (Expr *) $2;
6992 c->defresult = (Expr *) $4;
6995 | NULLIF '(' a_expr ',' a_expr ')'
6997 $$ = (Node *) makeSimpleA_Expr(AEXPR_NULLIF, "=", $3, $5);
6999 | COALESCE '(' expr_list ')'
7001 CoalesceExpr *c = makeNode(CoalesceExpr);
7008 /* There must be at least one */
7009 when_clause { $$ = makeList1($1); }
7010 | when_clause_list when_clause { $$ = lappend($1, $2); }
7014 WHEN a_expr THEN a_expr
7016 CaseWhen *w = makeNode(CaseWhen);
7017 w->expr = (Expr *) $2;
7018 w->result = (Expr *) $4;
7024 ELSE a_expr { $$ = $2; }
7025 | /*EMPTY*/ { $$ = NULL; }
7028 case_arg: a_expr { $$ = $1; }
7029 | /*EMPTY*/ { $$ = NULL; }
7033 * columnref starts with relation_name not ColId, so that OLD and NEW
7034 * references can be accepted. Note that when there are more than two
7035 * dotted names, the first name is not actually a relation name...
7037 columnref: relation_name opt_indirection
7039 $$ = makeNode(ColumnRef);
7040 $$->fields = makeList1(makeString($1));
7041 $$->indirection = $2;
7043 | dotted_name opt_indirection
7045 $$ = makeNode(ColumnRef);
7047 $$->indirection = $2;
7053 { $$ = lcons(makeString($1), $2); }
7056 attrs: '.' attr_name
7057 { $$ = makeList1(makeString($2)); }
7059 { $$ = makeList1(makeString("*")); }
7060 | '.' attr_name attrs
7061 { $$ = lcons(makeString($2), $3); }
7065 /*****************************************************************************
7069 *****************************************************************************/
7071 /* Target lists as found in SELECT ... and INSERT VALUES ( ... ) */
7074 target_el { $$ = makeList1($1); }
7075 | target_list ',' target_el { $$ = lappend($1, $3); }
7078 /* AS is not optional because shift/red conflict with unary ops */
7079 target_el: a_expr AS ColLabel
7081 $$ = makeNode(ResTarget);
7083 $$->indirection = NIL;
7084 $$->val = (Node *)$1;
7088 $$ = makeNode(ResTarget);
7090 $$->indirection = NIL;
7091 $$->val = (Node *)$1;
7095 ColumnRef *n = makeNode(ColumnRef);
7096 n->fields = makeList1(makeString("*"));
7097 n->indirection = NIL;
7098 $$ = makeNode(ResTarget);
7100 $$->indirection = NIL;
7101 $$->val = (Node *)n;
7105 /* Target list as found in UPDATE table SET ...
7106 | '(' row_ ')' = '(' row_ ')'
7112 update_target_el { $$ = makeList1($1); }
7113 | update_target_list ',' update_target_el { $$ = lappend($1,$3); }
7117 ColId opt_indirection '=' a_expr
7119 $$ = makeNode(ResTarget);
7121 $$->indirection = $2;
7122 $$->val = (Node *) $4;
7124 | ColId opt_indirection '=' DEFAULT
7126 $$ = makeNode(ResTarget);
7128 $$->indirection = $2;
7129 $$->val = (Node *) makeNode(SetToDefault);
7135 insert_target_el { $$ = makeList1($1); }
7136 | insert_target_list ',' insert_target_el { $$ = lappend($1, $3); }
7140 target_el { $$ = $1; }
7143 $$ = makeNode(ResTarget);
7145 $$->indirection = NIL;
7146 $$->val = (Node *) makeNode(SetToDefault);
7151 /*****************************************************************************
7153 * Names and constants
7155 *****************************************************************************/
7158 SpecialRuleRelation { $$ = $1; }
7159 | ColId { $$ = $1; }
7162 qualified_name_list:
7163 qualified_name { $$ = makeList1($1); }
7164 | qualified_name_list ',' qualified_name { $$ = lappend($1, $3); }
7170 $$ = makeNode(RangeVar);
7171 $$->catalogname = NULL;
7172 $$->schemaname = NULL;
7177 $$ = makeNode(RangeVar);
7181 $$->catalogname = NULL;
7182 $$->schemaname = strVal(linitial($1));
7183 $$->relname = strVal(lsecond($1));
7186 $$->catalogname = strVal(linitial($1));
7187 $$->schemaname = strVal(lsecond($1));
7188 $$->relname = strVal(lthird($1));
7192 (errcode(ERRCODE_SYNTAX_ERROR),
7193 errmsg("improper qualified name (too many dotted names): %s",
7194 NameListToString($1))));
7201 { $$ = makeList1(makeString($1)); }
7202 | name_list ',' name
7203 { $$ = lappend($1, makeString($3)); }
7207 name: ColId { $$ = $1; };
7215 attr_name: ColId { $$ = $1; };
7217 index_name: ColId { $$ = $1; };
7219 file_name: Sconst { $$ = $1; };
7221 func_name: function_name
7222 { $$ = makeList1(makeString($1)); }
7223 | dotted_name { $$ = $1; }
7232 A_Const *n = makeNode(A_Const);
7233 n->val.type = T_Integer;
7234 n->val.val.ival = $1;
7239 A_Const *n = makeNode(A_Const);
7240 n->val.type = T_Float;
7241 n->val.val.str = $1;
7246 A_Const *n = makeNode(A_Const);
7247 n->val.type = T_String;
7248 n->val.val.str = $1;
7253 A_Const *n = makeNode(A_Const);
7254 n->val.type = T_BitString;
7255 n->val.val.str = $1;
7260 /* This is a bit constant per SQL99:
7261 * Without Feature F511, "BIT data type",
7262 * a <general literal> shall not be a
7263 * <bit string literal> or a <hex string literal>.
7265 A_Const *n = makeNode(A_Const);
7266 n->val.type = T_BitString;
7267 n->val.val.str = $1;
7270 | ConstTypename Sconst
7272 A_Const *n = makeNode(A_Const);
7274 n->val.type = T_String;
7275 n->val.val.str = $2;
7278 | ConstInterval Sconst opt_interval
7280 A_Const *n = makeNode(A_Const);
7282 n->val.type = T_String;
7283 n->val.val.str = $2;
7284 /* precision is not specified, but fields may be... */
7285 if ($3 != INTERVAL_FULL_RANGE)
7286 n->typename->typmod = INTERVAL_TYPMOD(INTERVAL_FULL_PRECISION, $3);
7289 | ConstInterval '(' Iconst ')' Sconst opt_interval
7291 A_Const *n = makeNode(A_Const);
7293 n->val.type = T_String;
7294 n->val.val.str = $5;
7295 /* precision specified, and fields may be... */
7298 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
7299 errmsg("INTERVAL(%d) precision must not be negative",
7301 if ($3 > MAX_INTERVAL_PRECISION)
7304 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
7305 errmsg("INTERVAL(%d) precision reduced to maximum allowed, %d",
7306 $3, MAX_INTERVAL_PRECISION)));
7307 $3 = MAX_INTERVAL_PRECISION;
7309 n->typename->typmod = INTERVAL_TYPMOD($3, $6);
7312 | PARAM opt_indirection
7314 ParamRef *n = makeNode(ParamRef);
7317 n->indirection = $2;
7322 $$ = (Node *)makeBoolAConst(TRUE);
7326 $$ = (Node *)makeBoolAConst(FALSE);
7330 A_Const *n = makeNode(A_Const);
7331 n->val.type = T_Null;
7336 Iconst: ICONST { $$ = $1; };
7337 Sconst: SCONST { $$ = $1; };
7338 UserId: ColId { $$ = $1; };
7341 * Name classification hierarchy.
7343 * IDENT is the lexeme returned by the lexer for identifiers that match
7344 * no known keyword. In most cases, we can accept certain keywords as
7345 * names, not only IDENTs. We prefer to accept as many such keywords
7346 * as possible to minimize the impact of "reserved words" on programmers.
7347 * So, we divide names into several possible classes. The classification
7348 * is chosen in part to make keywords acceptable as names wherever possible.
7351 /* Column identifier --- names that can be column, table, etc names.
7353 ColId: IDENT { $$ = $1; }
7354 | unreserved_keyword { $$ = pstrdup($1); }
7355 | col_name_keyword { $$ = pstrdup($1); }
7358 /* Type identifier --- names that can be type names.
7360 type_name: IDENT { $$ = $1; }
7361 | unreserved_keyword { $$ = pstrdup($1); }
7364 /* Function identifier --- names that can be function names.
7368 | unreserved_keyword { $$ = pstrdup($1); }
7369 | func_name_keyword { $$ = pstrdup($1); }
7372 /* Column label --- allowed labels in "AS" clauses.
7373 * This presently includes *all* Postgres keywords.
7375 ColLabel: IDENT { $$ = $1; }
7376 | unreserved_keyword { $$ = pstrdup($1); }
7377 | col_name_keyword { $$ = pstrdup($1); }
7378 | func_name_keyword { $$ = pstrdup($1); }
7379 | reserved_keyword { $$ = pstrdup($1); }
7384 * Keyword classification lists. Generally, every keyword present in
7385 * the Postgres grammar should appear in exactly one of these lists.
7387 * Put a new keyword into the first list that it can go into without causing
7388 * shift or reduce conflicts. The earlier lists define "less reserved"
7389 * categories of keywords.
7392 /* "Unreserved" keywords --- available for use as any kind of name.
7583 /* Column identifier --- keywords that can be column, table, etc names.
7585 * Many of these keywords will in fact be recognized as type or function
7586 * names too; but they have special productions for the purpose, and so
7587 * can't be treated as "generic" type or function names.
7589 * The type names appearing here are not usable as function names
7590 * because they can be followed by '(' in typename productions, which
7591 * looks too much like a function call for an LR(1) parser.
7631 /* Function identifier --- keywords that can be function names.
7633 * Most of these are keywords that are used as operators in expressions;
7634 * in general such keywords can't be column names because they would be
7635 * ambiguous with variables, but they are unambiguous as function identifiers.
7637 * Do not include POSITION, SUBSTRING, etc here since they have explicit
7638 * productions in a_expr to support the goofy SQL9x argument syntax.
7639 * - thomas 2000-11-28
7664 /* Reserved keyword --- these keywords are usable only as a ColLabel.
7666 * Keywords appear here if they could not be distinguished from variable,
7667 * type, or function names in some contexts. Don't put things here unless
7745 SpecialRuleRelation:
7752 (errcode(ERRCODE_SYNTAX_ERROR),
7753 errmsg("OLD used in query that is not in a rule")));
7761 (errcode(ERRCODE_SYNTAX_ERROR),
7762 errmsg("NEW used in query that is not in a rule")));
7769 makeTypeCast(Node *arg, TypeName *typename)
7772 * Simply generate a TypeCast node.
7774 * Earlier we would determine whether an A_Const would
7775 * be acceptable, however Domains require coerce_type()
7776 * to process them -- applying constraints as required.
7778 TypeCast *n = makeNode(TypeCast);
7780 n->typename = typename;
7785 makeStringConst(char *str, TypeName *typename)
7787 A_Const *n = makeNode(A_Const);
7789 n->val.type = T_String;
7790 n->val.val.str = str;
7791 n->typename = typename;
7797 makeIntConst(int val)
7799 A_Const *n = makeNode(A_Const);
7800 n->val.type = T_Integer;
7801 n->val.val.ival = val;
7802 n->typename = SystemTypeName("int4");
7808 makeFloatConst(char *str)
7810 A_Const *n = makeNode(A_Const);
7812 n->val.type = T_Float;
7813 n->val.val.str = str;
7814 n->typename = SystemTypeName("float8");
7820 makeAConst(Value *v)
7827 n = makeFloatConst(v->val.str);
7831 n = makeIntConst(v->val.ival);
7836 n = makeStringConst(v->val.str, NULL);
7844 * Create a DefElem node and set contents.
7845 * Could be moved to nodes/makefuncs.c if this is useful elsewhere.
7848 makeDefElem(char *name, Node *arg)
7850 DefElem *f = makeNode(DefElem);
7857 * Create an A_Const node and initialize to a boolean constant.
7860 makeBoolAConst(bool state)
7862 A_Const *n = makeNode(A_Const);
7863 n->val.type = T_String;
7864 n->val.val.str = (state? "t": "f");
7865 n->typename = SystemTypeName("bool");
7869 /* makeRowNullTest()
7870 * Generate separate operator nodes for a single row descriptor test.
7872 * Eventually this should be eliminated in favor of making the NullTest
7873 * node type capable of handling it directly.
7876 makeRowNullTest(NullTestType test, RowExpr *row)
7878 Node *result = NULL;
7881 foreach(arg, row->args)
7885 n = makeNode(NullTest);
7886 n->arg = (Expr *) lfirst(arg);
7887 n->nulltesttype = test;
7890 result = (Node *) n;
7891 else if (test == IS_NOT_NULL)
7892 result = (Node *) makeA_Expr(AEXPR_OR, NIL, result, (Node *)n);
7894 result = (Node *) makeA_Expr(AEXPR_AND, NIL, result, (Node *)n);
7899 /* zero-length rows? Generate constant TRUE or FALSE */
7900 result = (Node *) makeBoolAConst(test == IS_NULL);
7907 * Create and populate a FuncCall node to support the OVERLAPS operator.
7910 makeOverlaps(List *largs, List *rargs)
7912 FuncCall *n = makeNode(FuncCall);
7913 n->funcname = SystemFuncName("overlaps");
7914 if (length(largs) == 1)
7915 largs = lappend(largs, largs);
7916 else if (length(largs) != 2)
7918 (errcode(ERRCODE_SYNTAX_ERROR),
7919 errmsg("wrong number of parameters on left side of OVERLAPS expression")));
7920 if (length(rargs) == 1)
7921 rargs = lappend(rargs, rargs);
7922 else if (length(rargs) != 2)
7924 (errcode(ERRCODE_SYNTAX_ERROR),
7925 errmsg("wrong number of parameters on right side of OVERLAPS expression")));
7926 n->args = nconc(largs, rargs);
7927 n->agg_star = FALSE;
7928 n->agg_distinct = FALSE;
7932 /* extractArgTypes()
7933 * Given a list of FunctionParameter nodes, extract a list of just the
7934 * argument types (TypeNames). Most of the productions using func_args
7935 * don't currently want the full FunctionParameter data, so we use this
7936 * rather than having two sets of productions.
7939 extractArgTypes(List *parameters)
7944 foreach(i, parameters)
7946 FunctionParameter *p = (FunctionParameter *) lfirst(i);
7948 result = lappend(result, p->argType);
7953 /* findLeftmostSelect()
7954 * Find the leftmost component SelectStmt in a set-operation parsetree.
7957 findLeftmostSelect(SelectStmt *node)
7959 while (node && node->op != SETOP_NONE)
7961 Assert(node && IsA(node, SelectStmt) && node->larg == NULL);
7965 /* insertSelectOptions()
7966 * Insert ORDER BY, etc into an already-constructed SelectStmt.
7968 * This routine is just to avoid duplicating code in SelectStmt productions.
7971 insertSelectOptions(SelectStmt *stmt,
7972 List *sortClause, List *forUpdate,
7973 Node *limitOffset, Node *limitCount)
7976 * Tests here are to reject constructs like
7977 * (SELECT foo ORDER BY bar) ORDER BY baz
7981 if (stmt->sortClause)
7983 (errcode(ERRCODE_SYNTAX_ERROR),
7984 errmsg("multiple ORDER BY clauses not allowed")));
7985 stmt->sortClause = sortClause;
7989 if (stmt->forUpdate)
7991 (errcode(ERRCODE_SYNTAX_ERROR),
7992 errmsg("multiple FOR UPDATE clauses not allowed")));
7993 stmt->forUpdate = forUpdate;
7997 if (stmt->limitOffset)
7999 (errcode(ERRCODE_SYNTAX_ERROR),
8000 errmsg("multiple OFFSET clauses not allowed")));
8001 stmt->limitOffset = limitOffset;
8005 if (stmt->limitCount)
8007 (errcode(ERRCODE_SYNTAX_ERROR),
8008 errmsg("multiple LIMIT clauses not allowed")));
8009 stmt->limitCount = limitCount;
8014 makeSetOp(SetOperation op, bool all, Node *larg, Node *rarg)
8016 SelectStmt *n = makeNode(SelectStmt);
8020 n->larg = (SelectStmt *) larg;
8021 n->rarg = (SelectStmt *) rarg;
8026 * Build a properly-qualified reference to a built-in function.
8029 SystemFuncName(char *name)
8031 return makeList2(makeString("pg_catalog"), makeString(name));
8035 * Build a properly-qualified reference to a built-in type.
8037 * typmod is defaulted, but may be changed afterwards by caller.
8040 SystemTypeName(char *name)
8042 TypeName *n = makeNode(TypeName);
8044 n->names = makeList2(makeString("pg_catalog"), makeString(name));
8050 * Initialize to parse one query string
8055 QueryIsRule = FALSE;
8058 /* exprIsNullConstant()
8059 * Test whether an a_expr is a plain NULL constant or not.
8062 exprIsNullConstant(Node *arg)
8064 if (arg && IsA(arg, A_Const))
8066 A_Const *con = (A_Const *) arg;
8068 if (con->val.type == T_Null &&
8069 con->typename == NULL)
8076 * Handle negation of a numeric constant.
8078 * Formerly, we did this here because the optimizer couldn't cope with
8079 * indexquals that looked like "var = -4" --- it wants "var = const"
8080 * and a unary minus operator applied to a constant didn't qualify.
8081 * As of Postgres 7.0, that problem doesn't exist anymore because there
8082 * is a constant-subexpression simplifier in the optimizer. However,
8083 * there's still a good reason for doing this here, which is that we can
8084 * postpone committing to a particular internal representation for simple
8085 * negative constants. It's better to leave "-123.456" in string form
8086 * until we know what the desired type is.
8091 if (IsA(n, A_Const))
8093 A_Const *con = (A_Const *)n;
8095 if (con->val.type == T_Integer)
8097 con->val.val.ival = -con->val.val.ival;
8100 if (con->val.type == T_Float)
8102 doNegateFloat(&con->val);
8107 return (Node *) makeSimpleA_Expr(AEXPR_OP, "-", NULL, n);
8111 doNegateFloat(Value *v)
8113 char *oldval = v->val.str;
8115 Assert(IsA(v, Float));
8119 v->val.str = oldval+1; /* just strip the '-' */
8122 char *newval = (char *) palloc(strlen(oldval) + 2);
8125 strcpy(newval+1, oldval);
8126 v->val.str = newval;