1 /* $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/Attic/preproc.y,v 1.208 2003/02/14 13:17:13 meskes Exp $ */
3 /* Copyright comment */
5 #include "postgres_fe.h"
10 * Variables containing simple states.
13 int braces_open; /* brace level counter */
15 char *connection = NULL;
16 char *input_filename = NULL;
18 static int QueryIsRule = 0, FoundInto = 0;
19 static int initializer = 0;
20 static struct this_type actual_type[STRUCT_DEPTH];
21 static char *actual_storage[STRUCT_DEPTH];
22 static char *actual_startline[STRUCT_DEPTH];
24 /* temporarily store struct members while creating the data structure */
25 struct ECPGstruct_member *struct_member_list[STRUCT_DEPTH] = { NULL };
27 /* also store struct type so we can do a sizeof() later */
28 static char *ECPGstruct_sizeof = NULL;
30 struct ECPGtype ecpg_no_indicator = {ECPGt_NO_INDICATOR, 0L, NULL, {NULL}};
31 struct variable no_indicator = {"no_indicator", &ecpg_no_indicator, 0, NULL};
33 struct ECPGtype ecpg_query = {ECPGt_char_variable, 0L, NULL, {NULL}};
36 * Handle parsing errors and warnings
39 mmerror(int error_code, enum errortype type, char * error)
44 fprintf(stderr, "%s:%d: WARNING: %s\n", input_filename, yylineno, error);
47 fprintf(stderr, "%s:%d: ERROR: %s\n", input_filename, yylineno, error);
48 ret_value = error_code;
51 fprintf(stderr, "%s:%d: ERROR: %s\n", input_filename, yylineno, error);
57 * string concatenation
61 cat2_str(char *str1, char *str2)
63 char * res_str = (char *)mm_alloc(strlen(str1) + strlen(str2) + 2);
65 strcpy(res_str, str1);
67 strcat(res_str, str2);
74 cat_str(int count, ...)
80 va_start(args, count);
82 res_str = va_arg(args, char *);
84 /* now add all other strings */
85 for (i = 1; i < count; i++)
86 res_str = cat2_str(res_str, va_arg(args, char *));
94 make_str(const char *str)
96 char * res_str = (char *)mm_alloc(strlen(str) + 1);
103 make2_str(char *str1, char *str2)
105 char * res_str = (char *)mm_alloc(strlen(str1) + strlen(str2) + 1);
107 strcpy(res_str, str1);
108 strcat(res_str, str2);
115 make3_str(char *str1, char *str2, char *str3)
117 char * res_str = (char *)mm_alloc(strlen(str1) + strlen(str2) +strlen(str3) + 1);
119 strcpy(res_str, str1);
120 strcat(res_str, str2);
121 strcat(res_str, str3);
131 char * name = (char *)mm_alloc(yyleng + 1);
133 strncpy(name, yytext, yyleng);
147 struct this_type type;
148 enum ECPGttype type_enum;
149 enum ECPGdtype dtype_enum;
150 struct fetch_desc descriptor;
153 /* special embedded SQL token */
154 %token SQL_ALLOCATE SQL_AUTOCOMMIT SQL_BOOL SQL_BREAK
155 SQL_CALL SQL_CARDINALITY SQL_CONNECT SQL_CONNECTION
156 SQL_CONTINUE SQL_COUNT SQL_CURRENT SQL_DATA
157 SQL_DATETIME_INTERVAL_CODE
158 SQL_DATETIME_INTERVAL_PRECISION
159 SQL_DESCRIPTOR SQL_DISCONNECT SQL_ENUM SQL_FOUND
160 SQL_FREE SQL_GO SQL_GOTO SQL_IDENTIFIED
161 SQL_INDICATOR SQL_KEY_MEMBER SQL_LENGTH
162 SQL_LONG SQL_NAME SQL_NULLABLE SQL_OCTET_LENGTH
163 SQL_OPEN SQL_RELEASE SQL_REFERENCE
164 SQL_RETURNED_LENGTH SQL_RETURNED_OCTET_LENGTH SQL_SCALE
165 SQL_SECTION SQL_SHORT SQL_SIGNED SQL_SQL SQL_SQLERROR
166 SQL_SQLPRINT SQL_SQLWARNING SQL_START SQL_STOP
167 SQL_STRUCT SQL_UNSIGNED SQL_VALUE SQL_VAR SQL_WHENEVER
170 %token S_ADD S_AND S_ANYTHING S_AUTO S_CONST S_DEC S_DIV
171 S_DOTPOINT S_EQUAL S_EXTERN S_INC S_LSHIFT S_MEMPOINT
172 S_MEMBER S_MOD S_MUL S_NEQUAL S_OR S_REGISTER S_RSHIFT
173 S_STATIC S_SUB S_VOLATILE
176 /* I need this and don't know where it is defined inside the backend */
179 /* ordinary key words in alphabetical order */
180 %token <keyword> ABORT_P ABSOLUTE ACCESS ACTION ADD AFTER
181 AGGREGATE ALL ALTER ANALYSE ANALYZE AND ANY AS ASC
182 ASSERTION ASSIGNMENT AT AUTHORIZATION
184 BACKWARD BEFORE BEGIN_P BETWEEN BIGINT BINARY BIT
187 CACHE CALLED CASCADE CASE CAST CHAIN CHAR_P
188 CHARACTER CHARACTERISTICS CHECK CHECKPOINT CLASS CLOSE
189 CLUSTER COALESCE COLLATE COLUMN COMMENT COMMIT
190 COMMITTED CONSTRAINT CONSTRAINTS CONVERSION_P CONVERT COPY
191 CREATE CREATEDB CREATEUSER CROSS CURRENT_DATE CURRENT_TIME
192 CURRENT_TIMESTAMP CURRENT_USER CURSOR CYCLE
194 DATABASE DAY_P DEALLOCATE DEC DECIMAL DECLARE DEFAULT
195 DEFERRABLE DEFERRED DEFINER DELETE_P DELIMITER DELIMITERS
196 DESC DISTINCT DO DOMAIN_P DOUBLE DROP
197 EACH ELSE ENCODING ENCRYPTED END_P ESCAPE EXCEPT EXCLUSIVE
198 EXECUTE EXISTS EXPLAIN EXTERNAL EXTRACT
200 FALSE_P FETCH FLOAT_P FOR FORCE FOREIGN FORWARD FREEZE FROM
203 GET GLOBAL GRANT GROUP_P
204 HANDLER HAVING HOUR_P
206 ILIKE IMMEDIATE IMMUTABLE IMPLICIT_P IN_P INCREMENT INDEX INHERITS
207 INITIALLY INNER_P INOUT INPUT INSENSITIVE INSERT INSTEAD INT
208 INTEGER INTERSECT INTERVAL INTO INVOKER IS ISNULL ISOLATION
214 LANCOMPILER LANGUAGE LAST LEADING LEFT LEVEL LIKE LIMIT LISTEN
215 LOAD LOCAL LOCATION LOCK_P
217 MATCH MAXVALUE MINUTE_P MINVALUE MODE MONTH_P MOVE
219 NAMES NATIONAL NATURAL NCHAR NEW NEXT NO NOCREATEDB
220 NOCREATEUSER NONE NOT NOTHING NOTIFY NOTNULL NULL_P NULLIF
223 OF OFF OFFSET OIDS OLD ON ONLY OPERATOR OPTION OR ORDER
224 OUT_P OUTER_P OVERLAPS OVERLAY OWNER
226 PARTIAL PASSWORD PATH_P PENDANT PLACING POSITION
227 PRECISION PRESERVE PREPARE PRIMARY PRIOR PRIVILEGES PROCEDURAL PROCEDURE
229 READ REAL RECHECK REFERENCES REINDEX RELATIVE RENAME REPLACE
230 RESET RESTRICT RETURNS REVOKE RIGHT ROLLBACK ROW ROWS RULE
232 SCHEMA SCROLL SECOND_P SECURITY SELECT SEQUENCE SERIALIZABLE
233 SESSION SESSION_USER SET SETOF SHARE SHOW SIMILAR SIMPLE SMALLINT SOME
234 STABLE START STATEMENT STATISTICS STDIN STDOUT STORAGE STRICT
237 TABLE TEMP TEMPLATE TEMPORARY THEN TIME TIMESTAMP TO TOAST
238 TRAILING TRANSACTION TREAT TRIGGER TRIM TRUE_P TRUNCATE TRUSTED TYPE_P
239 UNENCRYPTED UNION UNIQUE UNKNOWN UNLISTEN UNTIL UPDATE USAGE
242 VACUUM VALID VALUE VALUES VARCHAR VARYING VERBOSE VERSION VIEW VOLATILE
243 WHEN WHERE WITH WITHOUT WORK WRITE
247 /* The grammar thinks these are keywords, but they are not in the keywords.c
248 * list and so can never be entered directly. The filter in parser.c
249 * creates these tokens when required.
253 /* Special keywords, not in the query language - see the "lex" file */
254 %token <str> IDENT SCONST Op CSTRING CVARIABLE CPP_LINE IP BCONST XCONST
255 %token <ival> ICONST PARAM
258 /* precedence: lowest to highest */
266 %nonassoc LIKE ILIKE SIMILAR
271 %left POSTFIXOP /* dummy for postfix Op rules */
272 %left Op OPERATOR /* multi-character ops and user-defined operators */
275 %nonassoc IS NULL_P TRUE_P FALSE_P UNKNOWN
279 /* Unary Operators */
286 %left JOIN UNIONJOIN CROSS LEFT FULL RIGHT INNER_P NATURAL
288 %type <str> Iconst Fconst Sconst TransactionStmt CreateStmt UserId
289 %type <str> CreateAsElement OptCreateAs CreateAsList CreateAsStmt
290 %type <str> comment_text ConstraintDeferrabilitySpec TableElementList
291 %type <str> key_match ColLabel SpecialRuleRelation ColId columnDef
292 %type <str> ColConstraint ColConstraintElem drop_type Bconst
293 %type <str> TableConstraint OptTableElementList Xconst opt_transaction
294 %type <str> ConstraintElem key_actions ColQualList type_name
295 %type <str> target_list target_el update_target_list alias_clause
296 %type <str> update_target_el opt_id qualified_name database_name
297 %type <str> access_method attr_name index_name name func_name
298 %type <str> file_name AexprConst c_expr ConstTypename var_list
299 %type <str> a_expr b_expr TruncateStmt CommentStmt OnCommitOption opt_by
300 %type <str> opt_indirection expr_list extract_list extract_arg
301 %type <str> position_list substr_list substr_from alter_column_default
302 %type <str> trim_list in_expr substr_for attrs TableFuncElement
303 %type <str> Typename SimpleTypename Numeric opt_float opt_numeric
304 %type <str> opt_decimal Character character opt_varying opt_charset
305 %type <str> opt_collate opt_timezone opt_interval table_ref
306 %type <str> row_descriptor ConstDatetime AlterDomainStmt
307 %type <str> SelectStmt into_clause OptTemp ConstraintAttributeSpec
308 %type <str> opt_table opt_all sort_clause sortby_list ConstraintAttr
309 %type <str> sortby OptUseOp qualified_name_list name_list ColId_or_Sconst
310 %type <str> group_clause having_clause from_clause opt_distinct
311 %type <str> join_outer where_clause relation_expr sub_type opt_arg
312 %type <str> opt_column_list insert_rest InsertStmt OptimizableStmt
313 %type <str> columnList DeleteStmt LockStmt UpdateStmt CursorStmt
314 %type <str> NotifyStmt columnElem UnlistenStmt TableElement rowdefinition
315 %type <str> copy_delimiter ListenStmt CopyStmt copy_file_name opt_binary
316 %type <str> FetchStmt direction fetch_how_many from_in CreateOpClassStmt
317 %type <str> ClosePortalStmt DropStmt VacuumStmt AnalyzeStmt opt_verbose
318 %type <str> opt_full func_arg OptWithOids opt_freeze opt_ecpg_into
319 %type <str> analyze_keyword opt_name_list ExplainStmt index_params
320 %type <str> index_list func_index index_elem opt_class access_method_clause
321 %type <str> index_opt_unique IndexStmt func_return ConstInterval
322 %type <str> func_args_list func_args opt_with def_arg overlay_placing
323 %type <str> def_elem def_list definition DefineStmt select_with_parens
324 %type <str> opt_instead event RuleActionList opt_using CreateAssertStmt
325 %type <str> RuleActionStmtOrEmpty RuleActionMulti func_as reindex_type
326 %type <str> RuleStmt opt_column opt_name oper_argtypes NumConst
327 %type <str> MathOp RemoveFuncStmt aggr_argtype for_update_clause
328 %type <str> RemoveAggrStmt opt_procedural select_no_parens CreateCastStmt
329 %type <str> RemoveOperStmt RenameStmt all_Op opt_Trusted opt_lancompiler
330 %type <str> VariableSetStmt var_value zone_value VariableShowStmt
331 %type <str> VariableResetStmt AlterTableStmt from_list overlay_list
332 %type <str> user_list OptUserList OptUserElem relation_name
333 %type <str> CreateUserStmt AlterUserStmt CreateSeqStmt OptSeqList
334 %type <str> OptSeqElem TriggerForSpec TriggerForOpt TriggerForType
335 %type <str> DropTrigStmt TriggerOneEvent TriggerEvents RuleActionStmt
336 %type <str> TriggerActionTime CreateTrigStmt DropPLangStmt DropCastStmt
337 %type <str> CreatePLangStmt TriggerFuncArgs TriggerFuncArg simple_select
338 %type <str> ViewStmt LoadStmt CreatedbStmt createdb_opt_item
339 %type <str> createdb_opt_list opt_encoding OptInherit opt_equal
340 %type <str> AlterUserSetStmt privilege_list privilege privilege_target
341 %type <str> opt_grant_grant_option opt_revoke_grant_option
342 %type <str> transaction_mode_list_or_empty transaction_mode_list
343 %type <str> function_with_argtypes_list function_with_argtypes
344 %type <str> DropdbStmt ClusterStmt grantee RevokeStmt Bit DropOpClassStmt
345 %type <str> GrantStmt privileges PosAllConst constraints_set_list
346 %type <str> opt_cursor ConstraintsSetStmt AllConst CreateDomainStmt
347 %type <str> case_expr when_clause_list case_default case_arg when_clause
348 %type <str> select_clause opt_select_limit select_limit_value opt_recheck
349 %type <str> ConstraintTimeSpec AlterDatabaseSetStmt DropAssertStmt
350 %type <str> select_offset_value ReindexStmt join_type opt_boolean
351 %type <str> join_qual update_list joined_table opclass_item
352 %type <str> opt_lock lock_type OptGroupList OptGroupElem
353 %type <str> OptConstrFromTable OptTempTableName StringConst
354 %type <str> constraints_set_mode comment_type opt_empty_parentheses
355 %type <str> CreateGroupStmt AlterGroupStmt DropGroupStmt key_delete
356 %type <str> opt_force key_update CreateSchemaStmt PosIntStringConst
357 %type <str> IntConst PosIntConst grantee_list func_type opt_or_replace
358 %type <str> select_limit opt_for_update_clause CheckPointStmt
359 %type <str> OptSchemaName OptSchemaEltList schema_stmt opt_drop_behavior
360 %type <str> handler_name any_name_list any_name opt_as insert_column_list
361 %type <str> columnref dotted_name function_name insert_target_el
362 %type <str> insert_target_list insert_column_item DropRuleStmt
363 %type <str> createfunc_opt_item set_rest var_list_or_default
364 %type <str> CreateFunctionStmt createfunc_opt_list func_table
365 %type <str> DropUserStmt copy_from copy_opt_list copy_opt_item
366 %type <str> opt_oids TableLikeClause key_action opt_definition
367 %type <str> cast_context row r_expr qual_Op qual_all_Op opt_default
368 %type <str> CreateConversionStmt any_operator opclass_item_list
369 %type <str> iso_level type_list CharacterWithLength ConstCharacter
370 %type <str> CharacterWithoutLength BitWithLength BitWithoutLength
371 %type <str> ConstBit GenericType TableFuncElementList opt_analyze
372 %type <str> opt_sort_clause transaction_access_mode
374 %type <str> ECPGWhenever ECPGConnect connection_target ECPGOpen
375 %type <str> indicator ECPGExecute ECPGPrepare opt_ecpg_using ecpg_into
376 %type <str> storage_declaration storage_clause opt_initializer c_anything
377 %type <str> variable_list variable c_thing c_term
378 %type <str> opt_pointer ECPGDisconnect dis_name storage_modifier
379 %type <str> ECPGRelease execstring server_name ECPGVarDeclaration
380 %type <str> connection_object opt_server opt_port c_stuff c_stuff_item
381 %type <str> user_name opt_user char_variable ora_user ident opt_reference
382 %type <str> var_type_declarations quoted_ident_stringvar
383 %type <str> db_prefix server opt_options opt_connection_name c_list
384 %type <str> ECPGSetConnection ECPGTypedef c_args ECPGKeywords
385 %type <str> enum_type civar civarind ECPGCursorStmt ECPGDeallocate
386 %type <str> ECPGFree ECPGDeclare ECPGVar opt_at enum_definition
387 %type <str> struct_type s_struct vt_declarations variable_declarations
388 %type <str> var_declaration type_declaration single_vt_declaration
389 %type <str> s_union union_type ECPGSetAutocommit on_off
390 %type <str> ECPGAllocateDescr ECPGDeallocateDescr symbol opt_symbol
391 %type <str> ECPGGetDescriptorHeader ECPGColLabel single_var_declaration
392 %type <str> reserved_keyword unreserved_keyword
393 %type <str> col_name_keyword func_name_keyword
394 %type <str> ECPGTypeName variablelist ECPGColLabelCommon
396 %type <descriptor> ECPGGetDescriptor
398 %type <type_enum> simple_type signed_type unsigned_type
400 %type <dtype_enum> descriptor_item desc_header_item
402 %type <type> type common_type single_vt_type
404 %type <action> action
406 %type <index> opt_array_bounds opt_type_array_bounds
413 statements: /*EMPTY*/
414 | statements statement
417 statement: ecpgstart opt_at stmt ';' { connection = NULL; }
419 | ecpgstart ECPGVarDeclaration
421 fprintf(yyout, "%s", $2);
423 output_line_number();
426 | c_thing { fprintf(yyout, "%s", $1); free($1); }
427 | CPP_LINE { fprintf(yyout, "%s", $1); free($1); }
428 | '{' { braces_open++; fputs("{", yyout); }
429 | '}' { remove_variables(braces_open--); fputs("}", yyout); }
432 opt_at: AT connection_target
436 * if we have a variable as connection
437 * target, remove it from the variable
438 * list or else it will be used twice
440 if (argsinsert != NULL)
444 stmt: AlterDatabaseSetStmt { output_statement($1, 0, connection); }
445 | AlterDomainStmt { output_statement($1, 0, connection); }
446 | AlterGroupStmt { output_statement($1, 0, connection); }
447 | AlterTableStmt { output_statement($1, 0, connection); }
448 | AlterUserStmt { output_statement($1, 0, connection); }
449 | AlterUserSetStmt { output_statement($1, 0, connection); }
450 | ClosePortalStmt { output_statement($1, 0, connection); }
451 | CommentStmt { output_statement($1, 0, connection); }
452 | CopyStmt { output_statement($1, 0, connection); }
453 | CreateStmt { output_statement($1, 0, connection); }
454 | CreateAsStmt { output_statement($1, 0, connection); }
455 | CreateCastStmt { output_statement($1, 0, connection); }
456 | CreateDomainStmt { output_statement($1, 0, connection); }
457 | CreateFunctionStmt { output_statement($1, 0, connection); }
458 | CreateSchemaStmt { output_statement($1, 0, connection); }
459 | CreateGroupStmt { output_statement($1, 0, connection); }
460 | CreateSeqStmt { output_statement($1, 0, connection); }
461 | CreatePLangStmt { output_statement($1, 0, connection); }
462 | CreateAssertStmt { output_statement($1, 0, connection); }
463 | CreateOpClassStmt { output_statement($1, 0, connection); }
464 | CreateTrigStmt { output_statement($1, 0, connection); }
465 | CreateUserStmt { output_statement($1, 0, connection); }
466 | ClusterStmt { output_statement($1, 0, connection); }
467 /*| DeallocateStmt { output_statement($1, 0, connection); }*/
468 | DefineStmt { output_statement($1, 0, connection); }
469 | DropStmt { output_statement($1, 0, connection); }
470 | TruncateStmt { output_statement($1, 0, connection); }
471 | DropCastStmt { output_statement($1, 0, connection); }
472 | DropGroupStmt { output_statement($1, 0, connection); }
473 | DropOpClassStmt { output_statement($1, 0, connection); }
474 | DropPLangStmt { output_statement($1, 0, connection); }
475 | DropAssertStmt { output_statement($1, 0, connection); }
476 | DropTrigStmt { output_statement($1, 0, connection); }
477 | DropRuleStmt { output_statement($1, 0, connection); }
478 | DropUserStmt { output_statement($1, 0, connection); }
479 | ExplainStmt { output_statement($1, 0, connection); }/* | ExecuteStmt { output_statement($1, 0, connection); }*/
480 | FetchStmt { output_statement($1, 1, connection); }
481 | GrantStmt { output_statement($1, 0, connection); }
482 | IndexStmt { output_statement($1, 0, connection); }
483 | ListenStmt { output_statement($1, 0, connection); }
484 | UnlistenStmt { output_statement($1, 0, connection); }
485 | LockStmt { output_statement($1, 0, connection); }
486 | NotifyStmt { output_statement($1, 0, connection); }
487 /* | PrepareStmt { output_statement($1, 0, connection); }*/
488 | ReindexStmt { output_statement($1, 0, connection); }
489 | RemoveAggrStmt { output_statement($1, 0, connection); }
490 | RemoveOperStmt { output_statement($1, 0, connection); }
491 | RemoveFuncStmt { output_statement($1, 0, connection); }
492 | RenameStmt { output_statement($1, 0, connection); }
493 | RevokeStmt { output_statement($1, 0, connection); }
496 if (strncmp($1, "/* " , sizeof("/* ")-1) == 0)
497 output_simple_statement($1);
499 output_statement($1, 1, connection);
501 | RuleStmt { output_statement($1, 0, connection); }
504 fprintf(yyout, "{ ECPGtrans(__LINE__, %s, \"%s\");", connection ? connection : "NULL", $1);
508 | ViewStmt { output_statement($1, 0, connection); }
509 | LoadStmt { output_statement($1, 0, connection); }
510 | CreatedbStmt { output_statement($1, 0, connection); }
511 | DropdbStmt { output_statement($1, 0, connection); }
512 | VacuumStmt { output_statement($1, 0, connection); }
513 | AnalyzeStmt { output_statement($1, 0, connection); }
514 | VariableSetStmt { output_statement($1, 0, connection); }
515 | VariableShowStmt { output_statement($1, 0, connection); }
516 | VariableResetStmt { output_statement($1, 0, connection); }
517 | ConstraintsSetStmt { output_statement($1, 0, connection); }
518 | CheckPointStmt { output_statement($1, 0, connection); }
519 | CreateConversionStmt { output_statement($1, 0, connection); }
522 fprintf(yyout,"ECPGallocate_desc(__LINE__, %s);",$1);
529 mmerror(PARSE_ERROR, ET_ERROR, "no at option for connect statement.\n");
531 fprintf(yyout, "{ ECPGconnect(__LINE__, %s, %d); ", $1, autocommit);
538 output_simple_statement($1);
543 mmerror(PARSE_ERROR, ET_ERROR, "no at option for connect statement.\n");
550 | ECPGDeallocateDescr
552 fprintf(yyout,"ECPGdeallocate_desc(__LINE__, %s);",$1);
558 output_simple_statement($1);
563 mmerror(PARSE_ERROR, ET_ERROR, "no at option for disconnect statement.\n");
565 fprintf(yyout, "{ ECPGdisconnect(__LINE__, %s);",
566 $1 ? $1 : "\"CURRENT\"");
572 output_statement($1, 0, connection);
576 fprintf(yyout, "{ ECPGdeallocate(__LINE__, \"%s\");", $1);
583 lookup_descriptor($1.name, connection);
584 output_get_descr($1.name, $1.str);
588 | ECPGGetDescriptorHeader
590 lookup_descriptor($1, connection);
591 output_get_descr_header($1);
599 for (ptr = cur; ptr != NULL; ptr=ptr->next)
601 if (strcmp(ptr->name, $1) == 0)
607 snprintf(errortext, sizeof(errortext), "trying to open undeclared cursor %s\n", $1);
608 mmerror(PARSE_ERROR, ET_ERROR, errortext);
611 /* merge variables given in prepare statement with those given here */
612 for (p = ptr->argsinsert; p; p = p->next)
613 append_variable(&argsinsert, p->variable, p->indicator);
615 for (p = ptr->argsresult; p; p = p->next)
616 add_variable(&argsresult, p->variable, p->indicator);
618 output_statement(mm_strdup(ptr->command), 0, ptr->connection ? mm_strdup(ptr->connection) : NULL);
623 mmerror(PARSE_ERROR, ET_ERROR, "no at option for set connection statement.\n");
625 fprintf(yyout, "{ ECPGprepare(__LINE__, %s);", $1);
629 | ECPGRelease { /* output already done */ }
632 fprintf(yyout, "{ ECPGsetcommit(__LINE__, \"%s\", %s);", $1, connection ? connection : "NULL");
639 mmerror(PARSE_ERROR, ET_ERROR, "no at option for set connection statement.\n");
641 fprintf(yyout, "{ ECPGsetconn(__LINE__, %s);", $1);
648 mmerror(PARSE_ERROR, ET_ERROR, "no at option for typedef statement.\n");
650 fprintf(yyout, "%s", $1);
652 output_line_number();
657 mmerror(PARSE_ERROR, ET_ERROR, "no at option for var statement.\n");
659 output_simple_statement($1);
664 mmerror(PARSE_ERROR, ET_ERROR, "no at option for whenever statement.\n");
666 output_simple_statement($1);
672 * We start with a lot of stuff that's very similar to the backend's parsing
675 /*****************************************************************************
677 * Create a new Postgres DBMS user
680 *****************************************************************************/
682 CreateUserStmt: CREATE USER UserId opt_with OptUserList
683 { $$ = cat_str(4, make_str("create user"), $3, make_str("with"), $5); }
686 opt_with: WITH { $$ = make_str("with"); }
687 | /*EMPTY*/ { $$ = EMPTY; }
691 /*****************************************************************************
693 * Alter a postgresql DBMS user
696 *****************************************************************************/
698 AlterUserStmt: ALTER USER UserId OptUserList
699 { $$ = cat_str(3, make_str("alter user"), $3, $4); }
700 | ALTER USER UserId WITH OptUserList
701 { $$ = cat_str(4, make_str("alter user"), $3, make_str("with"), $5); }
704 AlterUserSetStmt: ALTER USER UserId SET set_rest
705 { $$ = cat_str(4, make_str("alter user"), $3, make_str("set"), $5); }
706 | ALTER USER UserId VariableResetStmt
707 { $$ = cat_str(3, make_str("alter user"), $3, $4); }
710 /*****************************************************************************
712 * Drop a postgresql DBMS user
715 *****************************************************************************/
716 DropUserStmt: DROP USER user_list
717 { $$ = cat2_str(make_str("drop user"), $3);}
720 * Options for CREATE USER and ALTER USER
723 OptUserList: OptUserList OptUserElem { $$ = cat2_str($1, $2); }
724 | /* EMPTY */ { $$ = EMPTY; }
727 OptUserElem: PASSWORD Sconst
728 { $$ = cat2_str(make_str("password"), $2); }
730 { $$ = cat2_str(make_str("sysid"), $2); }
732 { $$ = make_str("createdb"); }
734 { $$ = make_str("nocreatedb"); }
736 { $$ = make_str("createuser"); }
738 { $$ = make_str("nocreateuser"); }
739 | IN_P GROUP_P user_list
740 { $$ = cat2_str(make_str("in group"), $3); }
742 { $$ = cat2_str(make_str("valid until"), $3); }
745 user_list: user_list ',' UserId
746 { $$ = cat_str(3, $1, make_str(","), $3); }
751 /*****************************************************************************
753 * Create a postgresql group
756 ****************************************************************************/
757 CreateGroupStmt: CREATE GROUP_P UserId OptGroupList
758 { $$ = cat_str(3, make_str("create group"), $3, $4); }
759 | CREATE GROUP_P UserId WITH OptGroupList
760 { $$ = cat_str(4, make_str("create group"), $3, make_str("with"), $5); }
764 * Options for CREATE GROUP
766 OptGroupList: OptGroupList OptGroupElem { $$ = cat2_str($1, $2); }
767 | /* EMPTY */ { $$ = EMPTY; }
770 OptGroupElem: USER user_list
771 { $$ = cat2_str(make_str("user"), $2); }
773 { $$ = cat2_str(make_str("sysid"), $2); }
777 /*****************************************************************************
779 * Alter a postgresql group
782 *****************************************************************************/
783 AlterGroupStmt: ALTER GROUP_P UserId ADD USER user_list
784 { $$ = cat_str(4, make_str("alter group"), $3, make_str("add user"), $6); }
785 | ALTER GROUP_P UserId DROP USER user_list
786 { $$ = cat_str(4, make_str("alter group"), $3, make_str("drop user"), $6); }
789 /*****************************************************************************
791 * Drop a postgresql group
794 *****************************************************************************/
795 DropGroupStmt: DROP GROUP_P UserId
796 { $$ = cat2_str(make_str("drop group"), $3); }
799 /*****************************************************************************
801 * Manipulate a schema
804 *****************************************************************************/
806 CreateSchemaStmt: CREATE SCHEMA UserId OptSchemaName AUTHORIZATION UserId OptSchemaEltList
807 { $$ = cat_str(6, make_str("create scheme"), $3, $4, make_str("authorization"), $6, $7); }
808 | CREATE SCHEMA ColId OptSchemaEltList
809 { $$ = cat_str(3, make_str("create scheme"), $3, $4); }
812 OptSchemaName: ColId { $$ = $1; }
813 | /* EMPTY */ { $$ = EMPTY; }
816 OptSchemaEltList: OptSchemaEltList schema_stmt { $$ = cat2_str($1, $2); }
817 | /* EMPTY */ { $$ = EMPTY; }
821 * schema_stmt are the ones that can show up inside a CREATE SCHEMA
822 * statement (in addition to by themselves).
824 schema_stmt: CreateStmt { $$ = $1; }
825 | GrantStmt { $$ = $1; }
826 | ViewStmt { $$ = $1; }
831 /*****************************************************************************
833 * Set PG internal variable
834 * SET name TO 'var_value'
835 * Include SQL92 syntax (thomas 1997-10-22):
836 * SET TIME ZONE 'var_value'
838 *****************************************************************************/
839 VariableSetStmt: SET set_rest
840 { $$ = cat2_str(make_str("set"), $2 ); }
842 { $$ = cat2_str(make_str("set local"), $3 ); }
843 | SET SESSION set_rest
844 { $$ = cat2_str(make_str("set session"), $3 ); }
847 set_rest: ColId TO var_list_or_default
848 { $$ = cat_str(3, $1, make_str("to"), $3); }
849 | ColId "=" var_list_or_default
850 { $$ = cat_str(3, $1, make_str("="), $3); }
851 | TIME ZONE zone_value
852 { $$ = cat2_str(make_str("time zone"), $3); }
853 | TRANSACTION transaction_mode_list
854 { $$ = cat2_str(make_str("transaction"), $2); }
855 | SESSION CHARACTERISTICS AS TRANSACTION transaction_mode_list
856 { $$ = cat2_str(make_str("session characteristics as transaction"), $5); }
858 { $$ = cat2_str(make_str("names"), $2); }
859 | SESSION AUTHORIZATION ColId_or_Sconst
860 { $$ = cat2_str(make_str("session authorization"), $3); }
861 | SESSION AUTHORIZATION DEFAULT
862 { $$ = make_str("session authorization default"); }
865 var_list_or_default: var_list
868 { $$ = make_str("default"); }
873 | var_list ',' var_value
874 { $$ = cat_str(3, $1, make_str(","), $3); }
877 iso_level: READ COMMITTED { $$ = make_str("read committed"); }
878 | SERIALIZABLE { $$ = make_str("serializable"); }
881 var_value: opt_boolean { $$ = $1; }
882 | AllConst { $$ = $1; }
886 opt_boolean: TRUE_P { $$ = make_str("true"); }
887 | FALSE_P { $$ = make_str("false"); }
888 | ON { $$ = make_str("on"); }
889 | OFF { $$ = make_str("off"); }
891 /* Timezone values can be:
892 * - a string such as 'pst8pdt'
893 * - a column identifier such as "pst8pdt"
894 * - an integer or floating point number
895 * - a time interval per SQL99
896 * ConstInterval and ColId give shift/reduce errors,
897 * so use IDENT and reject anything which is a reserved word.
899 zone_value: AllConst { $$ = $1; }
901 | ConstInterval StringConst opt_interval
902 { $$ = cat_str(3, $1, $2, $3); }
903 | ConstInterval '(' PosIntConst ')' StringConst opt_interval
904 { $$ = cat_str(6, $1, make_str("("), $3, make_str(")"), $5, $6); }
906 { $$ = make_str("default"); }
908 { $$ = make_str("local"); }
911 opt_encoding: StringConst { $$ = $1; }
912 | DEFAULT { $$ = make_str("default"); }
913 | /*EMPTY*/ { $$ = EMPTY; }
916 ColId_or_Sconst: ColId { $$ = $1; }
917 | StringConst { $$ = $1; }
920 VariableShowStmt: SHOW ColId
921 { $$ = cat2_str(make_str("show"), $2); }
923 { $$ = make_str("show time zone"); }
924 | SHOW TRANSACTION ISOLATION LEVEL
925 { $$ = make_str("show transaction isolation level"); }
926 | SHOW SESSION AUTHORIZATION
927 { $$ = make_str("show session authorization"); }
929 { $$ = make_str("show all"); }
932 VariableResetStmt: RESET ColId
933 { $$ = cat2_str(make_str("reset"), $2); }
935 { $$ = make_str("reset time zone"); }
936 | RESET TRANSACTION ISOLATION LEVEL
937 { $$ = make_str("reset transaction isolation level"); }
938 | RESET SESSION AUTHORIZATION
939 { $$ = make_str("reset session authorization"); }
941 { $$ = make_str("reset all"); }
944 ConstraintsSetStmt: SET CONSTRAINTS constraints_set_list constraints_set_mode
945 { $$ = cat_str(3, make_str("set constraints"), $3, $4); }
948 constraints_set_list: ALL
949 { $$ = make_str("all"); }
954 constraints_set_mode: DEFERRED { $$ = make_str("deferred"); }
955 | IMMEDIATE { $$ = make_str("immediate"); }
959 * Checkpoint statement
961 CheckPointStmt: CHECKPOINT { $$= make_str("checkpoint"); }
965 /*****************************************************************************
967 * ALTER TABLE variations
969 *****************************************************************************/
972 /* ALTER TABLE <relation> ADD [COLUMN] <coldef> */
973 ALTER TABLE relation_expr ADD opt_column columnDef
974 { $$ = cat_str(5, make_str("alter table"), $3, make_str("add"), $5, $6); }
975 /* ALTER TABLE <relation> ALTER [COLUMN] <colname> {SET DEFAULT <expr>|DROP DEFAULT} */
976 | ALTER TABLE relation_expr ALTER opt_column ColId alter_column_default
977 { $$ = cat_str(6, make_str("alter table"), $3, make_str("alter"), $5, $6, $7); }
978 /* ALTER TABLE <relation> ALTER [COLUMN] <colname> DROP NOT NULL */
979 | ALTER TABLE relation_expr ALTER opt_column ColId DROP NOT NULL_P
980 { $$ = cat_str(6, make_str("alter table"), $3, make_str("alter"), $5, $6, make_str("drop not null")); }
981 /* ALTER TABLE <relation> ALTER [COLUMN] <colname> SET NOT NULL */
982 | ALTER TABLE relation_expr ALTER opt_column ColId SET NOT NULL_P
983 { $$ = cat_str(6, make_str("alter table"), $3, make_str("alter"), $5, $6, make_str("set not null")); }
984 /* ALTER TABLE <relation> ALTER [COLUMN] <colname> SET STATISTICS <IntegerOnly> */
985 | ALTER TABLE relation_expr ALTER opt_column ColId SET STATISTICS PosIntConst
986 { $$ = cat_str(7, make_str("alter table"), $3, make_str("alter"), $5, $6, make_str("set statistics"), $9); }
987 /* ALTER TABLE <relation> ALTER [COLUMN] <colname> SET STORAGE <storagemode> */
988 | ALTER TABLE relation_expr ALTER opt_column ColId SET STORAGE ColId
989 { $$ = cat_str(7, make_str("alter table"), $3, make_str("alter"), $5, $6, make_str("set storage"), $9); }
990 /* ALTER TABLE <relation> DROP [COLUMN] <colname> {RESTRICT|CASCADE} */
991 | ALTER TABLE relation_expr DROP opt_column ColId opt_drop_behavior
992 { $$ = cat_str(6, make_str("alter table"), $3, make_str("drop"), $5, $6, $7); }
993 /* ALTER TABLE <relation> ADD CONSTRAINT ... */
994 | ALTER TABLE relation_expr ADD TableConstraint
995 { $$ = cat_str(4, make_str("alter table"), $3, make_str("add"), $5); }
996 /* ALTER TABLE <relation> DROP CONSTRAINT ... */
997 | ALTER TABLE relation_expr DROP CONSTRAINT name opt_drop_behavior
998 { $$ = cat_str(5, make_str("alter table"), $3, make_str("drop constraint"), $6, $7); }
999 /* ALTER TABLE <relation> SET WITHOUT OIDS */
1000 | ALTER TABLE relation_expr SET WITHOUT OIDS
1001 { $$ = cat_str(3, make_str("alter table"), $3, make_str("set without oids")); }
1002 /* ALTER TABLE <name> CREATE TOAST TABLE */
1003 | ALTER TABLE qualified_name CREATE TOAST TABLE
1004 { $$ = cat_str(3, make_str("alter table"), $3, make_str("create toast table")); }
1005 /* ALTER TABLE <name> OWNER TO UserId */
1006 | ALTER TABLE qualified_name OWNER TO UserId
1007 { $$ = cat_str(4, make_str("alter table"), $3, make_str("owner to"), $6); }
1010 alter_column_default:
1011 SET DEFAULT a_expr { $$ = cat2_str(make_str("set default"), $3); }
1012 | DROP DEFAULT { $$ = make_str("drop default"); }
1015 opt_drop_behavior: CASCADE { $$ = make_str("cascade"); }
1016 | RESTRICT { $$ = make_str("restrict"); }
1017 | /* EMPTY */ { $$ = EMPTY; }
1020 /*****************************************************************************
1025 *****************************************************************************/
1027 ClosePortalStmt: CLOSE opt_id { $$ = cat2_str(make_str("close"), $2); }
1030 opt_id: ColId { $$ = $1; }
1031 | /*EMPTY*/ { $$ = NULL; }
1034 /*****************************************************************************
1037 * COPY [BINARY] <relname> FROM/TO
1038 * [USING DELIMITERS <delimiter>]
1040 *****************************************************************************/
1042 CopyStmt: COPY opt_binary qualified_name opt_oids copy_from
1043 copy_file_name copy_delimiter opt_with copy_opt_list
1044 { $$ = cat_str(9, make_str("copy"), $2, $3, $4, $5, $6, $7, $8, $9); }
1047 copy_from: TO { $$ = make_str("to"); }
1048 | FROM { $$ = make_str("from"); }
1052 * copy_file_name NULL indicates stdio is used. Whether stdin or stdout is
1053 * used depends on the direction. (It really doesn't make sense to copy from
1054 * stdout. We silently correct the "typo". - AY 9/94
1056 copy_file_name: StringConst { $$ = $1; }
1057 | STDIN { $$ = make_str("stdin"); }
1058 | STDOUT { $$ = make_str("stdout"); }
1061 copy_opt_list: copy_opt_list copy_opt_item { $$ = cat2_str($1, $2); }
1062 | /* EMPTY */ { $$ = EMPTY; }
1065 copy_opt_item: BINARY { $$ = make_str("binary"); }
1066 | OIDS { $$ = make_str("oids"); }
1067 | DELIMITER opt_as StringConst
1068 { $$ = cat_str(3, make_str("delimiter"), $2, $3); }
1069 | NULL_P opt_as StringConst
1070 { $$ = cat_str(3, make_str("null"), $2, $3); }
1073 opt_binary: BINARY { $$ = make_str("binary"); }
1074 | /* EMPTY */ { $$ = EMPTY; }
1077 opt_oids: WITH OIDS { $$ = make_str("with oids"); }
1078 | /* EMPTY */ { $$ = EMPTY; }
1083 * the default copy delimiter is tab but the user can configure it
1085 copy_delimiter: opt_using DELIMITERS StringConst
1086 { $$ = cat_str(3, $1, make_str("delimiters"), $3); }
1091 opt_using: USING { $$ = make_str("using"); }
1092 | /* EMPTY */ { $$ = EMPTY; }
1095 /*****************************************************************************
1098 * CREATE TABLE relname
1100 *****************************************************************************/
1102 CreateStmt: CREATE OptTemp TABLE qualified_name '(' OptTableElementList ')'
1103 OptInherit OptWithOids OnCommitOption
1104 { $$ = cat_str(10, make_str("create"), $2, make_str("table"), $4, make_str("("), $6, make_str(")"), $8, $9, $10); }
1105 | CREATE OptTemp TABLE qualified_name OF qualified_name
1106 '(' OptTableElementList ')' OptWithOids OnCommitOption
1107 { $$ = cat_str(11, make_str("create"), $2, make_str("table"), $4, make_str("of"), $6, make_str("("), $8, make_str(")"), $10, $11); }
1111 * Redundancy here is needed to avoid shift/reduce conflicts,
1112 * since TEMP is not a reserved word. See also OptTempTableName.
1115 OptTemp: TEMPORARY { $$ = make_str("temporary"); }
1116 | TEMP { $$ = make_str("temp"); }
1117 | LOCAL TEMPORARY { $$ = make_str("local temporary"); }
1118 | LOCAL TEMP { $$ = make_str("local temp"); }
1121 mmerror(PARSE_ERROR, ET_WARNING, "Currently unsupported CREATE TABLE / GLOBAL TEMPORARY will be passed to backend");
1122 $$ = make_str("global temporary");
1126 mmerror(PARSE_ERROR, ET_WARNING, "Currently unsupported CREATE TABLE / GLOBAL TEMP will be passed to backend");
1127 $$ = make_str("global temp");
1129 | /*EMPTY*/ { $$ = EMPTY; }
1133 OptTableElementList: TableElementList
1138 TableElementList: TableElement
1140 | TableElementList ',' TableElement
1141 { $$ = cat_str(3, $1, make_str(","), $3); }
1144 TableElement: columnDef { $$ = $1; }
1145 | TableLikeClause { $$ = $1; }
1146 | TableConstraint { $$ = $1; }
1149 columnDef: ColId Typename ColQualList opt_collate
1153 snprintf(errortext, sizeof(errortext), "Currently unsupported CREATE TABLE / COLLATE %s will be passed to backend", $4);
1154 mmerror(PARSE_ERROR, ET_WARNING, errortext);
1156 $$ = cat_str(4, $1, $2, $3, $4);
1160 ColQualList: ColQualList ColConstraint { $$ = cat2_str($1,$2); }
1161 | /*EMPTY*/ { $$ = EMPTY; }
1164 ColConstraint: CONSTRAINT name ColConstraintElem
1165 { $$ = cat_str(3, make_str("constraint"), $2, $3); }
1166 | ColConstraintElem { $$ = $1; }
1167 | ConstraintAttr { $$ = $1; }
1170 /* DEFAULT NULL is already the default for Postgres.
1171 * But define it here and carry it forward into the system
1172 * to make it explicit.
1173 * - thomas 1998-09-13
1175 * WITH NULL and NULL are not SQL92-standard syntax elements,
1176 * so leave them out. Use DEFAULT NULL to explicitly indicate
1177 * that a column may have that value. WITH NULL leads to
1178 * shift/reduce conflicts with WITH TIME ZONE anyway.
1179 * - thomas 1999-01-08
1181 ColConstraintElem: NOT NULL_P
1182 { $$ = make_str("not null"); }
1184 { $$ = make_str("null"); }
1186 { $$ = make_str("unique"); }
1188 { $$ = make_str("primary key"); }
1189 | CHECK '(' a_expr ')'
1190 { $$ = cat_str(3, make_str("check ("), $3, make_str(")")); }
1192 { $$ = cat2_str(make_str("default"), $2); }
1193 | REFERENCES qualified_name opt_column_list key_match key_actions
1194 { $$ = cat_str(5, make_str("references"), $2, $3, $4, $5); }
1198 * ConstraintAttr represents constraint attributes, which we parse as if
1199 * they were independent constraint clauses, in order to avoid shift/reduce
1200 * conflicts (since NOT might start either an independent NOT NULL clause
1201 * or an attribute). analyze.c is responsible for attaching the attribute
1202 * information to the preceding "real" constraint node, and for complaining
1203 * if attribute clauses appear in the wrong place or wrong combinations.
1205 * See also ConstraintAttributeSpec, which can be used in places where
1206 * there is no parsing conflict.
1208 ConstraintAttr: DEFERRABLE { $$ = make_str("deferrable"); }
1209 | NOT DEFERRABLE { $$ = make_str("not deferrable"); }
1210 | INITIALLY DEFERRED { $$ = make_str("initially deferred"); }
1211 | INITIALLY IMMEDIATE { $$ = make_str("initially immediate"); }
1214 TableLikeClause: LIKE any_name
1216 mmerror(PARSE_ERROR, ET_ERROR, "LIKE in table definitions not yet supported");
1217 $$ = cat2_str(make_str("like"), $2);
1221 /* ConstraintElem specifies constraint syntax which is not embedded into
1222 * a column definition. ColConstraintElem specifies the embedded form.
1223 * - thomas 1997-12-03
1225 TableConstraint: CONSTRAINT name ConstraintElem
1226 { $$ = cat_str(3, make_str("constraint"), $2, $3); }
1231 ConstraintElem: CHECK '(' a_expr ')'
1232 { $$ = cat_str(3, make_str("check("), $3, make_str(")")); }
1233 | UNIQUE '(' columnList ')'
1234 { $$ = cat_str(3, make_str("unique("), $3, make_str(")")); }
1235 | PRIMARY KEY '(' columnList ')'
1236 { $$ = cat_str(3, make_str("primary key("), $4, make_str(")")); }
1237 | FOREIGN KEY '(' columnList ')' REFERENCES qualified_name opt_column_list
1238 key_match key_actions ConstraintAttributeSpec
1239 { $$ = cat_str(8, make_str("foreign key("), $4, make_str(") references"), $7, $8, $9, $10, $11); }
1242 opt_column_list: '(' columnList ')' { $$ = cat_str(3, make_str("("), $2, make_str(")")); }
1243 | /*EMPTY*/ { $$ = EMPTY; }
1246 columnList: columnList ',' columnElem
1247 { $$ = cat_str(3, $1, make_str(","), $3); }
1252 columnElem: ColId { $$ = $1; }
1255 key_match: MATCH FULL
1256 { $$ = make_str("match full"); }
1259 mmerror(PARSE_ERROR, ET_WARNING, "Currently unsupported FOREIGN KEY/MATCH PARTIAL will be passed to backend");
1260 $$ = make_str("match partial");
1266 key_actions: key_delete { $$ = $1; }
1267 | key_update { $$ = $1; }
1268 | key_delete key_update { $$ = cat2_str($1, $2); }
1269 | key_update key_delete { $$ = cat2_str($1, $2); }
1270 | /*EMPTY*/ { $$ = EMPTY; }
1273 key_delete: ON DELETE_P key_action
1274 { $$ = cat2_str(make_str("on delete"), $3); }
1277 key_update: ON UPDATE key_action
1278 { $$ = cat2_str(make_str("on update"), $3); }
1281 key_action: NO ACTION { $$ = make_str("no action"); }
1282 | RESTRICT { $$ = make_str("restrict"); }
1283 | CASCADE { $$ = make_str("cascade"); }
1284 | SET DEFAULT { $$ = make_str("set default"); }
1285 | SET NULL_P { $$ = make_str("set null"); }
1288 OptInherit: INHERITS '(' qualified_name_list ')'
1289 { $$ = cat_str(3, make_str("inherits ("), $3, make_str(")")); }
1294 OptWithOids: WITH OIDS { $$ = make_str("with oids"); }
1295 | WITHOUT OIDS { $$ = make_str("without oids"); }
1296 | /*EMPTY*/ { $$ = EMPTY; }
1299 OnCommitOption: ON COMMIT DROP { $$ = make_str("on commit drop"); }
1300 | ON COMMIT DELETE_P ROWS { $$ = make_str("on commit delete rows"); }
1301 | ON COMMIT PRESERVE ROWS { $$ = make_str("on commit preserve rows"); }
1302 | /*EMPTY*/ { $$ = EMPTY; }
1307 * Note: CREATE TABLE ... AS SELECT ... is just another spelling for
1311 CreateAsStmt: CREATE OptTemp TABLE qualified_name OptCreateAs AS
1316 mmerror(PARSE_ERROR, ET_ERROR, "CREATE TABLE / AS SELECT may not specify INTO");
1318 $$ = cat_str(7, make_str("create"), $2, make_str("table"), $4, $5, make_str("as"), $8);
1322 OptCreateAs: '(' CreateAsList ')'
1323 { $$ = cat_str(3, make_str("("), $2, make_str(")")); }
1328 CreateAsList: CreateAsList ',' CreateAsElement
1329 { $$ = cat_str(3, $1, make_str(","), $3); }
1334 CreateAsElement: ColId { $$ = $1; }
1337 /*****************************************************************************
1340 * CREATE SEQUENCE seqname
1342 *****************************************************************************/
1344 CreateSeqStmt: CREATE OptTemp SEQUENCE qualified_name OptSeqList
1345 { $$ = cat_str(4, make_str("create sequence"), $2, $4, $5); }
1348 OptSeqList: OptSeqList OptSeqElem { $$ = cat2_str($1, $2); }
1349 | /*EMPTY*/ { $$ = EMPTY; }
1352 OptSeqElem: CACHE NumConst
1353 { $$ = cat2_str(make_str("cache"), $2); }
1355 { $$ = make_str("cycle"); }
1357 { $$ = make_str("no cycle"); }
1358 | INCREMENT opt_by NumConst
1359 { $$ = cat_str(3, make_str("increment"), $2, $3); }
1361 { $$ = cat2_str(make_str("maxvalue"), $2); }
1363 { $$ = cat2_str(make_str("minvalue"), $2); }
1365 { $$ = make_str("no maxvalue"); }
1367 { $$ = make_str("no minvalue"); }
1368 | START opt_with NumConst
1369 { $$ = cat_str(3, make_str("start"), $2, $3); }
1372 opt_by: BY { $$ = make_str("by"); }
1373 | /*EMPTY*/ { $$ = EMPTY; }
1376 /*****************************************************************************
1379 * CREATE PROCEDURAL LANGUAGE ...
1380 * DROP PROCEDURAL LANGUAGE ...
1382 *****************************************************************************/
1384 CreatePLangStmt: CREATE opt_Trusted opt_procedural LANGUAGE ColId_or_Sconst
1385 HANDLER handler_name opt_lancompiler
1386 { $$ = cat_str(8, make_str("create"), $2, $3, make_str("language"), $5, make_str("handler"), $7, $8); }
1389 opt_Trusted: TRUSTED { $$ = make_str("trusted"); }
1390 | /*EMPTY*/ { $$ = EMPTY; }
1393 /* This ought to be just func_name, but that causes reduce/reduce conflicts
1394 * (CREATE LANGUAGE is the only place where func_name isn't followed by '(').
1395 * Work around by using name and dotted_name separately.
1400 { $$ = $1; /* XXX changing soon */ }
1403 opt_lancompiler: LANCOMPILER StringConst
1404 { $$ = cat2_str(make_str("lancompiler"), $2); }
1409 DropPLangStmt: DROP opt_procedural LANGUAGE StringConst opt_drop_behavior
1410 { $$ = cat_str(5, make_str("drop"), $2, make_str("language"), $4, $5); }
1413 opt_procedural: PROCEDURAL { $$ = make_str("prcedural"); }
1414 | /*EMPTY*/ { $$ = EMPTY; }
1417 /*****************************************************************************
1420 * CREATE TRIGGER ...
1423 *****************************************************************************/
1425 CreateTrigStmt: CREATE TRIGGER name TriggerActionTime TriggerEvents ON
1426 qualified_name TriggerForSpec
1428 name '(' TriggerFuncArgs ')'
1429 { $$ = cat_str(12, make_str("create trigger"), $3, $4, $5, make_str("on"), $7, $8, make_str("execute procedure"), $11, make_str("("), $13, make_str(")")); }
1430 | CREATE CONSTRAINT TRIGGER name AFTER TriggerEvents ON
1431 qualified_name OptConstrFromTable
1432 ConstraintAttributeSpec
1433 FOR EACH ROW EXECUTE PROCEDURE
1434 func_name '(' TriggerFuncArgs ')'
1435 { $$ = cat_str(13, make_str("create constraint trigger"), $4, make_str("after"), $6, make_str("on"), $8, $9, $10, make_str("for each row execute procedure"), $16, make_str("("), $18, make_str(")")); }
1438 TriggerActionTime: BEFORE { $$ = make_str("before"); }
1439 | AFTER { $$ = make_str("after"); }
1442 TriggerEvents: TriggerOneEvent
1444 | TriggerOneEvent OR TriggerOneEvent
1445 { $$ = cat_str(3, $1, make_str("or"), $3); }
1446 | TriggerOneEvent OR TriggerOneEvent OR TriggerOneEvent
1447 { $$ = cat_str(5, $1, make_str("or"), $3, make_str("or"), $5); }
1450 TriggerOneEvent: INSERT { $$ = make_str("insert"); }
1451 | DELETE_P { $$ = make_str("delete"); }
1452 | UPDATE { $$ = make_str("update"); }
1455 TriggerForSpec: FOR TriggerForOpt TriggerForType
1456 { $$ = cat_str(3, make_str("for"), $2, $3); }
1461 TriggerForOpt: EACH { $$ = make_str("each"); }
1462 | /*EMPTY*/ { $$ = EMPTY; }
1465 TriggerForType: ROW { $$ = make_str("row"); }
1466 | STATEMENT { $$ = make_str("statement"); }
1469 TriggerFuncArgs: TriggerFuncArg
1471 | TriggerFuncArgs ',' TriggerFuncArg
1472 { $$ = cat_str(3, $1, make_str(","), $3); }
1477 TriggerFuncArg: PosAllConst { $$ = $1; }
1478 | ColId { $$ = $1; }
1481 OptConstrFromTable: /* Empty */ { $$ = EMPTY; }
1482 | FROM qualified_name { $$ = cat2_str(make_str("from"), $2); }
1485 ConstraintAttributeSpec: ConstraintDeferrabilitySpec { $$ = $1; }
1486 | ConstraintDeferrabilitySpec ConstraintTimeSpec
1488 if (strcmp($1, "deferrable") != 0 && strcmp($2, "initially deferrable") == 0 )
1489 mmerror(PARSE_ERROR, ET_ERROR, "INITIALLY DEFERRED constraint must be DEFERRABLE");
1491 $$ = cat2_str($1, $2);
1493 | ConstraintTimeSpec { $$ = $1; }
1494 | ConstraintTimeSpec ConstraintDeferrabilitySpec
1496 if (strcmp($2, "deferrable") != 0 && strcmp($1, "initially deferrable") == 0 )
1497 mmerror(PARSE_ERROR, ET_ERROR, "INITIALLY DEFERRED constraint must be DEFERRABLE");
1499 $$ = cat2_str($1, $2);
1503 ConstraintDeferrabilitySpec: NOT DEFERRABLE
1504 { $$ = make_str("not deferrable"); }
1506 { $$ = make_str("deferrable"); }
1509 ConstraintTimeSpec: INITIALLY IMMEDIATE
1510 { $$ = make_str("initially immediate"); }
1511 | INITIALLY DEFERRED
1512 { $$ = make_str("initially deferred"); }
1515 DropTrigStmt: DROP TRIGGER name ON qualified_name opt_drop_behavior
1516 { $$ = cat_str(5, make_str("drop trigger"), $3, make_str("on"), $5, $6); }
1519 /*****************************************************************************
1522 * CREATE ASSERTION ...
1523 * DROP ASSERTION ...
1525 *****************************************************************************/
1526 CreateAssertStmt: CREATE ASSERTION name
1527 CHECK '(' a_expr ')' ConstraintAttributeSpec
1529 mmerror(PARSE_ERROR, ET_ERROR, "CREATE ASSERTION is not yet supported");
1530 $$ = cat_str(6, make_str("create assertion"), $3, make_str("check ("), $6, make_str(")"), $8);
1534 DropAssertStmt: DROP ASSERTION name
1536 mmerror(PARSE_ERROR, ET_ERROR, "DROP ASSERTION is not yet supported");
1537 $$ = cat2_str(make_str("drop assertion"), $3);
1542 /*****************************************************************************
1545 * define (type,operator,aggregate)
1547 *****************************************************************************/
1549 DefineStmt: CREATE AGGREGATE func_name definition
1550 { $$ = cat_str(3, make_str("create aggregate"), $3, $4); }
1551 | CREATE OPERATOR all_Op definition
1552 { $$ = cat_str(3, make_str("create operator"), $3, $4); }
1553 | CREATE TYPE_P any_name definition
1554 { $$ = cat_str(3, make_str("create type"), $3, $4); }
1555 | CREATE TYPE_P any_name AS rowdefinition
1556 { $$ = cat_str(4, make_str("create type"), $3, make_str("as"), $5); }
1559 rowdefinition: '(' TableFuncElementList ')'
1560 { $$ = cat_str(3, make_str("("), $2, make_str(")"));}
1563 definition: '(' def_list ')'
1564 { $$ = cat_str(3, make_str("("), $2, make_str(")")); }
1567 def_list: def_elem { $$ = $1; }
1568 | def_list ',' def_elem { $$ = cat_str(3, $1, make_str(","), $3); }
1571 def_elem: ColLabel '=' def_arg { $$ = cat_str(3, $1, make_str("="), $3); }
1572 | ColLabel { $$ = $1; }
1575 /* Note: any simple identifier will be returned as a type name! */
1576 def_arg: func_return { $$ = $1; }
1577 | qual_all_Op { $$ = $1; }
1578 | AllConst { $$ = $1; }
1581 CreateOpClassStmt: CREATE OPERATOR CLASS any_name opt_default FOR TYPE_P Typename
1582 USING access_method AS opclass_item_list
1584 $$ = cat_str(9, make_str("create operator class"), $4, $5, make_str("for type"), $8, make_str("using"), $10, make_str("as"), $12);
1588 opclass_item_list: opclass_item { $$ = $1; }
1589 | opclass_item_list ',' opclass_item { $$ = cat_str(3, $1, make_str(","), $3); }
1592 opclass_item: OPERATOR PosIntConst any_operator opt_recheck
1593 { $$ = cat_str(4, make_str("operator"), $2, $3, $4); }
1594 | OPERATOR PosIntConst any_operator '(' oper_argtypes ')' opt_recheck
1595 { $$ = cat_str(7, make_str("operator"), $2, $3, make_str("("), $5, make_str(")"), $7); }
1596 | FUNCTION PosIntConst func_name func_args
1597 { $$ = cat_str(4, make_str("function"), $2, $3, $4); }
1599 { $$ = cat2_str(make_str("storage"), $2); }
1602 opt_default: DEFAULT { $$ = make_str("default"); }
1603 | /*EMPTY*/ { $$ = EMPTY; }
1606 opt_recheck: RECHECK { $$ = make_str("recheck"); }
1607 | /*EMPTY*/ { $$ = EMPTY; }
1610 DropOpClassStmt: DROP OPERATOR CLASS any_name USING access_method opt_drop_behavior
1611 { $$ = cat_str(5,make_str("drop operator class"), $4, make_str("using"), $6, $7); }
1614 /*****************************************************************************
1618 * DROP itemtype itemname [, itemname ...]
1620 *****************************************************************************/
1622 DropStmt: DROP drop_type any_name_list opt_drop_behavior
1623 { $$ = cat_str(4, make_str("drop"), $2, $3, $4); }
1626 drop_type: TABLE { $$ = make_str("table"); }
1627 | SEQUENCE { $$ = make_str("sequence"); }
1628 | VIEW { $$ = make_str("view"); }
1629 | INDEX { $$ = make_str("index"); }
1630 | TYPE_P { $$ = make_str("type"); }
1631 | DOMAIN_P { $$ = make_str("domain"); }
1632 | CONVERSION_P { $$ = make_str("conversion"); }
1633 | SCHEMA { $$ = make_str("schema"); }
1636 any_name_list: any_name
1638 | any_name_list ',' any_name
1639 { $$ = cat_str(3, $1, make_str(","), $3); }
1647 /*****************************************************************************
1650 * truncate table relname
1652 *****************************************************************************/
1653 TruncateStmt: TRUNCATE opt_table qualified_name
1654 { $$ = cat_str(3, make_str("truncate table"), $2, $3); }
1657 /*****************************************************************************
1660 * fetch/move [forward | backward] [ # | all ] [ in <portalname> ]
1661 * fetch [ forward | backward | absolute | relative ]
1662 * [ # | all | next | prior ] [ [ in | from ] <portalname> ]
1664 *****************************************************************************/
1666 FetchStmt: FETCH direction fetch_how_many from_in name ecpg_into
1667 { $$ = cat_str(5, make_str("fetch"), $2, $3, $4, $5); }
1668 | FETCH fetch_how_many from_in name ecpg_into
1669 { $$ = cat_str(4, make_str("fetch"), $2, $3, $4); }
1670 | FETCH direction from_in name ecpg_into
1671 { $$ = cat_str(4, make_str("fetch"), $2, $3, $4); }
1672 | FETCH from_in name ecpg_into
1673 { $$ = cat_str(3, make_str("fetch"), $2, $3); }
1674 | FETCH name ecpg_into
1675 { $$ = cat2_str(make_str("fetch"), $2); }
1676 | MOVE direction fetch_how_many from_in name
1677 { $$ = cat_str(5, make_str("move"), $2, $3, $4, $5); }
1678 | MOVE fetch_how_many from_in name
1679 { $$ = cat_str(4, make_str("move"), $2, $3, $4); }
1680 | MOVE direction from_in name
1681 { $$ = cat_str(4, make_str("move"), $2, $3, $4); }
1683 { $$ = cat_str(3, make_str("move"), $2, $3); }
1685 { $$ = cat2_str(make_str("move"), $2); }
1688 direction: FORWARD { $$ = make_str("forward"); }
1689 | BACKWARD { $$ = make_str("backward"); }
1690 | RELATIVE { $$ = make_str("relative"); }
1693 mmerror(PARSE_ERROR, ET_WARNING, "Currently unsupported FETCH/ABSOLUTE will be passed to backend, backend will use RELATIVE");
1694 $$ = make_str("absolute");
1698 fetch_how_many: IntConst { $$ = $1; }
1699 | ALL { $$ = make_str("all"); }
1700 | NEXT { $$ = make_str("next"); }
1701 | PRIOR { $$ = make_str("prior"); }
1704 from_in: IN_P { $$ = make_str("in"); }
1705 | FROM { $$ = make_str("from"); }
1708 /*****************************************************************************
1710 * The COMMENT ON statement can take different forms based upon the type of
1711 * the object associated with the comment. The form of the statement is:
1713 * COMMENT ON [ [ DATABASE | DOMAIN | INDEX | SEQUENCE | TABLE | TYPE | VIEW ]
1714 * <objname> | AGGREGATE <aggname> (<aggtype>) | FUNCTION
1715 * <funcname> (arg1, arg2, ...) | OPERATOR <op>
1716 * (leftoperand_typ rightoperand_typ) | TRIGGER <triggername> ON
1717 * <relname> | RULE <rulename> ON <relname> ] IS 'text'
1719 *****************************************************************************/
1720 CommentStmt: COMMENT ON comment_type name IS comment_text
1721 { $$ = cat_str(5, make_str("comment on"), $3, $4, make_str("is"), $6); }
1722 | COMMENT ON AGGREGATE func_name '(' aggr_argtype ')' IS comment_text
1723 { $$ = cat_str(6, make_str("comment on aggregate"), $4, make_str("("), $6, make_str(") is"), $9); }
1724 | COMMENT ON FUNCTION func_name func_args IS comment_text
1725 { $$ = cat_str(5, make_str("comment on function"), $4, $5, make_str("is"), $7); }
1726 | COMMENT ON OPERATOR all_Op '(' oper_argtypes ')' IS comment_text
1727 { $$ = cat_str(6, make_str("comment on operator"), $4, make_str("("), $6, make_str(") is"), $9); }
1728 | COMMENT ON TRIGGER name ON any_name IS comment_text
1729 { $$ = cat_str(6, make_str("comment on trigger"), $4, make_str("on"), $6, make_str("is"), $8); }
1730 | COMMENT ON RULE name ON any_name IS comment_text
1731 { $$ = cat_str(6, make_str("comment on rule"), $4, make_str("on"), $6, make_str("is"), $8); }
1732 | COMMENT ON RULE name IS comment_text
1733 { $$ = cat_str(4, make_str("comment on rule"), $4, make_str("is"), $6); }
1736 comment_type: COLUMN { $$ = make_str("column"); }
1737 | DATABASE { $$ = make_str("database"); }
1738 | SCHEMA { $$ = make_str("schema"); }
1739 | INDEX { $$ = make_str("idnex"); }
1740 | SEQUENCE { $$ = make_str("sequence"); }
1741 | TABLE { $$ = make_str("table"); }
1742 | DOMAIN_P { $$ = make_str("domain"); }
1743 | TYPE_P { $$ = make_str("type"); }
1744 | VIEW { $$ = make_str("view"); }
1747 comment_text: StringConst { $$ = $1; }
1748 | NULL_P { $$ = make_str("null"); }
1751 /*****************************************************************************
1754 * GRANT and REVOKE statements
1756 *****************************************************************************/
1758 GrantStmt: GRANT privileges ON privilege_target TO grantee_list opt_grant_grant_option
1759 { $$ = cat_str(7, make_str("grant"), $2, make_str("on"), $4, make_str("to"), $6, $7); }
1762 RevokeStmt: REVOKE opt_revoke_grant_option privileges ON privilege_target FROM grantee_list opt_drop_behavior
1764 $$ = cat_str(9, make_str("revoke"), $2, $3, make_str("on"), $5, make_str("from"), $7, $8);
1769 privileges: ALL PRIVILEGES { $$ = make_str("all privileges"); }
1770 | ALL { $$ = make_str("all"); }
1771 | privilege_list { $$ = $1; }
1774 privilege_list: privilege
1776 | privilege_list ',' privilege
1777 { $$ = cat_str(3, $1, make_str(","), $3); }
1780 privilege: SELECT { $$ = make_str("select"); }
1781 | INSERT { $$ = make_str("insert"); }
1782 | UPDATE { $$ = make_str("update"); }
1783 | DELETE_P { $$ = make_str("delete"); }
1784 | RULE { $$ = make_str("rule"); }
1785 | REFERENCES { $$ = make_str("references"); }
1786 | TRIGGER { $$ = make_str("trigger"); }
1787 | EXECUTE { $$ = make_str("execute"); }
1788 | USAGE { $$ = make_str("usage"); }
1789 | CREATE { $$ = make_str("create"); }
1790 | TEMPORARY { $$ = make_str("temporary"); }
1791 | TEMP { $$ = make_str("temp"); }
1794 privilege_target: qualified_name_list
1796 | TABLE qualified_name_list
1797 { $$ = cat2_str(make_str("table"), $2); }
1798 | FUNCTION function_with_argtypes_list
1799 { $$ = cat2_str(make_str("function"), $2); }
1800 | DATABASE name_list
1801 { $$ = cat2_str(make_str("database"), $2); }
1802 | LANGUAGE name_list
1803 { $$ = cat2_str(make_str("language") , $2); }
1805 { $$ = cat2_str(make_str("schema") , $2); }
1808 grantee_list: grantee
1810 | grantee_list ',' grantee
1811 { $$ = cat_str(3, $1, make_str(","), $3); }
1814 grantee: ColId { $$ = $1; }
1815 | GROUP_P ColId { $$ = cat2_str(make_str("group"), $2); }
1818 opt_grant_grant_option: WITH GRANT OPTION
1820 mmerror(PARSE_ERROR, ET_WARNING, "Currently unsupported GRANT/WITH GRANT OPTION will be passed to backend");
1821 $$ = make_str("with grant option");
1823 | /*EMPTY*/ { $$ = EMPTY; }
1826 opt_revoke_grant_option: GRANT OPTION FOR
1828 mmerror(PARSE_ERROR, ET_WARNING, "Currently unsupported REVOKE/GRANT OPTION FOR will be passed to backend");
1829 $$ = make_str("with grant option");
1831 | /*EMPTY*/ { $$ = EMPTY; }
1834 function_with_argtypes_list: function_with_argtypes
1836 | function_with_argtypes_list ',' function_with_argtypes
1837 { $$ = cat_str(3, $1, make_str(","), $3); }
1840 function_with_argtypes: func_name func_args { $$ = cat2_str($1, $2); };
1842 /*****************************************************************************
1845 * create index <indexname> on <relname>
1846 * [ using <access> ] "(" (<col> with <op>)+ ")"
1847 * [ where <predicate> ]
1849 *****************************************************************************/
1851 IndexStmt: CREATE index_opt_unique INDEX index_name ON qualified_name
1852 access_method_clause '(' index_params ')' where_clause
1853 { $$ = cat_str(11, make_str("create"), $2, make_str("index"), $4, make_str("on"), $6, $7, make_str("("), $9, make_str(")"), $11); }
1856 index_opt_unique: UNIQUE { $$ = make_str("unique"); }
1857 | /*EMPTY*/ { $$ = EMPTY; }
1860 access_method_clause: USING access_method
1861 { $$ = cat2_str(make_str("using"), $2); }
1866 index_params: index_list { $$ = $1; }
1867 | func_index { $$ = $1; }
1870 index_list: index_list ',' index_elem
1871 { $$ = cat_str(3, $1, make_str(","), $3); }
1876 func_index: func_name '(' name_list ')' opt_class
1877 { $$ = cat_str(5, $1, make_str("("), $3, ")", $5); }
1880 index_elem: attr_name opt_class
1881 { $$ = cat2_str($1, $2); }
1884 opt_class: any_name { $$ = $1; }
1885 | USING any_name { $$ = cat2_str(make_str("using"), $2); }
1886 | /*EMPTY*/ { $$ = EMPTY; }
1889 CreateFunctionStmt: CREATE opt_or_replace FUNCTION func_name func_args
1890 RETURNS func_return createfunc_opt_list opt_definition
1891 { $$ = cat_str(8, make_str("create"), $2, make_str("function"), $4, $5, make_str("returns"), $7, $8); }
1894 opt_or_replace: OR REPLACE { $$ = make_str("or replace"); }
1895 | /*EMPTY*/ { $$ = EMPTY; }
1898 func_args: '(' func_args_list ')'
1899 { $$ = cat_str(3, make_str("("), $2, make_str(")")); }
1901 { $$ = make_str("()"); }
1904 func_args_list: func_arg
1906 | func_args_list ',' func_arg
1907 { $$ = cat_str(3, $1, make_str(","), $3); }
1910 func_arg: opt_arg func_type
1912 /* We can catch over-specified arguments here if we want to,
1913 * but for now better to silently swallow typmod, etc.
1914 * - thomas 2000-03-22
1916 $$ = cat2_str($1, $2);
1918 | func_type { $$ = $1; }
1921 opt_arg: IN_P { $$ = make_str("in"); }
1924 mmerror(PARSE_ERROR, ET_WARNING, "Currently unsupported CREATE FUNCTION/OUT will be passed to backend");
1926 $$ = make_str("out");
1930 mmerror(PARSE_ERROR, ET_WARNING, "Currently unsupported CREATE FUNCTION/INOUT will be passed to backend");
1932 $$ = make_str("inout");
1936 func_as: StringConst
1938 | StringConst ',' StringConst
1939 { $$ = cat_str(3, $1, make_str(","), $3); }
1942 func_return: func_type
1944 /* We can catch over-specified arguments here if we want to,
1945 * but for now better to silently swallow typmod, etc.
1946 * - thomas 2000-03-22
1954 | type_name attrs '%' TYPE_P
1955 { $$ = cat_str(3, $1, $2, make_str("% type")); }
1959 createfunc_opt_list: createfunc_opt_item
1961 | createfunc_opt_list createfunc_opt_item
1962 { $$ = cat2_str($1, $2); }
1965 createfunc_opt_item: AS func_as
1966 { $$ = cat2_str(make_str("as"), $2); }
1967 | LANGUAGE ColId_or_Sconst
1968 { $$ = cat2_str(make_str("language"), $2); }
1970 { $$ = make_str("immutable"); }
1972 { $$ = make_str("stable"); }
1974 { $$ = make_str("volatile"); }
1975 | CALLED ON NULL_P INPUT
1976 { $$ = make_str("called on null input"); }
1977 | RETURNS NULL_P ON NULL_P INPUT
1978 { $$ = make_str("returns null on null input"); }
1980 { $$ = make_str("strict"); }
1981 | EXTERNAL SECURITY DEFINER
1982 { $$ = make_str("external security definer"); }
1983 | EXTERNAL SECURITY INVOKER
1984 { $$ = make_str("external security invoker"); }
1986 { $$ = make_str("security definer"); }
1988 { $$ = make_str("security invoker"); }
1991 opt_definition: WITH definition { $$ = cat2_str(make_str("with"), $2); }
1992 | /*EMPTY*/ { $$ = EMPTY; }
1995 /*****************************************************************************
1999 * DROP FUNCTION funcname (arg1, arg2, ...)
2000 * DROP AGGREGATE aggname (aggtype)
2001 * DROP OPERATOR opname (leftoperand_typ rightoperand_typ)
2003 *****************************************************************************/
2005 RemoveFuncStmt: DROP FUNCTION func_name func_args opt_drop_behavior
2006 { $$ = cat_str(4, make_str("drop function"), $3, $4, $5); }
2009 RemoveAggrStmt: DROP AGGREGATE func_name '(' aggr_argtype ')' opt_drop_behavior
2010 { $$ = cat_str(6, make_str("drop aggregate"), $3, make_str("("), $5, make_str(")"), $7); }
2013 aggr_argtype: Typename { $$ = $1; }
2014 | '*' { $$ = make_str("*"); }
2018 RemoveOperStmt: DROP OPERATOR all_Op '(' oper_argtypes ')' opt_drop_behavior
2019 { $$ = cat_str(6, make_str("drop operator"), $3, make_str("("), $5, make_str(")"), $7); }
2022 oper_argtypes: Typename
2023 { mmerror(PARSE_ERROR, ET_ERROR, "parser: argument type missing (use NONE for unary operators)"); }
2024 | Typename ',' Typename
2025 { $$ = cat_str(3, $1, make_str(","), $3); }
2026 | NONE ',' Typename /* left unary */
2027 { $$ = cat2_str(make_str("none,"), $3); }
2028 | Typename ',' NONE /* right unary */
2029 { $$ = cat2_str($1, make_str(", none")); }
2035 | ColId '.' any_operator
2036 { $$ = cat_str(3, $1, make_str("."), $3); }
2039 CreateCastStmt: CREATE CAST '(' Typename AS Typename ')'
2040 WITH FUNCTION function_with_argtypes cast_context
2041 { $$ = cat_str(6, make_str("create cast ("), $4, make_str("as"), $6, make_str(") with function"), $10); }
2042 | CREATE CAST '(' Typename AS Typename ')'
2043 WITHOUT FUNCTION cast_context
2044 { $$ = cat_str(6, make_str("create cast ("), $4, make_str("as"), $6, make_str(") without function"), $10); }
2047 cast_context: AS ASSIGNMENT { $$ = make_str("as assignment"); }
2048 | /*EMPTY*/ { $$ = EMPTY; }
2052 DropCastStmt: DROP CAST '(' Typename AS Typename ')' opt_drop_behavior
2053 { $$ = cat_str(6, make_str("drop cast ("), $4, make_str("as"), $6, make_str(")"), $8); }
2056 /*****************************************************************************
2060 * REINDEX type <typename> [FORCE] [ALL]
2062 *****************************************************************************/
2063 ReindexStmt: REINDEX reindex_type qualified_name opt_force
2064 { $$ = cat_str(4, make_str("reindex"), $2, $3, $4); }
2065 | REINDEX DATABASE name opt_force
2066 { $$ = cat_str(3, make_str("reindex database"), $3, $4); }
2069 reindex_type: INDEX { $$ = make_str("index"); }
2070 | TABLE { $$ = make_str("table"); }
2073 opt_force: FORCE { $$ = make_str("force"); }
2074 | /* EMPTY */ { $$ = EMPTY; }
2077 /*****************************************************************************
2080 * rename <attrname1> in <relname> [*] to <attrname2>
2081 * rename <relname1> to <relname2>
2083 *****************************************************************************/
2085 RenameStmt: ALTER TABLE relation_expr RENAME opt_column opt_name TO name
2086 { $$ = cat_str(7, make_str("alter table"), $3, make_str("rename"), $5, $6, make_str("to"), $8); }
2087 | ALTER TRIGGER name ON relation_expr RENAME TO name
2088 { $$ = cat_str(6, make_str("alter trigger"), $3, make_str("on"), $5, make_str("rename to"), $8); }
2091 opt_name: name { $$ = $1; }
2092 | /*EMPTY*/ { $$ = EMPTY; }
2095 opt_column: COLUMN { $$ = make_str("column"); }
2096 | /*EMPTY*/ { $$ = EMPTY; }
2100 /*****************************************************************************
2102 * QUERY: Define Rewrite Rule
2104 *****************************************************************************/
2106 RuleStmt: CREATE opt_or_replace RULE name AS
2108 ON event TO qualified_name where_clause
2109 DO opt_instead RuleActionList
2112 $$ = cat_str(12, make_str("create"), $2, make_str("rule"), $4, make_str("as on"), $8, make_str("to"), $10, $11, make_str("do"), $13, $14);
2116 RuleActionList: NOTHING { $$ = make_str("nothing"); }
2117 | RuleActionStmt { $$ = $1; }
2118 | '(' RuleActionMulti ')' { $$ = cat_str(3, make_str("("), $2, make_str(")")); }
2121 /* the thrashing around here is to discard "empty" statements... */
2122 RuleActionMulti: RuleActionMulti ';' RuleActionStmtOrEmpty
2123 { $$ = cat_str(3, $1, make_str(";"), $3); }
2124 | RuleActionStmtOrEmpty
2125 { $$ = cat2_str($1, make_str(";")); }
2128 RuleActionStmt: SelectStmt
2135 RuleActionStmtOrEmpty: RuleActionStmt { $$ = $1; }
2136 | /*EMPTY*/ { $$ = EMPTY; }
2139 /* change me to select, update, etc. some day */
2140 event: SELECT { $$ = make_str("select"); }
2141 | UPDATE { $$ = make_str("update"); }
2142 | DELETE_P { $$ = make_str("delete"); }
2143 | INSERT { $$ = make_str("insert"); }
2146 opt_instead: INSTEAD { $$ = make_str("instead"); }
2147 | /*EMPTY*/ { $$ = EMPTY; }
2150 DropRuleStmt: DROP RULE name ON qualified_name opt_drop_behavior
2151 { $$ = cat_str(5, make_str("drop rule"), $3, make_str("on"), $5, $6);}
2154 /*****************************************************************************
2157 * NOTIFY <qualified_name> can appear both in rule bodies and
2158 * as a query-level command
2160 *****************************************************************************/
2162 NotifyStmt: NOTIFY qualified_name
2163 { $$ = cat2_str(make_str("notify"), $2); }
2166 ListenStmt: LISTEN qualified_name
2167 { $$ = cat2_str(make_str("listen"), $2); }
2170 UnlistenStmt: UNLISTEN qualified_name
2171 { $$ = cat2_str(make_str("unlisten"), $2); }
2173 { $$ = make_str("unlisten *"); }
2177 /*****************************************************************************
2181 * BEGIN / COMMIT / ROLLBACK
2182 * (also older versions END / ABORT)
2184 *****************************************************************************/
2185 TransactionStmt: ABORT_P opt_transaction { $$ = make_str("rollback"); }
2186 | BEGIN_P opt_transaction { $$ = make_str("begin transaction"); }
2187 | START TRANSACTION transaction_mode_list_or_empty { $$ = cat2_str(make_str("start transaction"), $3); }
2188 | COMMIT opt_transaction { $$ = make_str("commit"); }
2189 | END_P opt_transaction { $$ = make_str("commit"); }
2190 | ROLLBACK opt_transaction { $$ = make_str("rollback"); }
2193 opt_transaction: WORK { $$ = EMPTY; }
2194 | TRANSACTION { $$ = EMPTY; }
2195 | /*EMPTY*/ { $$ = EMPTY; }
2198 transaction_mode_list:
2199 ISOLATION LEVEL iso_level
2200 { $$ = cat2_str(make_str("isolation level"), $3); }
2201 | transaction_access_mode
2203 | ISOLATION LEVEL iso_level transaction_access_mode
2204 { $$ = cat_str(3, make_str("isolation level"), $3, $4); }
2205 | transaction_access_mode ISOLATION LEVEL iso_level
2206 { $$ = cat_str(3, $1, make_str("isolation level"), $4); }
2209 transaction_mode_list_or_empty:
2210 transaction_mode_list { $$ = $1; }
2211 | /* EMPTY */ { $$ = EMPTY; }
2214 transaction_access_mode:
2215 READ ONLY { $$ = make_str("read only"); }
2216 | READ WRITE { $$ = make_str("read write"); }
2219 /*****************************************************************************
2222 * define view <viewname> '('target-list ')' [where <quals> ]
2224 *****************************************************************************/
2226 ViewStmt: CREATE opt_or_replace VIEW qualified_name opt_column_list AS SelectStmt
2227 { $$ = cat_str(7, make_str("create"), $2, make_str("view"), $4, $5, make_str("as"), $7); }
2231 /*****************************************************************************
2234 * load make_str("filename")
2236 *****************************************************************************/
2238 LoadStmt: LOAD file_name
2239 { $$ = cat2_str(make_str("load"), $2); }
2243 /*****************************************************************************
2248 *****************************************************************************/
2250 CreatedbStmt: CREATE DATABASE database_name WITH createdb_opt_list
2251 { $$ = cat_str(4, make_str("create database"), $3, make_str("with"), $5); }
2252 | CREATE DATABASE database_name
2253 { $$ = cat2_str(make_str("create database"), $3); }
2256 createdb_opt_list: createdb_opt_item
2258 | createdb_opt_list createdb_opt_item
2259 { $$ = cat2_str($1, $2); }
2262 createdb_opt_item: LOCATION opt_equal StringConst
2263 { $$ = cat_str(3,make_str("location"), $2, $3); }
2264 | LOCATION opt_equal DEFAULT
2265 { $$ = cat_str(3, make_str("location"), $2, make_str("default")); }
2266 | TEMPLATE opt_equal name
2267 { $$ = cat_str(3, make_str("template"), $2, $3); }
2268 | TEMPLATE opt_equal DEFAULT
2269 { $$ = cat_str(3, make_str("template"), $2, make_str("default")); }
2270 | ENCODING opt_equal PosIntStringConst
2271 { $$ = cat_str(3, make_str("encoding"), $2, $3); }
2272 | ENCODING opt_equal DEFAULT
2273 { $$ = cat_str(3, make_str("encoding"), $2, make_str("default")); }
2274 | OWNER opt_equal name
2275 { $$ = cat_str(3, make_str("owner"), $2, $3); }
2276 | OWNER opt_equal DEFAULT
2277 { $$ = cat_str(3, make_str("owner"), $2, make_str("default")); }
2280 opt_equal: '=' { $$ = make_str("="); }
2281 | /* EMPTY */ { $$ = EMPTY; }
2285 /*****************************************************************************
2290 *****************************************************************************/
2292 AlterDatabaseSetStmt: ALTER DATABASE database_name SET set_rest
2293 { $$ = cat_str(4, make_str("alter database"), $3, make_str("set"), $5); }
2294 | ALTER DATABASE database_name VariableResetStmt
2295 { $$ = cat_str(3, make_str("alter database"), $3, $4); }
2298 /*****************************************************************************
2303 *****************************************************************************/
2305 DropdbStmt: DROP DATABASE database_name
2306 { $$ = cat2_str(make_str("drop database"), $3); }
2310 /*****************************************************************************
2312 * Manipulate a domain
2314 *****************************************************************************/
2316 CreateDomainStmt: CREATE DOMAIN_P any_name opt_as Typename ColQualList opt_collate
2318 $$ = cat_str(6, make_str("create domain"), $3, $4, $5, $6, $7);
2323 ALTER DOMAIN_P any_name alter_column_default
2324 { $$ = cat_str(3, make_str("alter domain"), $3, $4); }
2325 | ALTER DOMAIN_P any_name DROP NOT NULL_P
2326 { $$ = cat_str(3, make_str("alter domain"), $3, make_str("drop not null")); }
2327 | ALTER DOMAIN_P any_name SET NOT NULL_P
2328 { $$ = cat_str(3, make_str("alter domain"), $3, make_str("set not null")); }
2329 | ALTER DOMAIN_P any_name ADD TableConstraint
2330 { $$ = cat_str(4, make_str("alter domain"), $3, make_str("add"), $5); }
2331 | ALTER DOMAIN_P any_name DROP CONSTRAINT name opt_drop_behavior
2332 { $$ = cat_str(5, make_str("alter domain"), $3, make_str("drop constraint"), $6, $7); }
2333 | ALTER DOMAIN_P any_name OWNER TO UserId
2334 { $$ = cat_str(4, make_str("alter domain"), $3, make_str("owner to"), $6); }
2337 opt_as: AS {$$ = make_str("as"); }
2338 | /* EMPTY */ {$$ = EMPTY; }
2341 CreateConversionStmt:
2342 CREATE opt_default CONVERSION_P any_name FOR StringConst
2343 TO StringConst FROM any_name
2344 { $$ = cat_str(10, make_str("create"), $2, make_str("conversion"), $4, make_str("for"), $6, make_str("to"), $8, make_str("from"), $10); }
2347 /*****************************************************************************
2350 * cluster <index_name> on <qualified_name>
2351 * cluster <qualified_name>
2354 *****************************************************************************/
2356 ClusterStmt: CLUSTER index_name ON qualified_name
2357 { $$ = cat_str(4, make_str("cluster"), $2, make_str("on"), $4); }
2358 | CLUSTER qualified_name
2359 { $$ = cat2_str(make_str("cluster"), $2); }
2361 { $$ = make_str("cluster"); }
2365 /*****************************************************************************
2371 *****************************************************************************/
2373 VacuumStmt: VACUUM opt_full opt_freeze opt_verbose
2374 { $$ = cat_str(4, make_str("vacuum"), $2, $3, $4); }
2375 | VACUUM opt_full opt_freeze opt_verbose qualified_name
2376 { $$ = cat_str(5, make_str("vacuum"), $2, $3, $4, $5); }
2377 | VACUUM opt_full opt_freeze opt_verbose AnalyzeStmt
2378 { $$ = cat_str(5, make_str("vacuum"), $2, $3, $4, $5); }
2381 AnalyzeStmt: analyze_keyword opt_verbose
2382 { $$ = cat_str(2, $1, $2); }
2383 | analyze_keyword opt_verbose qualified_name opt_name_list
2384 { $$ = cat_str(4, $1, $2, $3, $4); }
2387 analyze_keyword: ANALYZE { $$ = make_str("analyze"); }
2388 | ANALYSE { $$ = make_str("analyse"); }
2391 opt_verbose: VERBOSE { $$ = make_str("verbose"); }
2392 | /*EMPTY*/ { $$ = EMPTY; }
2395 opt_full: FULL { $$ = make_str("full"); }
2396 | /*EMPTY*/ { $$ = EMPTY; }
2399 opt_freeze: FREEZE { $$ = make_str("freeze"); }
2400 | /*EMPTY*/ { $$ = EMPTY; }
2403 opt_name_list: '(' name_list ')'
2404 { $$ = cat_str(3, make_str("("), $2, make_str(")")); }
2410 /*****************************************************************************
2415 *****************************************************************************/
2417 ExplainStmt: EXPLAIN opt_analyze opt_verbose OptimizableStmt
2418 { $$ = cat_str(4, make_str("explain"), $2, $3, $4); }
2419 /* | EXPLAIN opt_analyze opt_verbose ExecuteStmt
2420 { $$ = cat_str(4, make_str("explain"), $2, $3, $4); }*/
2424 analyze_keyword { $$ = $1; }
2425 | /* EMPTY */ { $$ = EMPTY; }
2432 PrepareStmt: PREPARE name prep_type_clause AS OptimizableStmt
2433 { $$ = cat_str(5, make_str("prepare"), $2, $3, make_str("as"), $5); }
2436 prep_type_clause: '(' prep_type_list ')' { $$ = cat_str(3, make_str("("), $2, make_str(")")); }
2437 | /* EMPTY * / { $$ = EMPTY; }
2440 prep_type_list: Typename { $$ = $1; }
2441 | prep_type_list ',' Typename { $$ = cat_str(3, $1, make_str(","), $3); }
2444 ExecuteStmt: EXECUTE name execute_param_clause into_clause
2445 { $$ = cat_str(4, make_str("execute"), $2, $3, $4); }
2448 execute_param_clause: '(' expr_list ')' { $$ = cat_str(3, make_str("("), $2, make_str(")")); }
2449 | /* EMPTY * / { $$ = EMPTY; }
2452 DeallocateStmt: DEALLOCATE name { $$ = cat2_str(make_str("deallocate"), $2); }
2453 | DEALLOCATE PREPARE name { $$ = cat2_str(make_str("deallocate prepare"), $3); }
2457 /*****************************************************************************
2459 * Optimizable Stmts: *
2461 * one of the five queries processed by the planner *
2463 * [ultimately] produces query-trees as specified *
2464 * in the query-spec document in ~postgres/ref *
2466 *****************************************************************************/
2468 OptimizableStmt: SelectStmt
2476 /*****************************************************************************
2481 *****************************************************************************/
2483 InsertStmt: INSERT INTO qualified_name insert_rest
2484 { $$ = cat_str(3, make_str("insert into"), $3, $4); }
2487 insert_rest: VALUES '(' insert_target_list ')'
2488 { $$ = cat_str(3, make_str("values("), $3, make_str(")")); }
2490 { $$ = make_str("default values"); }
2493 | '(' insert_column_list ')' VALUES '(' insert_target_list ')'
2494 { $$ = cat_str(5, make_str("("), $2, make_str(") values ("), $6, make_str(")")); }
2495 | '(' insert_column_list ')' SelectStmt
2496 { $$ = cat_str(4, make_str("("), $2, make_str(")"), $4); }
2499 insert_column_list: insert_column_list ',' insert_column_item
2500 { $$ = cat_str(3, $1, make_str(","), $3); }
2501 | insert_column_item
2505 insert_column_item: ColId opt_indirection
2506 { $$ = cat2_str($1, $2); }
2510 /*****************************************************************************
2515 *****************************************************************************/
2517 DeleteStmt: DELETE_P FROM relation_expr where_clause
2518 { $$ = cat_str(3, make_str("delete from"), $3, $4); }
2521 LockStmt: LOCK_P opt_table qualified_name_list opt_lock
2522 { $$ = cat_str(4, make_str("lock"), $2, $3, $4); }
2525 opt_lock: IN_P lock_type MODE
2526 { $$ = cat_str(3, make_str("in"), $2, make_str("mode")); }
2531 lock_type: ACCESS SHARE { $$ = make_str("access share"); }
2532 | ROW SHARE { $$ = make_str("access share"); }
2533 | ROW EXCLUSIVE { $$ = make_str("row exclusive"); }
2534 | SHARE UPDATE EXCLUSIVE { $$ = make_str("share update exclusive"); }
2535 | SHARE { $$ = make_str("share"); }
2536 | SHARE ROW EXCLUSIVE { $$ = make_str("share row exclusive"); }
2537 | EXCLUSIVE { $$ = make_str("exclusive"); }
2538 | ACCESS EXCLUSIVE { $$ = make_str("access exclusive"); }
2541 /*****************************************************************************
2544 * UpdateStmt (UPDATE)
2546 *****************************************************************************/
2548 UpdateStmt: UPDATE relation_expr
2549 SET update_target_list
2552 {$$ = cat_str(6, make_str("update"), $2, make_str("set"), $4, $5, $6); }
2556 /*****************************************************************************
2561 *****************************************************************************/
2562 CursorStmt: DECLARE name opt_cursor CURSOR FOR SelectStmt
2564 struct cursor *ptr, *this;
2566 for (ptr = cur; ptr != NULL; ptr = ptr->next)
2568 if (strcmp($2, ptr->name) == 0)
2570 /* re-definition is a bug */
2571 snprintf(errortext, sizeof(errortext), "cursor %s already defined", $2);
2572 mmerror(PARSE_ERROR, ET_ERROR, errortext);
2576 this = (struct cursor *) mm_alloc(sizeof(struct cursor));
2578 /* initial definition */
2581 this->connection = connection;
2582 this->command = cat_str(5, make_str("declare"), mm_strdup($2), $3, make_str("cursor for"), $6);
2583 this->argsinsert = argsinsert;
2584 this->argsresult = argsresult;
2585 argsinsert = argsresult = NULL;
2589 $$ = cat_str(3, make_str("/*"), mm_strdup(this->command), make_str("*/"));
2593 opt_cursor: BINARY { $$ = make_str("binary"); }
2594 | INSENSITIVE { $$ = make_str("insensitive"); }
2595 | SCROLL { $$ = make_str("scroll"); }
2596 | INSENSITIVE SCROLL { $$ = make_str("insensitive scroll"); }
2597 | /*EMPTY*/ { $$ = EMPTY; }
2600 /*****************************************************************************
2605 *****************************************************************************/
2607 SelectStmt: select_no_parens %prec UMINUS
2609 | select_with_parens %prec UMINUS
2613 select_with_parens: '(' select_no_parens ')'
2614 { $$ = cat_str(3, make_str("("), $2, make_str(")")); }
2615 | '(' select_with_parens ')'
2616 { $$ = cat_str(3, make_str("("), $2, make_str(")")); }
2619 select_no_parens: simple_select
2621 | select_clause sort_clause
2622 { $$ = cat2_str($1, $2); }
2623 | select_clause opt_sort_clause for_update_clause opt_select_limit
2624 { $$ = cat_str(4, $1, $2, $3, $4); }
2625 | select_clause opt_sort_clause select_limit opt_for_update_clause
2626 { $$ = cat_str(4, $1, $2, $3, $4); }
2629 select_clause: simple_select { $$ = $1; }
2630 | select_with_parens { $$ = $1; }
2633 simple_select: SELECT opt_distinct target_list
2634 into_clause from_clause where_clause
2635 group_clause having_clause
2636 { $$ = cat_str(8, make_str("select"), $2, $3, $4, $5, $6, $7, $8); }
2637 | select_clause UNION opt_all select_clause
2638 { $$ = cat_str(4, $1, make_str("union"), $3, $4); }
2639 | select_clause INTERSECT opt_all select_clause
2640 { $$ = cat_str(4, $1, make_str("intersect"), $3, $4); }
2641 | select_clause EXCEPT opt_all select_clause
2642 { $$ = cat_str(4, $1, make_str("except"), $3, $4); }
2645 into_clause: INTO OptTempTableName
2648 $$= cat2_str(make_str("into"), $2);
2650 | ecpg_into { $$ = EMPTY; }
2651 | /*EMPTY*/ { $$ = EMPTY; }
2655 * Redundancy here is needed to avoid shift/reduce conflicts,
2656 * since TEMP is not a reserved word. See also OptTemp.
2658 * The result is a cons cell (not a true list!) containing
2659 * a boolean and a table name.
2661 OptTempTableName: TEMPORARY opt_table qualified_name
2662 { $$ = cat_str(3, make_str("temporary"), $2, $3); }
2663 | TEMP opt_table qualified_name
2664 { $$ = cat_str(3, make_str("temp"), $2, $3); }
2665 | LOCAL TEMPORARY opt_table qualified_name
2666 { $$ = cat_str(3, make_str("local temporary"), $3, $4); }
2667 | LOCAL TEMP opt_table qualified_name
2668 { $$ = cat_str(3, make_str("local temp"), $3, $4); }
2669 | GLOBAL TEMPORARY opt_table qualified_name
2671 mmerror(PARSE_ERROR, ET_WARNING, "Currently unsupported CREATE TABLE / GLOBAL TEMPORARY will be passed to backend");
2672 $$ = cat_str(3, make_str("global temporary"), $3, $4);
2674 | GLOBAL TEMP opt_table qualified_name
2676 mmerror(PARSE_ERROR, ET_WARNING, "Currently unsupported CREATE TABLE / GLOBAL TEMP will be passed to backend");
2677 $$ = cat_str(3, make_str("global temp"), $3, $4);
2679 | TABLE qualified_name
2680 { $$ = cat2_str(make_str("table"), $2); }
2685 opt_table: TABLE { $$ = make_str("table"); }
2686 | /*EMPTY*/ { $$ = EMPTY; }
2689 opt_all: ALL { $$ = make_str("all"); }
2690 | /*EMPTY*/ { $$ = EMPTY; }
2693 opt_distinct: DISTINCT
2694 { $$ = make_str("distinct"); }
2695 | DISTINCT ON '(' expr_list ')'
2696 { $$ = cat_str(3, make_str("distinct on ("), $4, make_str(")")); }
2698 { $$ = make_str("all"); }
2703 opt_sort_clause: sort_clause { $$ = $1; }
2704 | /* EMPTY */ { $$ = EMPTY; }
2707 sort_clause: ORDER BY sortby_list
2708 { $$ = cat2_str(make_str("order by"), $3); }
2711 sortby_list: sortby { $$ = $1; }
2712 | sortby_list ',' sortby { $$ = cat_str(3, $1, make_str(","), $3); }
2715 sortby: a_expr OptUseOp
2716 { $$ = cat2_str($1, $2); }
2719 OptUseOp: USING all_Op { $$ = cat2_str(make_str("using"), $2); }
2720 | ASC { $$ = make_str("asc"); }
2721 | DESC { $$ = make_str("desc"); }
2722 | /*EMPTY*/ { $$ = EMPTY; }
2725 select_limit: LIMIT select_limit_value OFFSET select_offset_value
2726 { $$ = cat_str(4, make_str("limit"), $2, make_str("offset"), $4); }
2727 | OFFSET select_offset_value LIMIT select_limit_value
2728 { $$ = cat_str(4, make_str("offset"), $2, make_str("limit"), $4); }
2729 | LIMIT select_limit_value
2730 { $$ = cat2_str(make_str("limit"), $2); }
2731 | OFFSET select_offset_value
2732 { $$ = cat2_str(make_str("offset"), $2); }
2733 | LIMIT select_limit_value ',' select_offset_value
2734 { mmerror(PARSE_ERROR, ET_WARNING, "No longer supported LIMIT #,# syntax passed to backend."); }
2737 opt_select_limit: select_limit { $$ = $1; }
2738 | /*EMPTY*/ { $$ = EMPTY; }
2741 select_limit_value: PosIntConst
2744 mmerror(PARSE_ERROR, ET_ERROR, "LIMIT must not be negative");
2747 | ALL { $$ = make_str("all"); }
2748 | PARAM { $$ = make_name(); }
2751 select_offset_value: PosIntConst
2754 mmerror(PARSE_ERROR, ET_ERROR, "OFFSET must not be negative");
2757 | PARAM { $$ = make_name(); }
2761 * jimmy bell-style recursive queries aren't supported in the
2764 * ...however, recursive addattr and rename supported. make special
2767 group_clause: GROUP_P BY expr_list
2768 { $$ = cat2_str(make_str("group by"), $3); }
2773 having_clause: HAVING a_expr
2774 { $$ = cat2_str(make_str("having"), $2); }
2779 for_update_clause: FOR UPDATE update_list
2780 { $$ = make_str("for update"); }
2782 { $$ = make_str("for read only"); }
2785 opt_for_update_clause: for_update_clause { $$ = $1; }
2786 | /* EMPTY */ { $$ = EMPTY; }
2789 update_list: OF name_list { $$ = cat2_str(make_str("of"), $2); }
2790 | /* EMPTY */ { $$ = EMPTY; }
2793 /*****************************************************************************
2795 * clauses common to all Optimizable Stmts:
2796 * from_clause - allow list of both JOIN expressions and table names
2797 * where_clause - qualifications for joins or restrictions
2799 *****************************************************************************/
2801 from_clause: FROM from_list { $$ = cat2_str(make_str("from"), $2); }
2802 | /* EMPTY */ { $$ = EMPTY; }
2805 from_list: from_list ',' table_ref { $$ = cat_str(3, $1, make_str(","), $3); }
2806 | table_ref { $$ = $1; }
2810 * table_ref is where an alias clause can be attached. Note we cannot make
2811 * alias_clause have an empty production because that causes parse conflicts
2812 * between table_ref := '(' joined_table ')' alias_clause
2813 * and joined_table := '(' joined_table ')'. So, we must have the
2814 * redundant-looking productions here instead.
2816 table_ref: relation_expr
2818 | relation_expr alias_clause
2819 { $$= cat2_str($1, $2); }
2822 | func_table alias_clause
2823 { $$= cat2_str($1, $2); }
2824 | func_table AS '(' TableFuncElementList ')'
2825 { $$=cat_str(4, $1, make_str("as ("), $4, make_str(")")); }
2826 | func_table AS ColId '(' TableFuncElementList ')'
2827 { $$=cat_str(6, $1, make_str("as"), $3, make_str("("), $5, make_str(")")); }
2828 | func_table ColId '(' TableFuncElementList ')'
2829 { $$=cat_str(5, $1, $2, make_str("("), $4, make_str(")")); }
2830 | select_with_parens
2831 {mmerror(PARSE_ERROR, ET_ERROR, "sub-SELECT in FROM must have an alias");}
2832 | select_with_parens alias_clause
2833 { $$=cat2_str($1, $2); }
2836 | '(' joined_table ')' alias_clause
2837 { $$=cat_str(4, make_str("("), $2, make_str(")"), $4); }
2841 * It may seem silly to separate joined_table from table_ref, but there is
2842 * method in SQL92's madness: if you don't do it this way you get reduce-
2843 * reduce conflicts, because it's not clear to the parser generator whether
2844 * to expect alias_clause after ')' or not. For the same reason we must
2845 * treat 'JOIN' and 'join_type JOIN' separately, rather than allowing
2846 * join_type to expand to empty; if we try it, the parser generator can't
2847 * figure out when to reduce an empty join_type right after table_ref.
2849 * Note that a CROSS JOIN is the same as an unqualified
2850 * INNER JOIN, and an INNER JOIN/ON has the same shape
2851 * but a qualification expression to limit membership.
2852 * A NATURAL JOIN implicitly matches column names between
2853 * tables and the shape is determined by which columns are
2854 * in common. We'll collect columns during the later transformations.
2857 joined_table: '(' joined_table ')'
2858 { $$ = cat_str(3, make_str("("), $2, make_str(")")); }
2859 | table_ref CROSS JOIN table_ref
2860 { $$ = cat_str(3, $1, make_str("cross join"), $4); }
2861 | table_ref UNIONJOIN table_ref
2862 { $$ = cat_str(3, $1, make_str("unionjoin"), $3); }
2863 | table_ref join_type JOIN table_ref join_qual
2864 { $$ = cat_str(5, $1, $2, make_str("join"), $4, $5); }
2865 | table_ref JOIN table_ref join_qual
2866 { $$ = cat_str(4, $1, make_str("join"), $3, $4); }
2867 | table_ref NATURAL join_type JOIN table_ref
2868 { $$ = cat_str(5, $1, make_str("natural"), $3, make_str("join"), $5); }
2869 | table_ref NATURAL JOIN table_ref
2870 { $$ = cat_str(3, $1, make_str("natural join"), $4); }
2873 alias_clause: AS ColId '(' name_list ')'
2874 { $$ = cat_str(5, make_str("as"), $2, make_str("("), $4, make_str(")")); }
2876 { $$ = cat2_str(make_str("as"), $2); }
2877 | ColId '(' name_list ')'
2878 { $$ = cat_str(4, $1, make_str("("), $3, make_str(")")); }
2883 join_type: FULL join_outer { $$ = cat2_str(make_str("full"), $2); }
2884 | LEFT join_outer { $$ = cat2_str(make_str("left"), $2); }
2885 | RIGHT join_outer { $$ = cat2_str(make_str("right"), $2); }
2886 | INNER_P { $$ = make_str("inner"); }
2889 /* OUTER is just noise... */
2890 join_outer: OUTER_P { $$ = make_str("outer"); }
2891 | /*EMPTY*/ { $$ = EMPTY; /* no qualifiers */ }
2894 /* JOIN qualification clauses
2895 * Possibilities are:
2896 * USING ( column list ) allows only unqualified column names,
2897 * which must match between tables.
2898 * ON expr allows more general qualifications.
2901 join_qual: USING '(' name_list ')'
2902 { $$ = cat_str(3, make_str("using ("), $3, make_str(")")); }
2904 { $$ = cat2_str(make_str("on"), $2); }
2907 relation_expr: qualified_name
2908 { /* normal relations */ $$ = $1; }
2909 | qualified_name '*'
2910 { /* inheritance query */ $$ = cat2_str($1, make_str("*")); }
2911 | ONLY qualified_name
2912 { /* inheritance query */ $$ = cat2_str(make_str("only "), $2); }
2913 | ONLY '(' qualified_name ')'
2914 { /* inheritance query */ $$ = cat_str(3, make_str("only ("), $3, make_str(")")); }
2917 func_table: func_name '(' ')'
2918 { $$ = cat2_str($1, make_str("()")); }
2919 | func_name '(' expr_list ')'
2920 { $$ = cat_str(4, $1, make_str("("), $3, make_str(")")); }
2923 where_clause: WHERE a_expr { $$ = cat2_str(make_str("where"), $2); }
2924 | /*EMPTY*/ { $$ = EMPTY; /* no qualifiers */ }
2927 TableFuncElementList: TableFuncElement
2929 | TableFuncElementList ',' TableFuncElement
2930 { $$ = cat_str(3, $1, ',', $3); }
2933 TableFuncElement: ColId Typename { $$ = cat2_str($1, $2); }
2936 /*****************************************************************************
2939 * SQL92 introduces a large amount of type-specific syntax.
2940 * Define individual clauses to handle these cases, and use
2941 * the generic case to handle regular type-extensible Postgres syntax.
2942 * - thomas 1997-10-10
2944 *****************************************************************************/
2946 Typename: SimpleTypename opt_array_bounds
2947 { $$ = cat2_str($1, $2.str); }
2948 | SETOF SimpleTypename opt_array_bounds
2949 { $$ = cat_str(3, make_str("setof"), $2, $3); }
2953 opt_array_bounds: '[' ']' opt_array_bounds
2956 $$.index2 = $3.index1;
2957 $$.str = cat2_str(make_str("[]"), $3.str);
2959 | '[' Iresult ']' opt_array_bounds
2961 char *txt = mm_alloc(20L);
2963 sprintf (txt, "%d", $2);
2965 $$.index2 = $4.index1;
2966 $$.str = cat_str(4, make_str("["), txt, make_str("]"), $4.str);
2976 Iresult: PosIntConst { $$ = atol($1); }
2977 | '(' Iresult ')' { $$ = $2; }
2978 | Iresult '+' Iresult { $$ = $1 + $3; }
2979 | Iresult '-' Iresult { $$ = $1 - $3; }
2980 | Iresult '*' Iresult { $$ = $1 * $3; }
2981 | Iresult '/' Iresult { $$ = $1 / $3; }
2982 | Iresult '%' Iresult { $$ = $1 % $3; }
2985 SimpleTypename: GenericType { $$ = $1; }
2986 | ConstDatetime { $$ = $1; }
2987 | Numeric { $$ = $1; }
2989 | Character { $$ = $1; }
2990 | ConstInterval opt_interval
2991 { $$ = cat2_str($1, $2); }
2992 | ConstInterval '(' PosIntConst ')' opt_interval
2993 { $$ = cat_str(5, $1, make_str("("), $3, make_str(")"), $5); }
2995 { $$ = cat2_str($1, $2);}
2998 ConstTypename: GenericType { $$ = $1; }
2999 | ConstDatetime { $$ = $1; }
3000 | Numeric { $$ = $1; }
3001 | ConstBit { $$ = $1; }
3002 | ConstCharacter { $$ = $1; }
3005 GenericType: type_name { $$ = $1; }
3008 /* SQL92 numeric data types
3009 * Check FLOAT() precision limits assuming IEEE floating types.
3010 * Provide real DECIMAL() and NUMERIC() implementations now - Jan 1998-12-30
3011 * - thomas 1997-09-18
3014 { $$ = make_str("int"); }
3016 { $$ = make_str("integer"); }
3018 { $$ = make_str("smallint"); }
3020 { $$ = make_str("bigint"); }
3022 { $$ = make_str("real"); }
3024 { $$ = cat2_str(make_str("float"), $2); }
3026 { $$ = make_str("double precision"); }
3027 | DECIMAL opt_decimal
3028 { $$ = cat2_str(make_str("decimal"), $2); }
3030 { $$ = cat2_str(make_str("dec"), $2); }
3031 | NUMERIC opt_numeric
3032 { $$ = cat2_str(make_str("numeric"), $2); }
3034 { $$ = make_str("boolean"); }
3037 opt_float: '(' PosIntConst ')'
3038 { $$ = cat_str(3, make_str("("), $2, make_str(")")); }
3043 opt_numeric: '(' PosIntConst ',' PosIntConst ')'
3044 { $$ = cat_str(5, make_str("("), $2, make_str(","), $4, make_str(")")); }
3045 | '(' PosIntConst ')'
3046 { $$ = cat_str(3, make_str("("), $2, make_str(")")); }
3051 opt_decimal: '(' PosIntConst ',' PosIntConst ')'
3052 { $$ = cat_str(5, make_str("("), $2, make_str(","), $4, make_str(")")); }
3053 | '(' PosIntConst ')'
3054 { $$ = cat_str(3, make_str("("), $2, make_str(")")); }
3060 * SQL92 bit-field data types
3061 * The following implements BIT() and BIT VARYING().
3064 Bit: BitWithLength { $$ = $1; }
3065 | BitWithoutLength { $$ = $1; }
3068 ConstBit: BitWithLength { $$ = $1; }
3069 | BitWithoutLength { $$ = $1; }
3072 BitWithLength: BIT opt_varying '(' PosIntConst ')'
3073 { $$ = cat_str(5, make_str("bit"), $2, make_str("("), $4, make_str(")")); }
3076 BitWithoutLength: BIT opt_varying
3077 { $$ = cat2_str(make_str("bit"), $2); }
3081 * SQL92 character data types
3082 * The following implements CHAR() and VARCHAR().
3085 Character: CharacterWithLength { $$ = $1; }
3086 | CharacterWithoutLength { $$ = $1; }
3089 ConstCharacter: CharacterWithLength { $$ = $1; }
3090 | CharacterWithoutLength { $$ = $1; }
3093 CharacterWithLength: character '(' PosIntConst ')' opt_charset
3094 { $$ = cat_str(5, $1, make_str("("), $3, make_str(")"), $5); }
3097 CharacterWithoutLength: character opt_charset
3098 { $$ = cat2_str($1, $2); }
3101 character: CHARACTER opt_varying
3102 { $$ = cat2_str(make_str("character"), $2); }
3103 | CHAR_P opt_varying
3104 { $$ = cat2_str(make_str("char"), $2); }
3106 { $$ = make_str("varchar"); }
3107 | NATIONAL CHARACTER opt_varying
3108 { $$ = cat2_str(make_str("national character"), $3); }
3109 | NATIONAL CHAR_P opt_varying
3110 { $$ = cat2_str(make_str("national char"), $3); }
3112 { $$ = cat2_str(make_str("nchar"), $2); }
3115 opt_varying: VARYING
3116 { $$ = make_str("varying"); }
3121 opt_charset: CHARACTER SET ColId
3122 { $$ = cat2_str(make_str("character set"), $3); }
3127 opt_collate: COLLATE ColId
3128 { $$ = cat2_str(make_str("collate"), $2); }
3133 ConstDatetime: TIMESTAMP '(' PosIntConst ')' opt_timezone
3134 { $$ = cat_str(4, make_str("timestamp("), $3, make_str(")"), $5); }
3135 | TIMESTAMP opt_timezone
3136 { $$ = cat2_str(make_str("timestamp"), $2); }
3137 | TIME '(' PosIntConst ')' opt_timezone
3138 { $$ = cat_str(4, make_str("time("), $3, make_str(")"), $5); }
3140 { $$ = cat2_str(make_str("time"), $2); }
3143 ConstInterval: INTERVAL
3144 { $$ = make_str("interval"); }
3147 opt_timezone: WITH TIME ZONE
3148 { $$ = make_str("with time zone"); }
3150 { $$ = make_str("without time zone"); }
3155 opt_interval: YEAR_P { $$ = make_str("year"); }
3156 | MONTH_P { $$ = make_str("month"); }
3157 | DAY_P { $$ = make_str("day"); }
3158 | HOUR_P { $$ = make_str("hour"); }
3159 | MINUTE_P { $$ = make_str("minute"); }
3160 | SECOND_P { $$ = make_str("second"); }
3161 | YEAR_P TO MONTH_P { $$ = make_str("year to month"); }
3162 | DAY_P TO HOUR_P { $$ = make_str("day to hour"); }
3163 | DAY_P TO MINUTE_P { $$ = make_str("day to minute"); }
3164 | DAY_P TO SECOND_P { $$ = make_str("day to second"); }
3165 | HOUR_P TO MINUTE_P { $$ = make_str("hour to minute"); }
3166 | MINUTE_P TO SECOND_P { $$ = make_str("minute to second"); }
3167 | HOUR_P TO SECOND_P { $$ = make_str("hour to second"); }
3168 | /*EMPTY*/ { $$ = EMPTY; }
3172 /*****************************************************************************
3174 * expression grammar
3176 *****************************************************************************/
3178 /* Expressions using row descriptors
3179 * Define row_descriptor to allow yacc to break the reduce/reduce conflict
3180 * with singleton expressions.
3182 r_expr: row IN_P select_with_parens
3183 { $$ = cat_str(3, $1, make_str("in"), $3); }
3184 | row NOT IN_P select_with_parens
3185 { $$ = cat_str(3, $1, make_str("not in"), $4); }
3186 | row qual_all_Op sub_type select_with_parens %prec Op
3187 { $$ = cat_str(4, $1, $2, $3, $4); }
3188 | row qual_all_Op select_with_parens %prec Op
3189 { $$ = cat_str(3, $1, $2, $3); }
3190 | row qual_all_Op row %prec Op
3191 { $$ = cat_str(3, $1, $2, $3); }
3193 { $$ = cat2_str($1, make_str("is null")); }
3195 { $$ = cat2_str($1, make_str("is not null")); }
3197 { $$ = cat_str(3, $1, make_str("overlaps"), $3); }
3198 | row IS DISTINCT FROM row %prec IS
3199 { $$ = cat_str(3, $1, make_str("is distinct from"), $5); }
3202 row: ROW '(' row_descriptor ')'
3203 { $$ = cat_str(3, make_str("row ("), $3, make_str(")")); }
3204 | ROW '(' a_expr ')'
3205 { $$ = cat_str(3, make_str("row ("), $3, make_str(")")); }
3207 { $$ = make_str("row()"); }
3208 | '(' row_descriptor ')'
3209 { $$ = cat_str(3, make_str("("), $2, make_str(")")); }
3212 row_descriptor: expr_list ',' a_expr
3213 { $$ = cat_str(3, $1, make_str(","), $3); }
3216 sub_type: ANY { $$ = make_str("ANY"); }
3217 | SOME { $$ = make_str("SOME"); }
3218 | ALL { $$ = make_str("ALL"); }
3221 all_Op: Op { $$ = $1; }
3222 | MathOp { $$ = $1; }
3225 MathOp: '+' { $$ = make_str("+"); }
3226 | '-' { $$ = make_str("-"); }
3227 | '*' { $$ = make_str("*"); }
3228 | '%' { $$ = make_str("%"); }
3229 | '^' { $$ = make_str("^"); }
3230 | '/' { $$ = make_str("/"); }
3231 | '<' { $$ = make_str("<"); }
3232 | '>' { $$ = make_str(">"); }
3233 | '=' { $$ = make_str("="); }
3236 qual_Op: Op { $$ = $1; }
3237 | OPERATOR '(' any_operator ')' { $$ = cat_str(3, make_str("operator ("), $3, make_str(")")); }
3240 qual_all_Op: all_Op { $$ = $1; }
3241 | OPERATOR '(' any_operator ')' { $$ = cat_str(3, make_str("operator ("), $3, make_str(")")); }
3244 /* General expressions
3245 * This is the heart of the expression syntax.
3247 * We have two expression types: a_expr is the unrestricted kind, and
3248 * b_expr is a subset that must be used in some places to avoid shift/reduce
3249 * conflicts. For example, we can't do BETWEEN as "BETWEEN a_expr AND a_expr"
3250 * because that use of AND conflicts with AND as a boolean operator. So,
3251 * b_expr is used in BETWEEN and we remove boolean keywords from b_expr.
3253 * Note that '(' a_expr ')' is a b_expr, so an unrestricted expression can
3254 * always be used by surrounding it with parens.
3256 * c_expr is all the productions that are common to a_expr and b_expr;
3257 * it's factored out just to eliminate redundant coding.
3262 | a_expr TYPECAST Typename
3263 { $$ = cat_str(3, $1, make_str("::"), $3); }
3264 | a_expr AT TIME ZONE c_expr
3265 { $$ = cat_str(3, $1, make_str("at time zone"), $5); }
3267 * These operators must be called out explicitly in order to make use
3268 * of yacc/bison's automatic operator-precedence handling. All other
3269 * operator names are handled by the generic productions using "Op",
3270 * below; and all those operators will have the same precedence.
3272 * If you add more explicitly-known operators, be sure to add them
3273 * also to b_expr and to the MathOp list above.
3275 | '+' a_expr %prec UMINUS
3276 { $$ = cat2_str(make_str("+"), $2); }
3277 | '-' a_expr %prec UMINUS
3278 { $$ = cat2_str(make_str("-"), $2); }
3280 { $$ = cat2_str(make_str("%"), $2); }
3282 { $$ = cat2_str(make_str("^"), $2); }
3284 { $$ = cat2_str($1, make_str("%")); }
3286 { $$ = cat2_str($1, make_str("^")); }
3288 { $$ = cat_str(3, $1, make_str("+"), $3); }
3290 { $$ = cat_str(3, $1, make_str("-"), $3); }
3292 { $$ = cat_str(3, $1, make_str("*"), $3); }
3294 { $$ = cat_str(3, $1, make_str("/"), $3); }
3296 { $$ = cat_str(3, $1, make_str("%"), $3); }
3298 { $$ = cat_str(3, $1, make_str("^"), $3); }
3300 { $$ = cat_str(3, $1, make_str("<"), $3); }
3302 { $$ = cat_str(3, $1, make_str(">"), $3); }
3304 { $$ = cat_str(3, $1, make_str("="), $3); }
3305 | a_expr qual_Op a_expr %prec Op
3306 { $$ = cat_str(3, $1, $2, $3); }
3307 | qual_Op a_expr %prec Op
3308 { $$ = cat2_str($1, $2); }
3309 | a_expr qual_Op %prec POSTFIXOP
3310 { $$ = cat2_str($1, $2); }
3312 { $$ = cat_str(3, $1, make_str("and"), $3); }
3314 { $$ = cat_str(3, $1, make_str("or"), $3); }
3316 { $$ = cat2_str(make_str("not"), $2); }
3317 | a_expr LIKE a_expr
3318 { $$ = cat_str(3, $1, make_str("like"), $3); }
3319 | a_expr LIKE a_expr ESCAPE a_expr
3320 { $$ = cat_str(5, $1, make_str("like"), $3, make_str("escape"), $5); }
3321 | a_expr NOT LIKE a_expr
3322 { $$ = cat_str(3, $1, make_str("not like"), $4); }
3323 | a_expr NOT LIKE a_expr ESCAPE a_expr
3324 { $$ = cat_str(5, $1, make_str("not like"), $4, make_str("escape"), $6); }
3325 | a_expr ILIKE a_expr
3326 { $$ = cat_str(3, $1, make_str("ilike"), $3); }
3327 | a_expr ILIKE a_expr ESCAPE a_expr
3328 { $$ = cat_str(5, $1, make_str("ilike"), $3, make_str("escape"), $5); }
3329 | a_expr NOT ILIKE a_expr
3330 { $$ = cat_str(3, $1, make_str("not ilike"), $4); }
3331 | a_expr NOT ILIKE a_expr ESCAPE a_expr
3332 { $$ = cat_str(5, $1, make_str("not ilike"), $4, make_str("escape"), $6); }
3333 | a_expr SIMILAR TO a_expr %prec SIMILAR
3334 { $$ = cat_str(3, $1, make_str("similar to"), $4); }
3335 | a_expr SIMILAR TO a_expr ESCAPE a_expr
3336 { $$ = cat_str(5, $1, make_str("similar to"), $4, make_str("escape"), $6); }
3337 | a_expr NOT SIMILAR TO a_expr %prec SIMILAR
3338 { $$ = cat_str(3, $1, make_str("not similar to"), $5); }
3339 | a_expr NOT SIMILAR TO a_expr ESCAPE a_expr
3340 { $$ = cat_str(5, $1, make_str("not similar to"), $5, make_str("escape"), $7); }
3342 { $$ = cat2_str($1, make_str("isnull")); }
3344 { $$ = cat2_str($1, make_str("is null")); }
3346 { $$ = cat2_str($1, make_str("notnull")); }
3347 | a_expr IS NOT NULL_P
3348 { $$ = cat2_str($1, make_str("is not null")); }
3349 /* IS TRUE, IS FALSE, etc used to be function calls
3350 * but let's make them expressions to allow the optimizer
3351 * a chance to eliminate them if a_expr is a constant string.
3352 * - thomas 1997-12-22
3354 * Created BooleanTest Node type, and changed handling
3359 { $$ = cat2_str($1, make_str("is true")); }
3360 | a_expr IS NOT TRUE_P
3361 { $$ = cat2_str($1, make_str("is not true")); }
3363 { $$ = cat2_str($1, make_str("is false")); }
3364 | a_expr IS NOT FALSE_P
3365 { $$ = cat2_str($1, make_str("is not false")); }
3367 { $$ = cat2_str($1, make_str("is unknown")); }
3368 | a_expr IS NOT UNKNOWN
3369 { $$ = cat2_str($1, make_str("is not unknown")); }
3370 | a_expr IS DISTINCT FROM a_expr %prec IS
3371 { $$ = cat_str(3, $1, make_str("is distinct from"), $5); }
3372 | a_expr IS OF '(' type_list ')' %prec IS
3373 { $$ = cat_str(4, $1, make_str("is of ("), $5, make_str(")")); }
3374 | a_expr IS NOT OF '(' type_list ')' %prec IS
3375 { $$ = cat_str(4, $1, make_str("is not of ("), $6, make_str(")")); }
3376 | a_expr BETWEEN b_expr AND b_expr %prec BETWEEN
3377 { $$ = cat_str(5, $1, make_str("between"), $3, make_str("and"), $5); }
3378 | a_expr NOT BETWEEN b_expr AND b_expr %prec BETWEEN
3379 { $$ = cat_str(5, $1, make_str("not between"), $4, make_str("and"), $6); }
3380 | a_expr IN_P in_expr
3381 { $$ = cat_str(3, $1, make_str("in"), $3); }
3382 | a_expr NOT IN_P in_expr
3383 { $$ = cat_str(3, $1, make_str("not in"), $4); }
3384 | a_expr qual_all_Op sub_type select_with_parens %prec Op
3385 { $$ = cat_str(4, $1, $2, $3, $4); }
3386 | UNIQUE select_with_parens %prec Op
3387 { $$ = cat2_str(make_str("unique"), $2); }
3392 /* Restricted expressions
3394 * b_expr is a subset of the complete expression syntax
3396 * Presently, AND, NOT, IS and IN are the a_expr keywords that would
3397 * cause trouble in the places where b_expr is used. For simplicity, we
3398 * just eliminate all the boolean-keyword-operator productions from b_expr.
3402 | b_expr TYPECAST Typename
3403 { $$ = cat_str(3, $1, make_str("::"), $3); }
3404 | '-' b_expr %prec UMINUS
3405 { $$ = cat2_str(make_str("-"), $2); }
3407 { $$ = cat2_str(make_str("%"), $2); }
3409 { $$ = cat2_str(make_str("^"), $2); }
3411 { $$ = cat2_str($1, make_str("%")); }
3413 { $$ = cat2_str($1, make_str("^")); }
3415 { $$ = cat_str(3, $1, make_str("+"), $3); }
3417 { $$ = cat_str(3, $1, make_str("-"), $3); }
3419 { $$ = cat_str(3, $1, make_str("*"), $3); }
3421 { $$ = cat_str(3, $1, make_str("/"), $3); }
3423 { $$ = cat_str(3, $1, make_str("%"), $3); }
3425 { $$ = cat_str(3, $1, make_str("^"), $3); }
3427 { $$ = cat_str(3, $1, make_str("<"), $3); }
3429 { $$ = cat_str(3, $1, make_str(">"), $3); }
3431 { $$ = cat_str(3, $1, make_str("="), $3); }
3433 { $$ = cat_str(3, $1, $2, $3); }
3434 | qual_Op b_expr %prec Op
3435 { $$ = cat2_str($1, $2); }
3436 | b_expr qual_Op %prec POSTFIXOP
3437 { $$ = cat2_str($1, $2); }
3438 | b_expr IS DISTINCT FROM b_expr %prec IS
3439 { $$ = cat_str(3, $1, make_str("is distinct from"), $5); }
3440 | b_expr IS OF '(' b_expr ')' %prec IS
3441 { $$ = cat_str(4, $1, make_str("is of ("), $5, make_str(")")); }
3442 | b_expr IS NOT OF '(' b_expr ')' %prec IS
3443 { $$ = cat_str(4, $1, make_str("is not of ("), $6, make_str(")")); }
3447 * Productions that can be used in both a_expr and b_expr.
3449 * Note: productions that refer recursively to a_expr or b_expr mostly
3450 * cannot appear here. However, it's OK to refer to a_exprs that occur
3451 * inside parentheses, such as function arguments; that cannot introduce
3452 * ambiguity to the b_expr syntax.
3458 | PARAM attrs opt_indirection
3459 { $$ = cat_str(3, make_str("param"), $2, $3); }
3461 { $$ = cat_str(3, make_str("("), $2, make_str(")")); }
3462 | '(' a_expr ')' attrs opt_indirection
3463 { $$ = cat_str(5, make_str("("), $2, make_str(")"), $4, $5); }
3467 { $$ = cat2_str($1, make_str("()")); }
3468 | func_name '(' expr_list ')'
3469 { $$ = cat_str(4, $1, make_str("("), $3, make_str(")")); }
3470 | func_name '(' ALL expr_list ')'
3471 { $$ = cat_str(4, $1, make_str("( all"), $4, make_str(")")); }
3472 | func_name '(' DISTINCT expr_list ')'
3473 { $$ = cat_str(4, $1, make_str("( distinct"), $4, make_str(")")); }
3474 | func_name '(' '*' ')'
3475 { $$ = cat2_str($1, make_str("(*)")); }
3477 { $$ = make_str("current_date"); }
3478 | CURRENT_TIME opt_empty_parentheses
3479 { $$ = cat2_str(make_str("current_time"), $2); }
3480 | CURRENT_TIME '(' PosIntConst ')'
3481 { $$ = make_str("current_time"); }
3482 | CURRENT_TIMESTAMP opt_empty_parentheses
3483 { $$ = cat2_str(make_str("current_timestamp"), $2); }
3484 | CURRENT_TIMESTAMP '(' PosIntConst ')'
3485 { $$ = make_str("current_timestamp"); }
3486 | CURRENT_USER opt_empty_parentheses
3487 { $$ = cat2_str(make_str("current_user"), $2); }
3488 | SESSION_USER opt_empty_parentheses
3489 { $$ = cat2_str(make_str("session_user"), $2); }
3490 | USER opt_empty_parentheses
3491 { $$ = cat2_str(make_str("user"), $2); }
3492 | CAST '(' a_expr AS Typename ')'
3493 { $$ = cat_str(5, make_str("cast("), $3, make_str("as"), $5, make_str(")")); }
3494 | EXTRACT '(' extract_list ')'
3495 { $$ = cat_str(3, make_str("extract("), $3, make_str(")")); }
3496 | OVERLAY '(' overlay_list ')'
3497 { $$ = cat_str(3, make_str("overlay("), $3, make_str(")")); }
3498 | POSITION '(' position_list ')'
3499 { $$ = cat_str(3, make_str("position("), $3, make_str(")")); }
3500 | SUBSTRING '(' substr_list ')'
3501 { $$ = cat_str(3, make_str("substring("), $3, make_str(")")); }
3502 | TREAT '(' a_expr AS Typename ')'
3503 { $$ = cat_str(5, make_str("treat("), $3, make_str("as"), $5, make_str(")")); }
3504 /* various trim expressions are defined in SQL92 - thomas 1997-07-19 */
3505 | TRIM '(' BOTH trim_list ')'
3506 { $$ = cat_str(3, make_str("trim(both"), $4, make_str(")")); }
3507 | TRIM '(' LEADING trim_list ')'
3508 { $$ = cat_str(3, make_str("trim(leading"), $4, make_str(")")); }
3509 | TRIM '(' TRAILING trim_list ')'
3510 { $$ = cat_str(3, make_str("trim(trailing"), $4, make_str(")")); }
3511 | TRIM '(' trim_list ')'
3512 { $$ = cat_str(3, make_str("trim("), $3, make_str(")")); }
3513 | CONVERT '(' a_expr USING any_name ')'
3514 { $$ = cat_str(5, make_str("convert("), $3, make_str("using"), $5, make_str(")"));}
3515 | CONVERT '(' expr_list ')'
3516 { $$ = cat_str(3, make_str("convert("), $3, make_str(")")); }
3517 | select_with_parens %prec UMINUS
3519 | EXISTS select_with_parens
3520 { $$ = cat2_str(make_str("exists"), $2); }
3522 { $$ = make_str("value"); }
3525 * This used to use ecpg_expr, but since there is no shift/reduce conflict
3526 * anymore, we can remove ecpg_expr. - MM
3528 opt_indirection: '[' a_expr ']' opt_indirection
3529 { $$ = cat_str(4, make_str("["), $2, make_str("]"), $4); }
3530 | '[' a_expr ':' a_expr ']' opt_indirection
3531 { $$ = cat_str(6, make_str("["), $2, make_str(":"), $4, make_str("]"), $6); }
3538 | expr_list ',' a_expr
3539 { $$ = cat_str(3, $1, make_str(","), $3); }
3542 extract_list: extract_arg FROM a_expr
3543 { $$ = cat_str(3, $1, make_str("from"), $3); }
3548 type_list: type_list ',' Typename
3549 { $$ = cat_str(3, $1, ',', $3); }
3554 /* Allow delimited string SCONST in extract_arg as an SQL extension.
3555 * - thomas 2001-04-12
3558 extract_arg: ident { $$ = $1; }
3559 | YEAR_P { $$ = make_str("year"); }
3560 | MONTH_P { $$ = make_str("month"); }
3561 | DAY_P { $$ = make_str("day"); }
3562 | HOUR_P { $$ = make_str("hour"); }
3563 | MINUTE_P { $$ = make_str("minute"); }
3564 | SECOND_P { $$ = make_str("second"); }
3565 | StringConst { $$ = $1; }
3569 a_expr overlay_placing substr_from substr_for
3570 { $$ = cat_str(4, $1, 42, $3, $4); }
3571 | a_expr overlay_placing substr_from
3572 { $$ = cat_str(3, $1, $2, $3); }
3576 PLACING a_expr { $$ = cat2_str(make_str("placing"), $2); }
3579 /* position_list uses b_expr not a_expr to avoid conflict with general IN */
3580 position_list: b_expr IN_P b_expr
3581 { $$ = cat_str(3, $1, make_str("in"), $3); }
3586 substr_list: a_expr substr_from substr_for
3587 { $$ = cat_str(3, $1, $2, $3); }
3588 | a_expr substr_for substr_from
3589 { $$ = cat_str(3, $1, $2, $3); }
3590 | a_expr substr_from
3591 { $$ = cat2_str($1, $2); }
3593 { $$ = cat2_str($1, $2); }
3600 substr_from: FROM a_expr
3601 { $$ = cat2_str(make_str("from"), $2); }
3604 substr_for: FOR a_expr
3605 { $$ = cat2_str(make_str("for"), $2); }
3608 trim_list: a_expr FROM expr_list
3609 { $$ = cat_str(3, $1, make_str("from"), $3); }
3611 { $$ = cat2_str(make_str("from"), $2); }
3616 in_expr: select_with_parens
3619 { $$ = cat_str(3, make_str("("), $2, make_str(")")); }
3623 * Define SQL92-style case clause.
3624 * Allow all four forms described in the standard:
3625 * - Full specification
3626 * CASE WHEN a = b THEN c ... ELSE d END
3627 * - Implicit argument
3628 * CASE a WHEN b THEN c ... ELSE d END
3629 * - Conditional NULL
3631 * same as CASE WHEN x = y THEN NULL ELSE x END
3632 * - Conditional substitution from list, use first non-null argument
3634 * same as CASE WHEN a IS NOT NULL THEN a WHEN b IS NOT NULL THEN b ... END
3635 * - thomas 1998-11-09
3637 case_expr: CASE case_arg when_clause_list case_default END_P
3638 { $$ = cat_str(5, make_str("case"), $2, $3, $4, make_str("end")); }
3639 | NULLIF '(' a_expr ',' a_expr ')'
3640 { $$ = cat_str(5, make_str("nullif("), $3, make_str(","), $5, make_str(")")); }
3641 | COALESCE '(' expr_list ')'
3642 { $$ = cat_str(3, make_str("coalesce("), $3, make_str(")")); }
3645 when_clause_list: when_clause_list when_clause
3646 { $$ = cat2_str($1, $2); }
3651 when_clause: WHEN a_expr THEN a_expr
3652 { $$ = cat_str(4, make_str("when"), $2, make_str("then"), $4); }
3655 case_default: ELSE a_expr
3656 { $$ = cat2_str(make_str("else"), $2); }
3661 case_arg: a_expr { $$ = $1; }
3662 | /*EMPTY*/ { $$ = EMPTY; }
3665 columnref: relation_name opt_indirection
3666 { $$ = cat2_str($1, $2); }
3667 | dotted_name opt_indirection
3668 { $$ = cat2_str($1, $2); }
3671 dotted_name: relation_name attrs
3672 { $$ = cat2_str($1, $2); }
3675 attrs: '.' attr_name
3676 { $$ = cat2_str(make_str("."), $2); }
3678 { $$ = make_str(".*"); }
3679 | '.' attr_name attrs
3680 { $$ = cat_str(3, make_str("."), $2, $3); }
3683 opt_empty_parentheses: '(' ')' { $$ = make_str("()"); }
3684 | /*EMPTY*/ { $$ = EMPTY; }
3688 /*****************************************************************************
3692 *****************************************************************************/
3694 /* Target lists as found in SELECT ... and INSERT VALUES ( ... ) */
3695 target_list: target_list ',' target_el
3696 { $$ = cat_str(3, $1, make_str(","), $3); }
3701 /* AS is not optional because shift/red conflict with unary ops */
3702 target_el: a_expr AS ColLabel
3703 { $$ = cat_str(3, $1, make_str("as"), $3); }
3707 { $$ = make_str("*"); }
3710 /* Target list as found in UPDATE table SET ... */
3711 update_target_list: update_target_list ',' update_target_el
3712 { $$ = cat_str(3, $1, make_str(","),$3); }
3716 { $$ = make_str("*"); }
3719 update_target_el: ColId opt_indirection '=' a_expr
3720 { $$ = cat_str(4, $1, $2, make_str("="), $4); }
3723 insert_target_list: insert_target_list ',' insert_target_el
3724 { $$ = cat_str(3, $1, make_str(","), $3); }
3729 insert_target_el: target_el { $$ = $1; }
3730 | DEFAULT { $$ = make_str("default"); }
3734 /*****************************************************************************
3736 * Names and constants
3738 *****************************************************************************/
3740 relation_name: SpecialRuleRelation { $$ = $1; }
3741 | ColId { $$ = $1; }
3744 qualified_name_list: qualified_name
3746 | qualified_name_list ',' qualified_name
3747 { $$ = cat_str(3, $1, make_str(","), $3); }
3750 qualified_name: relation_name
3758 | name_list ',' name
3759 { $$ = cat_str(3, $1, make_str(","), $3); }
3763 name: ColId { $$ = $1; };
3764 database_name: ColId { $$ = $1; };
3765 access_method: ColId { $$ = $1; };
3766 attr_name: ColId { $$ = $1; };
3767 index_name: ColId { $$ = $1; };
3769 file_name: StringConst { $$ = $1; };
3771 /* func_name will soon return a List ... but not yet */
3773 func_name: function_name
3774 { $$ = makeList1(makeString($1)); }
3779 func_name: function_name
3787 * Include TRUE/FALSE for SQL3 support. - thomas 1997-10-24
3789 AexprConst: PosAllConst
3791 | ConstTypename StringConst
3792 { $$ = cat2_str($1, $2); }
3793 | ConstInterval StringConst opt_interval
3794 { $$ = cat_str(3, $1, $2, $3); }
3795 | ConstInterval '(' PosIntConst ')' StringConst opt_interval
3796 { $$ = cat_str(6, $1, make_str("("), $3, make_str(")"), $5, $6); }
3797 | PARAM opt_indirection
3798 { $$ = cat2_str(make_str("param"), $2); }
3800 { $$ = make_str("true"); }
3802 { $$ = make_str("false"); }
3804 { $$ = make_str("null"); }
3806 { $$ = make_str("?"); }
3809 Iconst: ICONST { $$ = make_name();};
3810 Fconst: FCONST { $$ = make_name();};
3811 Bconst: BCONST { $$ = make_name();};
3812 Xconst: XCONST { $$ = make_name();};
3815 $$ = (char *)mm_alloc(strlen($1) + 3);
3818 $$[strlen($1)+2]='\0';
3819 $$[strlen($1)+1]='\'';
3824 PosIntConst: Iconst { $$ = $1; }
3825 | civar { $$ = make_str("?"); }
3828 IntConst: PosIntConst { $$ = $1; }
3829 | '-' PosIntConst { $$ = cat2_str(make_str("-"), $2); }
3832 StringConst: Sconst { $$ = $1; }
3833 | civar { $$ = make_str("?"); }
3836 PosIntStringConst: Iconst { $$ = $1; }
3837 | Sconst { $$ = $1; }
3838 | civar { $$ = make_str("?"); }
3841 NumConst: Fconst { $$ = $1; }
3842 | Iconst { $$ = $1; }
3843 | '-' Fconst { $$ = cat2_str(make_str("-"), $2); }
3844 | '-' Iconst { $$ = cat2_str(make_str("-"), $2); }
3845 | civar { $$ = make_str("?"); }
3848 AllConst: Sconst { $$ = $1; }
3849 | NumConst { $$ = $1; }
3852 PosAllConst: Sconst { $$ = $1; }
3853 | Fconst { $$ = $1; }
3854 | Iconst { $$ = $1; }
3855 | Bconst { $$ = $1; }
3856 | Xconst { $$ = $1; }
3857 | civar { $$ = make_str("?"); }
3860 UserId: ColId { $$ = $1;};
3862 SpecialRuleRelation: OLD
3865 mmerror(PARSE_ERROR, ET_ERROR, "OLD used in non-rule query");
3867 $$ = make_str("old");
3872 mmerror(PARSE_ERROR, ET_ERROR, "NEW used in non-rule query");
3874 $$ = make_str("new");
3879 * and now special embedded SQL stuff
3883 * the exec sql connect statement: connect to the given database
3885 ECPGConnect: SQL_CONNECT TO connection_target opt_connection_name opt_user
3886 { $$ = cat_str(5, $3, make_str(","), $5, make_str(","), $4); }
3887 | SQL_CONNECT TO DEFAULT
3888 { $$ = make_str("NULL,NULL,NULL,\"DEFAULT\""); }
3889 /* also allow ORACLE syntax */
3890 | SQL_CONNECT ora_user
3891 { $$ = cat_str(3, make_str("NULL,"), $2, make_str(",NULL")); }
3894 connection_target: database_name opt_server opt_port
3896 /* old style: dbname[@server][:port] */
3897 if (strlen($2) > 0 && *($2) != '@')
3899 snprintf(errortext, sizeof(errortext),
3900 "Expected '@', found '%s'", $2);
3901 mmerror(PARSE_ERROR, ET_ERROR, errortext);
3904 $$ = make3_str(make_str("\""), make3_str($1, $2, $3), make_str("\""));
3906 | db_prefix ':' server opt_port '/' database_name opt_options
3908 /* new style: <tcp|unix>:postgresql://server[:port][/dbname] */
3909 if (strncmp($1, "unix:postgresql", strlen("unix:postgresql")) != 0 && strncmp($1, "tcp:postgresql", strlen("tcp:postgresql")) != 0)
3911 snprintf(errortext, sizeof(errortext), "only protocols 'tcp' and 'unix' and database type 'postgresql' are supported");
3912 mmerror(PARSE_ERROR, ET_ERROR, errortext);
3915 if (strncmp($3, "//", strlen("//")) != 0)
3917 snprintf(errortext, sizeof(errortext), "Expected '://', found '%s'", $3);
3918 mmerror(PARSE_ERROR, ET_ERROR, errortext);
3921 if (strncmp($1, "unix", strlen("unix")) == 0 &&
3922 strncmp($3 + strlen("//"), "localhost", strlen("localhost")) != 0 &&
3923 strncmp($3 + strlen("//"), "127.0.0.1", strlen("127.0.0.1")) != 0)
3925 snprintf(errortext, sizeof(errortext), "unix domain sockets only work on 'localhost' but not on '%9.9s'", $3 + strlen("//"));
3926 mmerror(PARSE_ERROR, ET_ERROR, errortext);
3929 $$ = make3_str(make3_str(make_str("\""), $1, make_str(":")), $3, make3_str(make3_str($4, make_str("/"), $6), $7, make_str("\"")));
3935 else if (strcmp($1, "?") == 0) /* variable */
3937 enum ECPGttype type = argsinsert->variable->type->type;
3939 /* if array see what's inside */
3940 if (type == ECPGt_array)
3941 type = argsinsert->variable->type->u.element->type;
3943 /* handle varchars */
3944 if (type == ECPGt_varchar)
3945 $$ = make2_str(mm_strdup(argsinsert->variable->name), make_str(".arr"));
3947 $$ = mm_strdup(argsinsert->variable->name);
3950 $$ = make3_str(make_str("\""), $1, make_str("\""));
3954 db_prefix: ident CVARIABLE
3956 if (strcmp($2, "postgresql") != 0 && strcmp($2, "postgres") != 0)
3958 snprintf(errortext, sizeof(errortext), "Expected 'postgresql', found '%s'", $2);
3959 mmerror(PARSE_ERROR, ET_ERROR, errortext);
3962 if (strcmp($1, "tcp") != 0 && strcmp($1, "unix") != 0)
3964 snprintf(errortext, sizeof(errortext), "Illegal connection type %s", $1);
3965 mmerror(PARSE_ERROR, ET_ERROR, errortext);
3968 $$ = make3_str($1, make_str(":"), $2);
3972 server: Op server_name
3974 if (strcmp($1, "@") != 0 && strcmp($1, "//") != 0)
3976 snprintf(errortext, sizeof(errortext), "Expected '@' or '://', found '%s'", $1);
3977 mmerror(PARSE_ERROR, ET_ERROR, errortext);
3980 $$ = make2_str($1, $2);
3984 opt_server: server { $$ = $1; }
3985 | /*EMPTY*/ { $$ = EMPTY; }
3988 server_name: ColId { $$ = $1; }
3989 | ColId '.' server_name { $$ = make3_str($1, make_str("."), $3); }
3990 | IP { $$ = make_name(); }
3993 opt_port: ':' PosIntConst { $$ = make2_str(make_str(":"), $2); }
3994 | /*EMPTY*/ { $$ = EMPTY; }
3997 opt_connection_name: AS connection_target { $$ = $2; }
3998 | /*EMPTY*/ { $$ = make_str("NULL"); }
4001 opt_user: USER ora_user { $$ = $2; }
4002 | /*EMPTY*/ { $$ = make_str("NULL,NULL"); }
4006 { $$ = cat2_str($1, make_str(", NULL")); }
4007 | user_name '/' user_name
4008 { $$ = cat_str(3, $1, make_str(","), $3); }
4009 | user_name SQL_IDENTIFIED BY user_name
4010 { $$ = cat_str(3, $1, make_str(","), $4); }
4011 | user_name USING user_name
4012 { $$ = cat_str(3, $1, make_str(","), $3); }
4020 $$ = make3_str(make_str("\""), $1, make_str("\""));
4026 else if (strcmp($1, "?") == 0) /* variable */
4028 enum ECPGttype type = argsinsert->variable->type->type;
4030 /* if array see what's inside */
4031 if (type == ECPGt_array)
4032 type = argsinsert->variable->type->u.element->type;
4034 /* handle varchars */
4035 if (type == ECPGt_varchar)
4036 $$ = make2_str(mm_strdup(argsinsert->variable->name), make_str(".arr"));
4038 $$ = mm_strdup(argsinsert->variable->name);
4041 $$ = make3_str(make_str("\""), $1, make_str("\""));
4045 char_variable: CVARIABLE
4047 /* check if we have a char variable */
4048 struct variable *p = find_variable($1);
4049 enum ECPGttype type = p->type->type;
4051 /* if array see what's inside */
4052 if (type == ECPGt_array)
4053 type = p->type->u.element->type;
4058 case ECPGt_unsigned_char:
4062 $$ = make2_str($1, make_str(".arr"));
4065 mmerror(PARSE_ERROR, ET_ERROR, "invalid datatype");
4071 opt_options: Op ColId
4073 if (strlen($1) == 0)
4074 mmerror(PARSE_ERROR, ET_ERROR, "incomplete statement");
4076 if (strcmp($1, "?") != 0)
4078 snprintf(errortext, sizeof(errortext), "unrecognised token '%s'", $1);
4079 mmerror(PARSE_ERROR, ET_ERROR, errortext);
4082 $$ = make2_str(make_str("?"), $2);
4084 | /*EMPTY*/ { $$ = EMPTY; }
4088 * Declare a prepared cursor. The syntax is different from the standard
4089 * declare statement, so we create a new rule.
4091 ECPGCursorStmt: DECLARE name opt_cursor CURSOR FOR ident
4093 struct cursor *ptr, *this;
4094 struct variable *thisquery = (struct variable *)mm_alloc(sizeof(struct variable));
4096 for (ptr = cur; ptr != NULL; ptr = ptr->next)
4098 if (strcmp($2, ptr->name) == 0)
4100 /* re-definition is a bug */
4101 snprintf(errortext, sizeof(errortext), "cursor %s already defined", $2);
4102 mmerror(PARSE_ERROR, ET_ERROR, errortext);
4106 this = (struct cursor *) mm_alloc(sizeof(struct cursor));
4108 /* initial definition */
4111 this->connection = connection;
4112 this->command = cat_str(4, make_str("declare"), mm_strdup($2), $3, make_str("cursor for ?"));
4113 this->argsresult = NULL;
4115 thisquery->type = &ecpg_query;
4116 thisquery->brace_level = 0;
4117 thisquery->next = NULL;
4118 thisquery->name = (char *) mm_alloc(sizeof("ECPGprepared_statement(\"\")") + strlen($6));
4119 sprintf(thisquery->name, "ECPGprepared_statement(\"%s\")", $6);
4121 this->argsinsert = NULL;
4122 add_variable(&(this->argsinsert), thisquery, &no_indicator);
4126 $$ = cat_str(3, make_str("/*"), mm_strdup(this->command), make_str("*/"));
4131 * the exec sql deallocate prepare command to deallocate a previously
4132 * prepared statement
4134 ECPGDeallocate: DEALLOCATE PREPARE ident
4135 { $$ = cat_str(3, make_str("ECPGdeallocate(__LINE__, \""), $3, make_str("\");")); }
4137 { $$ = cat_str(2, make_str("ECPGdeallocate(__LINE__, \""), $2, make_str("\");")); }
4141 * variable decalartion outside exec sql declare block
4143 ECPGVarDeclaration: single_vt_declaration;
4145 single_vt_declaration: type_declaration { $$ = $1; }
4146 | single_var_declaration { $$ = $1; }
4149 single_var_declaration: storage_declaration
4152 actual_type[struct_level].type_enum = $2.type_enum;
4153 actual_type[struct_level].type_dimension = $2.type_dimension;
4154 actual_type[struct_level].type_index = $2.type_index;
4155 actual_type[struct_level].type_sizeof = $2.type_sizeof;
4157 /* we do not need the string "varchar" for output */
4158 /* so replace it with an empty string */
4159 if ($2.type_enum == ECPGt_varchar)
4167 $$ = cat_str(5, actual_startline[struct_level], $1, $2.type_str, $4, make_str(";\n"));
4171 single_vt_type: common_type
4172 | ECPGColLabelCommon
4175 * Check for type names that the SQL grammar treats as
4176 * unreserved keywords
4178 if (strcmp($1, "varchar") == 0)
4180 $$.type_enum = ECPGt_varchar;
4181 $$.type_str = make_str("varchar");
4182 $$.type_dimension = -1;
4184 $$.type_sizeof = NULL;
4186 else if (strcmp($1, "float") == 0)
4188 $$.type_enum = ECPGt_float;
4189 $$.type_str = make_str("float");
4190 $$.type_dimension = -1;
4192 $$.type_sizeof = NULL;
4194 else if (strcmp($1, "double") == 0)
4196 $$.type_enum = ECPGt_double;
4197 $$.type_str = make_str("double");
4198 $$.type_dimension = -1;
4200 $$.type_sizeof = NULL;
4204 /* this is for typedef'ed types */
4205 struct typedefs *this = get_typedef($1);
4207 $$.type_str = (this->type->type_enum == ECPGt_varchar) ? EMPTY : mm_strdup(this->name);
4208 $$.type_enum = this->type->type_enum;
4209 $$.type_dimension = this->type->type_dimension;
4210 $$.type_index = this->type->type_index;
4211 $$.type_sizeof = this->type->type_sizeof;
4212 struct_member_list[struct_level] = ECPGstruct_member_dup(this->struct_member_list);
4218 * variable declaration inside exec sql declare block
4220 ECPGDeclaration: sql_startdeclare
4221 { fputs("/* exec sql begin declare section */", yyout); }
4222 var_type_declarations sql_enddeclare
4224 fprintf(yyout, "%s/* exec sql end declare section */", $3);
4226 output_line_number();
4230 sql_startdeclare: ecpgstart BEGIN_P DECLARE SQL_SECTION ';' {};
4232 sql_enddeclare: ecpgstart END_P DECLARE SQL_SECTION ';' {};
4234 var_type_declarations: /*EMPTY*/ { $$ = EMPTY; }
4235 | vt_declarations { $$ = $1; }
4238 vt_declarations: var_declaration { $$ = $1; }
4239 | type_declaration { $$ = $1; }
4240 | vt_declarations var_declaration { $$ = cat2_str($1, $2); }
4241 | vt_declarations type_declaration { $$ = cat2_str($1, $2); }
4244 variable_declarations: var_declaration { $$ = $1; }
4245 | variable_declarations var_declaration { $$ = cat2_str($1, $2); }
4248 type_declaration: S_TYPEDEF
4250 /* reset this variable so we see if there was */
4251 /* an initializer specified */
4254 type opt_pointer ECPGColLabel opt_type_array_bounds ';'
4256 /* add entry to list */
4257 struct typedefs *ptr, *this;
4258 int dimension = $6.index1;
4259 int length = $6.index2;
4261 if (($3.type_enum == ECPGt_struct ||
4262 $3.type_enum == ECPGt_union) &&
4265 mmerror(PARSE_ERROR, ET_ERROR, "Initializer not allowed in typedef command");
4270 for (ptr = types; ptr != NULL; ptr = ptr->next)
4272 if (strcmp($5, ptr->name) == 0)
4274 /* re-definition is a bug */
4275 snprintf(errortext, sizeof(errortext), "Type %s already defined", $5);
4276 mmerror(PARSE_ERROR, ET_ERROR, errortext);
4280 adjust_array($3.type_enum, &dimension, &length, $3.type_dimension, $3.type_index, *$4?1:0);
4282 this = (struct typedefs *) mm_alloc(sizeof(struct typedefs));
4284 /* initial definition */
4287 this->type = (struct this_type *) mm_alloc(sizeof(struct this_type));
4288 this->type->type_enum = $3.type_enum;
4289 this->type->type_str = mm_strdup($5);
4290 this->type->type_dimension = dimension; /* dimension of array */
4291 this->type->type_index = length; /* lenght of string */
4292 this->type->type_sizeof = ECPGstruct_sizeof;
4293 this->struct_member_list = ($3.type_enum == ECPGt_struct || $3.type_enum == ECPGt_union) ?
4294 struct_member_list[struct_level] : NULL;
4296 if ($3.type_enum != ECPGt_varchar &&
4297 $3.type_enum != ECPGt_char &&
4298 $3.type_enum != ECPGt_unsigned_char &&
4299 this->type->type_index >= 0)
4300 mmerror(PARSE_ERROR, ET_ERROR, "No multi-dimensional array support for simple data types");
4305 fprintf(yyout, "typedef %s %s %s %s;\n", $3.type_str, *$4?"*":"", $5, $6.str);
4306 output_line_number();
4310 var_declaration: storage_declaration
4313 actual_type[struct_level].type_enum = $2.type_enum;
4314 actual_type[struct_level].type_dimension = $2.type_dimension;
4315 actual_type[struct_level].type_index = $2.type_index;
4316 actual_type[struct_level].type_sizeof = $2.type_sizeof;
4318 /* we do not need the string "varchar" for output */
4319 /* so replace it with an empty string */
4320 if ($2.type_enum == ECPGt_varchar)
4328 $$ = cat_str(5, actual_startline[struct_level], $1, $2.type_str, $4, make_str(";\n"));
4332 storage_declaration: storage_clause storage_modifier
4334 actual_storage[struct_level] = cat2_str(mm_strdup($1), mm_strdup($2));
4335 actual_startline[struct_level] = hashline_number();
4339 storage_clause : S_EXTERN { $$ = make_str("extern"); }
4340 | S_STATIC { $$ = make_str("static"); }
4341 | S_REGISTER { $$ = make_str("register"); }
4342 | S_AUTO { $$ = make_str("auto"); }
4343 | /*EMPTY*/ { $$ = EMPTY; }
4346 storage_modifier : S_CONST { $$ = make_str("const"); }
4347 | S_VOLATILE { $$ = make_str("volatile"); }
4348 | /*EMPTY*/ { $$ = EMPTY; }
4351 common_type: simple_type
4354 $$.type_str = mm_strdup(ECPGtype_name($1));
4355 $$.type_dimension = -1;
4357 $$.type_sizeof = NULL;
4361 $$.type_enum = ECPGt_struct;
4363 $$.type_dimension = -1;
4365 $$.type_sizeof = ECPGstruct_sizeof;
4369 $$.type_enum = ECPGt_union;
4371 $$.type_dimension = -1;
4373 $$.type_sizeof = NULL;
4378 $$.type_enum = ECPGt_int;
4379 $$.type_dimension = -1;
4381 $$.type_sizeof = NULL;
4389 * Check for type names that the SQL grammar treats as
4390 * unreserved keywords
4392 if (strcmp($1, "varchar") == 0)
4394 $$.type_enum = ECPGt_varchar;
4395 $$.type_str = make_str("varchar");
4396 $$.type_dimension = -1;
4398 $$.type_sizeof = NULL;
4400 else if (strcmp($1, "float") == 0)
4402 $$.type_enum = ECPGt_float;
4403 $$.type_str = make_str("float");
4404 $$.type_dimension = -1;
4406 $$.type_sizeof = NULL;
4408 else if (strcmp($1, "double") == 0)
4410 $$.type_enum = ECPGt_double;
4411 $$.type_str = make_str("double");
4412 $$.type_dimension = -1;
4414 $$.type_sizeof = NULL;
4418 /* this is for typedef'ed types */
4419 struct typedefs *this = get_typedef($1);
4421 $$.type_str = (this->type->type_enum == ECPGt_varchar) ? EMPTY : mm_strdup(this->name);
4422 $$.type_enum = this->type->type_enum;
4423 $$.type_dimension = this->type->type_dimension;
4424 $$.type_index = this->type->type_index;
4425 $$.type_sizeof = this->type->type_sizeof;
4426 struct_member_list[struct_level] = ECPGstruct_member_dup(this->struct_member_list);
4431 enum_type: SQL_ENUM opt_symbol enum_definition
4432 { $$ = cat_str(3, make_str("enum"), $2, $3); }
4434 { $$ = cat2_str(make_str("enum"), $2); }
4437 enum_definition: '{' c_list '}'
4438 { $$ = cat_str(3, make_str("{"), $2, make_str("}")); };
4440 struct_type: s_struct '{' variable_declarations '}'
4442 ECPGfree_struct_member(struct_member_list[struct_level]);
4443 free(actual_storage[struct_level--]);
4444 $$ = cat_str(4, $1, make_str("{"), $3, make_str("}"));
4448 union_type: s_union '{' variable_declarations '}'
4450 ECPGfree_struct_member(struct_member_list[struct_level]);
4451 free(actual_storage[struct_level--]);
4452 $$ = cat_str(4, $1, make_str("{"), $3, make_str("}"));
4456 s_struct: SQL_STRUCT opt_symbol
4458 struct_member_list[struct_level++] = NULL;
4459 $$ = cat2_str(make_str("struct"), $2);
4460 ECPGstruct_sizeof = cat_str(3, make_str("sizeof("), strdup($$), make_str(")"));
4461 if (struct_level >= STRUCT_DEPTH)
4462 mmerror(PARSE_ERROR, ET_ERROR, "Too many levels in nested structure definition");
4466 s_union: UNION opt_symbol
4468 struct_member_list[struct_level++] = NULL;
4469 if (struct_level >= STRUCT_DEPTH)
4470 mmerror(PARSE_ERROR, ET_ERROR, "Too many levels in nested structure definition");
4472 $$ = cat2_str(make_str("union"), $2);
4476 simple_type: unsigned_type { $$=$1; }
4477 | opt_signed signed_type { $$=$2; }
4480 unsigned_type: SQL_UNSIGNED SQL_SHORT { $$ = ECPGt_unsigned_short; }
4481 | SQL_UNSIGNED SQL_SHORT INT { $$ = ECPGt_unsigned_short; }
4482 | SQL_UNSIGNED { $$ = ECPGt_unsigned_int; }
4483 | SQL_UNSIGNED INT { $$ = ECPGt_unsigned_int; }
4484 | SQL_UNSIGNED SQL_LONG { $$ = ECPGt_unsigned_long; }
4485 | SQL_UNSIGNED SQL_LONG INT { $$ = ECPGt_unsigned_long; }
4486 | SQL_UNSIGNED SQL_LONG SQL_LONG
4488 #ifdef HAVE_LONG_LONG_INT_64
4489 $$ = ECPGt_unsigned_long_long;
4491 $$ = ECPGt_unsigned_long;
4494 | SQL_UNSIGNED SQL_LONG SQL_LONG INT
4496 #ifdef HAVE_LONG_LONG_INT_64
4497 $$ = ECPGt_unsigned_long_long;
4499 $$ = ECPGt_unsigned_long;
4502 | SQL_UNSIGNED CHAR_P { $$ = ECPGt_unsigned_char; }
4505 signed_type: SQL_SHORT { $$ = ECPGt_short; }
4506 | SQL_SHORT INT { $$ = ECPGt_short; }
4507 | INT { $$ = ECPGt_int; }
4508 | SQL_LONG { $$ = ECPGt_long; }
4509 | SQL_LONG INT { $$ = ECPGt_long; }
4512 #ifdef HAVE_LONG_LONG_INT_64
4513 $$ = ECPGt_long_long;
4518 | SQL_LONG SQL_LONG INT
4520 #ifdef HAVE_LONG_LONG_INT_64
4521 $$ = ECPGt_long_long;
4526 | SQL_BOOL { $$ = ECPGt_bool; }
4527 | CHAR_P { $$ = ECPGt_char; }
4530 opt_signed: SQL_SIGNED
4534 variable_list: variable
4536 | variable_list ',' variable
4537 { $$ = cat_str(3, $1, make_str(","), $3); }
4540 variable: opt_pointer ECPGColLabel opt_array_bounds opt_initializer
4542 struct ECPGtype * type;
4543 int dimension = $3.index1; /* dimension of array */
4544 int length = $3.index2; /* lenght of string */
4545 char dim[14L], ascii_len[12];
4547 adjust_array(actual_type[struct_level].type_enum, &dimension, &length, actual_type[struct_level].type_dimension, actual_type[struct_level].type_index, strlen($1));
4549 switch (actual_type[struct_level].type_enum)
4554 type = ECPGmake_struct_type(struct_member_list[struct_level], actual_type[struct_level].type_enum, actual_type[struct_level].type_sizeof);
4556 type = ECPGmake_array_type(ECPGmake_struct_type(struct_member_list[struct_level], actual_type[struct_level].type_enum, actual_type[struct_level].type_sizeof), dimension);
4558 $$ = cat_str(4, $1, mm_strdup($2), $3.str, $4);
4563 type = ECPGmake_simple_type(actual_type[struct_level].type_enum, length);
4565 type = ECPGmake_array_type(ECPGmake_simple_type(actual_type[struct_level].type_enum, length), dimension);
4575 sprintf(dim, "[%d]", dimension);
4578 sprintf(ascii_len, "%d", length);
4581 mmerror(PARSE_ERROR, ET_ERROR, "pointer to varchar are not implemented");
4584 $$ = cat_str(7, mm_strdup(actual_storage[struct_level]), make2_str(make_str(" struct varchar_"), mm_strdup($2)), make_str(" { int len; char arr["), mm_strdup(ascii_len), make_str("]; } *"), mm_strdup($2), $4);
4586 $$ = cat_str(8, mm_strdup(actual_storage[struct_level]), make2_str(make_str(" struct varchar_"), mm_strdup($2)), make_str(" { int len; char arr["), mm_strdup(ascii_len), make_str("]; } "), mm_strdup($2), mm_strdup(dim), $4);
4590 case ECPGt_unsigned_char:
4591 if (dimension == -1)
4592 type = ECPGmake_simple_type(actual_type[struct_level].type_enum, length);
4594 type = ECPGmake_array_type(ECPGmake_simple_type(actual_type[struct_level].type_enum, length), dimension);
4596 $$ = cat_str(4, $1, mm_strdup($2), $3.str, $4);
4601 type = ECPGmake_simple_type(actual_type[struct_level].type_enum, 1);
4603 type = ECPGmake_array_type(ECPGmake_simple_type(actual_type[struct_level].type_enum, 1), dimension);
4605 $$ = cat_str(4, $1, mm_strdup($2), $3.str, $4);
4609 if (struct_level == 0)
4610 new_variable($2, type, braces_open);
4612 ECPGmake_struct_member($2, type, &(struct_member_list[struct_level - 1]));
4618 opt_initializer: /*EMPTY*/
4623 $$ = cat2_str(make_str("="), $2);
4627 opt_pointer: /*EMPTY*/ { $$ = EMPTY; }
4628 | '*' { $$ = make_str("*"); }
4629 | '*' '*' { $$ = make_str("**"); }
4633 * As long as the prepare statement is not supported by the backend, we will
4634 * try to simulate it here so we get dynamic SQL
4636 ECPGDeclare: DECLARE STATEMENT ident
4638 /* this is only supported for compatibility */
4639 $$ = cat_str(3, make_str("/* declare statement"), $3, make_str("*/"));
4643 * the exec sql disconnect statement: disconnect from the given database
4645 ECPGDisconnect: SQL_DISCONNECT dis_name { $$ = $2; }
4648 dis_name: connection_object { $$ = $1; }
4649 | SQL_CURRENT { $$ = make_str("\"CURRENT\""); }
4650 | ALL { $$ = make_str("\"ALL\""); }
4651 | /*EMPTY*/ { $$ = make_str("\"CURRENT\""); }
4654 connection_object: connection_target { $$ = $1; }
4655 | DEFAULT { $$ = make_str("\"DEFAULT\""); }
4659 * execute a given string as sql command
4661 ECPGExecute : EXECUTE IMMEDIATE execstring
4663 struct variable *thisquery = (struct variable *)mm_alloc(sizeof(struct variable));
4665 thisquery->type = &ecpg_query;
4666 thisquery->brace_level = 0;
4667 thisquery->next = NULL;
4668 thisquery->name = $3;
4670 add_variable(&argsinsert, thisquery, &no_indicator);
4676 struct variable *thisquery = (struct variable *)mm_alloc(sizeof(struct variable));
4678 thisquery->type = &ecpg_query;
4679 thisquery->brace_level = 0;
4680 thisquery->next = NULL;
4681 thisquery->name = (char *) mm_alloc(sizeof("ECPGprepared_statement(\"\")") + strlen($2));
4682 sprintf(thisquery->name, "ECPGprepared_statement(\"%s\")", $2);
4684 add_variable(&argsinsert, thisquery, &no_indicator);
4686 opt_ecpg_using opt_ecpg_into
4692 execstring: char_variable
4695 { $$ = make3_str(make_str("\""), $1, make_str("\"")); }
4699 * the exec sql free command to deallocate a previously
4700 * prepared statement
4702 ECPGFree: SQL_FREE name { $$ = $2; };
4705 * open is an open cursor, at the moment this has to be removed
4707 ECPGOpen: SQL_OPEN name opt_ecpg_using { $$ = $2; };
4709 opt_ecpg_using: /*EMPTY*/ { $$ = EMPTY; }
4710 | USING variablelist
4712 /* mmerror ("open cursor with variables not implemented yet"); */
4717 opt_sql: /*EMPTY*/ | SQL_SQL;
4719 ecpg_into: INTO into_list
4723 | INTO opt_sql SQL_DESCRIPTOR quoted_ident_stringvar
4725 add_variable(&argsresult, descriptor_variable($4,0), &no_indicator);
4730 opt_ecpg_into: /*EMPTY*/ { $$ = EMPTY; }
4731 | ecpg_into { $$ = $1; }
4734 variable: civarind | civar
4736 variablelist: variable | variable ',' variablelist;
4739 * As long as the prepare statement is not supported by the backend, we will
4740 * try to simulate it here so we get dynamic SQL
4742 ECPGPrepare: PREPARE name FROM execstring
4743 { $$ = cat2_str(make3_str(make_str("\""), $2, make_str("\",")), $4); }
4747 * dynamic SQL: descriptor based access
4748 * written by Christof Petig <christof.petig@wtal.de>
4752 * deallocate a descriptor
4754 ECPGDeallocateDescr: DEALLOCATE SQL_DESCRIPTOR quoted_ident_stringvar
4756 drop_descriptor($3,connection);
4762 * allocate a descriptor
4764 ECPGAllocateDescr: SQL_ALLOCATE SQL_DESCRIPTOR quoted_ident_stringvar
4766 add_descriptor($3,connection);
4771 * read from descriptor
4774 ECPGGetDescHeaderItem: CVARIABLE '=' desc_header_item
4775 { push_assignment($1, $3); }
4778 desc_header_item: SQL_COUNT { $$ = ECPGd_count; }
4781 ECPGGetDescItem: CVARIABLE '=' descriptor_item { push_assignment($1, $3); };
4783 descriptor_item: SQL_CARDINALITY { $$ = ECPGd_cardinality; }
4784 | SQL_DATA { $$ = ECPGd_data; }
4785 | SQL_DATETIME_INTERVAL_CODE { $$ = ECPGd_di_code; }
4786 | SQL_DATETIME_INTERVAL_PRECISION { $$ = ECPGd_di_precision; }
4787 | SQL_INDICATOR { $$ = ECPGd_indicator; }
4788 | SQL_KEY_MEMBER { $$ = ECPGd_key_member; }
4789 | SQL_LENGTH { $$ = ECPGd_length; }
4790 | SQL_NAME { $$ = ECPGd_name; }
4791 | SQL_NULLABLE { $$ = ECPGd_nullable; }
4792 | SQL_OCTET_LENGTH { $$ = ECPGd_octet; }
4793 | PRECISION { $$ = ECPGd_precision; }
4794 | SQL_RETURNED_LENGTH { $$ = ECPGd_length; }
4795 | SQL_RETURNED_OCTET_LENGTH { $$ = ECPGd_ret_octet; }
4796 | SQL_SCALE { $$ = ECPGd_scale; }
4797 | TYPE_P { $$ = ECPGd_type; }
4800 ECPGGetDescHeaderItems: ECPGGetDescHeaderItem
4801 | ECPGGetDescHeaderItems ',' ECPGGetDescHeaderItem
4804 ECPGGetDescItems: ECPGGetDescItem
4805 | ECPGGetDescItems ',' ECPGGetDescItem
4808 ECPGGetDescriptorHeader: GET SQL_DESCRIPTOR quoted_ident_stringvar
4809 ECPGGetDescHeaderItems
4813 ECPGGetDescriptor: GET SQL_DESCRIPTOR quoted_ident_stringvar SQL_VALUE CVARIABLE ECPGGetDescItems
4814 { $$.str = $5; $$.name = $3; }
4815 | GET SQL_DESCRIPTOR quoted_ident_stringvar SQL_VALUE Iconst ECPGGetDescItems
4816 { $$.str = $5; $$.name = $3; }
4820 * for compatibility with ORACLE we will also allow the keyword RELEASE
4821 * after a transaction statement to disconnect from the database.
4824 ECPGRelease: TransactionStmt SQL_RELEASE
4826 if (strcmp($1, "begin") == 0)
4827 mmerror(PARSE_ERROR, ET_ERROR, "RELEASE does not make sense when beginning a transaction");
4829 fprintf(yyout, "ECPGtrans(__LINE__, %s, \"%s\");",
4830 connection ? connection : "NULL", $1);
4832 fprintf(yyout, "ECPGdisconnect(__LINE__, %s);",
4833 connection ? connection : "\"CURRENT\"");
4840 * set/reset the automatic transaction mode, this needs a differnet handling
4841 * as the other set commands
4843 ECPGSetAutocommit: SET SQL_AUTOCOMMIT '=' on_off { $$ = $4; }
4844 | SET SQL_AUTOCOMMIT TO on_off { $$ = $4; }
4847 on_off: ON { $$ = make_str("on"); }
4848 | OFF { $$ = make_str("off"); }
4852 * set the actual connection, this needs a differnet handling as the other
4855 ECPGSetConnection: SET SQL_CONNECTION TO connection_object { $$ = $4; }
4856 | SET SQL_CONNECTION '=' connection_object { $$ = $4; }
4860 * define a new type for embedded SQL
4864 /* reset this variable so we see if there was */
4865 /* an initializer specified */
4868 ColLabel IS type opt_type_array_bounds opt_reference
4870 /* add entry to list */
4871 struct typedefs *ptr, *this;
4872 int dimension = $6.index1;
4873 int length = $6.index2;
4875 if (($5.type_enum == ECPGt_struct ||
4876 $5.type_enum == ECPGt_union) &&
4878 mmerror(PARSE_ERROR, ET_ERROR, "Initializer not allowed in EXEC SQL TYPE command");
4881 for (ptr = types; ptr != NULL; ptr = ptr->next)
4883 if (strcmp($3, ptr->name) == 0)
4885 /* re-definition is a bug */
4886 snprintf(errortext, sizeof(errortext), "Type %s already defined", $3);
4887 mmerror(PARSE_ERROR, ET_ERROR, errortext);
4891 adjust_array($5.type_enum, &dimension, &length, $5.type_dimension, $5.type_index, *$7?1:0);
4893 this = (struct typedefs *) mm_alloc(sizeof(struct typedefs));
4895 /* initial definition */
4898 this->type = (struct this_type *) mm_alloc(sizeof(struct this_type));
4899 this->type->type_enum = $5.type_enum;
4900 this->type->type_str = mm_strdup($3);
4901 this->type->type_dimension = dimension; /* dimension of array */
4902 this->type->type_index = length; /* lenght of string */
4903 this->type->type_sizeof = ECPGstruct_sizeof;
4904 this->struct_member_list = ($5.type_enum == ECPGt_struct || $5.type_enum == ECPGt_union) ?
4905 struct_member_list[struct_level] : NULL;
4907 if ($5.type_enum != ECPGt_varchar &&
4908 $5.type_enum != ECPGt_char &&
4909 $5.type_enum != ECPGt_unsigned_char &&
4910 this->type->type_index >= 0)
4911 mmerror(PARSE_ERROR, ET_ERROR, "No multi-dimensional array support for simple data types");
4916 if (auto_create_c == false)
4917 $$ = cat_str(7, make_str("/* exec sql type"), mm_strdup($3), make_str("is"), mm_strdup($5.type_str), mm_strdup($6.str), $7, make_str("*/"));
4919 $$ = cat_str(6, make_str("typedef "), mm_strdup($5.type_str), *$7?make_str("*"):make_str(""), mm_strdup($6.str), mm_strdup($3), make_str(";"));
4923 opt_type_array_bounds: '[' ']' opt_type_array_bounds
4926 $$.index2 = $3.index1;
4927 $$.str = cat2_str(make_str("[]"), $3.str);
4929 | '(' ')' opt_type_array_bounds
4932 $$.index2 = $3.index1;
4933 $$.str = cat2_str(make_str("[]"), $3.str);
4935 | '[' Iresult ']' opt_type_array_bounds
4937 char *txt = mm_alloc(20L);
4939 sprintf (txt, "%d", $2);
4941 $$.index2 = $4.index1;
4942 $$.str = cat_str(4, make_str("["), txt, make_str("]"), $4.str);
4944 | '(' Iresult ')' opt_type_array_bounds
4946 char *txt = mm_alloc(20L);
4948 sprintf (txt, "%d", $2);
4950 $$.index2 = $4.index1;
4951 $$.str = cat_str(4, make_str("["), txt, make_str("]"), $4.str);
4961 opt_reference: SQL_REFERENCE { $$ = make_str("reference"); }
4962 | /*EMPTY*/ { $$ = EMPTY; }
4966 * define the type of one variable for embedded SQL
4970 /* reset this variable so we see if there was */
4971 /* an initializer specified */
4974 ColLabel IS type opt_type_array_bounds opt_reference
4976 struct variable *p = find_variable($3);
4977 int dimension = $6.index1;
4978 int length = $6.index2;
4979 struct ECPGtype * type;
4981 if (($5.type_enum == ECPGt_struct ||
4982 $5.type_enum == ECPGt_union) &&
4984 mmerror(PARSE_ERROR, ET_ERROR, "Initializer not allowed in EXEC SQL VAR command");
4987 adjust_array($5.type_enum, &dimension, &length, $5.type_dimension, $5.type_index, *$7?1:0);
4989 switch ($5.type_enum)
4994 type = ECPGmake_struct_type(struct_member_list[struct_level], $5.type_enum, $5.type_sizeof);
4996 type = ECPGmake_array_type(ECPGmake_struct_type(struct_member_list[struct_level], $5.type_enum,$5.type_sizeof), dimension);
5000 if (dimension == -1)
5001 type = ECPGmake_simple_type($5.type_enum, length);
5003 type = ECPGmake_array_type(ECPGmake_simple_type($5.type_enum, length), dimension);
5007 case ECPGt_unsigned_char:
5008 if (dimension == -1)
5009 type = ECPGmake_simple_type($5.type_enum, length);
5011 type = ECPGmake_array_type(ECPGmake_simple_type($5.type_enum, length), dimension);
5016 mmerror(PARSE_ERROR, ET_ERROR, "No multi-dimensional array support for simple data types");
5019 type = ECPGmake_simple_type($5.type_enum, 1);
5021 type = ECPGmake_array_type(ECPGmake_simple_type($5.type_enum, 1), dimension);
5025 ECPGfree_type(p->type);
5029 $$ = cat_str(7, make_str("/* exec sql var"), mm_strdup($3), make_str("is"), mm_strdup($5.type_str), mm_strdup($6.str), $7, make_str("*/"));
5034 * whenever statement: decide what to do in case of error/no data found
5035 * according to SQL standards we lack: SQLSTATE, CONSTRAINT and SQLEXCEPTION
5037 ECPGWhenever: SQL_WHENEVER SQL_SQLERROR action
5039 when_error.code = $<action>3.code;
5040 when_error.command = $<action>3.command;
5041 $$ = cat_str(3, make_str("/* exec sql whenever sqlerror "), $3.str, make_str("; */\n"));
5043 | SQL_WHENEVER NOT SQL_FOUND action
5045 when_nf.code = $<action>4.code;
5046 when_nf.command = $<action>4.command;
5047 $$ = cat_str(3, make_str("/* exec sql whenever not found "), $4.str, make_str("; */\n"));
5049 | SQL_WHENEVER SQL_SQLWARNING action
5051 when_warn.code = $<action>3.code;
5052 when_warn.command = $<action>3.command;
5053 $$ = cat_str(3, make_str("/* exec sql whenever sql_warning "), $3.str, make_str("; */\n"));
5057 action : SQL_CONTINUE
5059 $<action>$.code = W_NOTHING;
5060 $<action>$.command = NULL;
5061 $<action>$.str = make_str("continue");
5065 $<action>$.code = W_SQLPRINT;
5066 $<action>$.command = NULL;
5067 $<action>$.str = make_str("sqlprint");
5071 $<action>$.code = W_STOP;
5072 $<action>$.command = NULL;
5073 $<action>$.str = make_str("stop");
5077 $<action>$.code = W_GOTO;
5078 $<action>$.command = strdup($2);
5079 $<action>$.str = cat2_str(make_str("goto "), $2);
5083 $<action>$.code = W_GOTO;
5084 $<action>$.command = strdup($3);
5085 $<action>$.str = cat2_str(make_str("goto "), $3);
5087 | DO name '(' c_args ')'
5089 $<action>$.code = W_DO;
5090 $<action>$.command = cat_str(4, $2, make_str("("), $4, make_str(")"));
5091 $<action>$.str = cat2_str(make_str("do"), mm_strdup($<action>$.command));
5095 $<action>$.code = W_BREAK;
5096 $<action>$.command = NULL;
5097 $<action>$.str = make_str("break");
5099 | SQL_CALL name '(' c_args ')'
5101 $<action>$.code = W_DO;
5102 $<action>$.command = cat_str(4, $2, make_str("("), $4, make_str(")"));
5103 $<action>$.str = cat2_str(make_str("call"), mm_strdup($<action>$.command));
5107 /* some other stuff for ecpg */
5109 /* additional unreserved keywords */
5110 ECPGKeywords: SQL_BREAK { $$ = make_str("break"); }
5111 | SQL_CALL { $$ = make_str("call"); }
5112 | SQL_CARDINALITY { $$ = make_str("cardinality"); }
5113 | SQL_CONNECT { $$ = make_str("connect"); }
5114 | SQL_CONTINUE { $$ = make_str("continue"); }
5115 | SQL_COUNT { $$ = make_str("count"); }
5116 | SQL_DATA { $$ = make_str("data"); }
5117 | SQL_DATETIME_INTERVAL_CODE { $$ = make_str("datetime_interval_code"); }
5118 | SQL_DATETIME_INTERVAL_PRECISION { $$ = make_str("datetime_interval_precision"); }
5119 | SQL_DISCONNECT { $$ = make_str("disconnect"); }
5120 | SQL_FOUND { $$ = make_str("found"); }
5121 | SQL_GO { $$ = make_str("go"); }
5122 | SQL_GOTO { $$ = make_str("goto"); }
5123 | SQL_IDENTIFIED { $$ = make_str("identified"); }
5124 | SQL_INDICATOR { $$ = make_str("indicator"); }
5125 | SQL_KEY_MEMBER { $$ = make_str("key_member"); }
5126 | SQL_LENGTH { $$ = make_str("length"); }
5127 | SQL_NAME { $$ = make_str("name"); }
5128 | SQL_NULLABLE { $$ = make_str("nullable"); }
5129 | SQL_OCTET_LENGTH { $$ = make_str("octet_length"); }
5130 | SQL_OPEN { $$ = make_str("open"); }
5131 | SQL_RELEASE { $$ = make_str("release"); }
5132 | SQL_RETURNED_LENGTH { $$ = make_str("returned_length"); }
5133 | SQL_RETURNED_OCTET_LENGTH { $$ = make_str("returned_octet_length"); }
5134 | SQL_SCALE { $$ = make_str("scale"); }
5135 | SQL_SECTION { $$ = make_str("section"); }
5136 | SQL_SQLERROR { $$ = make_str("sqlerror"); }
5137 | SQL_SQLPRINT { $$ = make_str("sqlprint"); }
5138 | SQL_SQLWARNING { $$ = make_str("sqlwarning"); }
5139 | SQL_STOP { $$ = make_str("stop"); }
5140 | SQL_VAR { $$ = make_str("var"); }
5141 | SQL_WHENEVER { $$ = make_str("whenever"); }
5144 /* additional keywords that can be SQL type names (but not ECPGColLabels) */
5145 ECPGTypeName: SQL_BOOL { $$ = make_str("bool"); }
5146 | SQL_LONG { $$ = make_str("long"); }
5147 | SQL_SHORT { $$ = make_str("short"); }
5148 | SQL_STRUCT { $$ = make_str("struct"); }
5149 | SQL_SIGNED { $$ = make_str("signed"); }
5150 | SQL_UNSIGNED { $$ = make_str("unsigned"); }
5153 opt_symbol: symbol { $$ = $1; }
5154 | /*EMPTY*/ { $$ = EMPTY; }
5157 symbol: ColLabel { $$ = $1; }
5161 * Name classification hierarchy.
5163 * IDENT is the lexeme returned by the lexer for identifiers that match
5164 * no known keyword. In most cases, we can accept certain keywords as
5165 * names, not only IDENTs. We prefer to accept as many such keywords
5166 * as possible to minimize the impact of "reserved words" on programmers.
5167 * So, we divide names into several possible classes. The classification
5168 * is chosen in part to make keywords acceptable as names wherever possible.
5171 /* Column identifier --- names that can be column, table, etc names.
5173 ColId: ident { $$ = $1; }
5174 | unreserved_keyword { $$ = $1; }
5175 | col_name_keyword { $$ = $1; }
5176 | ECPGKeywords { $$ = $1; }
5177 | CHAR_P { $$ = make_str("char"); }
5180 /* Type identifier --- names that can be type names.
5182 type_name: ident { $$ = $1; }
5183 | unreserved_keyword { $$ = $1; }
5184 | ECPGKeywords { $$ = $1; }
5185 | ECPGTypeName { $$ = $1; }
5188 /* Function identifier --- names that can be function names.
5190 function_name: ident { $$ = $1; }
5191 | unreserved_keyword { $$ = $1; }
5192 | func_name_keyword { $$ = $1; }
5193 | ECPGKeywords { $$ = $1; }
5196 /* Column label --- allowed labels in "AS" clauses.
5197 * This presently includes *all* Postgres keywords.
5199 ColLabel: ECPGColLabel { $$ = $1; }
5200 | ECPGTypeName { $$ = $1; }
5201 | CHAR_P { $$ = make_str("char"); }
5202 | INT { $$ = make_str("int"); }
5203 | UNION { $$ = make_str("union"); }
5206 ECPGColLabelCommon: ident { $$ = $1; }
5207 | col_name_keyword { $$ = $1; }
5208 | func_name_keyword { $$ = $1; }
5211 ECPGColLabel: ECPGColLabelCommon { $$ = $1; }
5212 | unreserved_keyword { $$ = $1; }
5213 | reserved_keyword { $$ = $1; }
5214 | ECPGKeywords { $$ = $1; }
5218 * Keyword classification lists. Generally, every keyword present in
5219 * the Postgres grammar should appear in exactly one of these lists.
5221 * Put a new keyword into the first list that it can go into without causing
5222 * shift or reduce conflicts. The earlier lists define "less reserved"
5223 * categories of keywords.
5226 /* "Unreserved" keywords --- available for use as any kind of name.
5229 ABORT_P { $$ = make_str("abort"); }
5230 | ABSOLUTE { $$ = make_str("absolute"); }
5231 | ACCESS { $$ = make_str("access"); }
5232 | ACTION { $$ = make_str("action"); }
5233 | ADD { $$ = make_str("add"); }
5234 | AFTER { $$ = make_str("after"); }
5235 | AGGREGATE { $$ = make_str("aggregate"); }
5236 | ALTER { $$ = make_str("alter"); }
5237 | ASSERTION { $$ = make_str("assertion"); }
5238 | ASSIGNMENT { $$ = make_str("assignment"); }
5239 | AT { $$ = make_str("at"); }
5240 | BACKWARD { $$ = make_str("backward"); }
5241 | BEFORE { $$ = make_str("before"); }
5242 | BEGIN_P { $$ = make_str("begin"); }
5243 | BY { $$ = make_str("by"); }
5244 | CACHE { $$ = make_str("cache"); }
5245 | CASCADE { $$ = make_str("cascade"); }
5246 | CHAIN { $$ = make_str("chain"); }
5247 | CHARACTERISTICS { $$ = make_str("characteristics"); }
5248 | CHECKPOINT { $$ = make_str("checkpoint"); }
5249 | CLASS { $$ = make_str("class"); }
5250 | CLOSE { $$ = make_str("close"); }
5251 | CLUSTER { $$ = make_str("cluster"); }
5252 | COMMENT { $$ = make_str("comment"); }
5253 | COMMIT { $$ = make_str("commit"); }
5254 | COMMITTED { $$ = make_str("committed"); }
5255 | CONSTRAINTS { $$ = make_str("constraints"); }
5256 | CONVERSION_P { $$ = make_str("conversion"); }
5257 | COPY { $$ = make_str("copy"); }
5258 | CREATEDB { $$ = make_str("createdb"); }
5259 | CREATEUSER { $$ = make_str("createuser"); }
5260 | CURSOR { $$ = make_str("cursor"); }
5261 | CYCLE { $$ = make_str("cycle"); }
5262 | DATABASE { $$ = make_str("database"); }
5263 | DAY_P { $$ = make_str("day"); }
5264 | DEALLOCATE { $$ = make_str("deallocate"); }
5265 | DECLARE { $$ = make_str("declare"); }
5266 | DEFERRED { $$ = make_str("deferred"); }
5267 | DELETE_P { $$ = make_str("delete"); }
5268 | DELIMITER { $$ = make_str("delimiter"); }
5269 | DELIMITERS { $$ = make_str("delimiters"); }
5270 | DOMAIN_P { $$ = make_str("domain"); }
5271 | DOUBLE { $$ = make_str("double"); }
5272 | DROP { $$ = make_str("drop"); }
5273 | EACH { $$ = make_str("each"); }
5274 | ENCODING { $$ = make_str("encoding"); }
5275 | ENCRYPTED { $$ = make_str("encrypted"); }
5276 | ESCAPE { $$ = make_str("escape"); }
5277 | EXCLUSIVE { $$ = make_str("exclusive"); }
5278 | EXECUTE { $$ = make_str("execute"); }
5279 | EXPLAIN { $$ = make_str("explain"); }
5280 | FETCH { $$ = make_str("fetch"); }
5281 | FORCE { $$ = make_str("force"); }
5282 | FORWARD { $$ = make_str("forward"); }
5283 | FUNCTION { $$ = make_str("function"); }
5284 | GLOBAL { $$ = make_str("global"); }
5285 | HANDLER { $$ = make_str("handler"); }
5286 | HOUR_P { $$ = make_str("hour"); }
5287 | IMMEDIATE { $$ = make_str("immediate"); }
5288 | IMMUTABLE { $$ = make_str("immutable"); }
5289 | IMPLICIT_P { $$ = make_str("implicit"); }
5290 | INCREMENT { $$ = make_str("increment"); }
5291 | INDEX { $$ = make_str("index"); }
5292 | INHERITS { $$ = make_str("inherits"); }
5293 | INOUT { $$ = make_str("inout"); }
5294 | INSENSITIVE { $$ = make_str("insensitive"); }
5295 | INSERT { $$ = make_str("insert"); }
5296 | INSTEAD { $$ = make_str("instead"); }
5297 | ISOLATION { $$ = make_str("isolation"); }
5298 | KEY { $$ = make_str("key"); }
5299 | LANCOMPILER { $$ = make_str("lancompiler"); }
5300 | LANGUAGE { $$ = make_str("language"); }
5301 | LEVEL { $$ = make_str("level"); }
5302 | LISTEN { $$ = make_str("listen"); }
5303 | LOAD { $$ = make_str("load"); }
5304 | LOCAL { $$ = make_str("local"); }
5305 | LOCATION { $$ = make_str("location"); }
5306 | LOCK_P { $$ = make_str("lock"); }
5307 | MATCH { $$ = make_str("match"); }
5308 | MAXVALUE { $$ = make_str("maxvalue"); }
5309 | MINUTE_P { $$ = make_str("minute"); }
5310 | MINVALUE { $$ = make_str("minvalue"); }
5311 | MODE { $$ = make_str("mode"); }
5312 | MONTH_P { $$ = make_str("month"); }
5313 | MOVE { $$ = make_str("move"); }
5314 | NAMES { $$ = make_str("names"); }
5315 | NATIONAL { $$ = make_str("national"); }
5316 | NEXT { $$ = make_str("next"); }
5317 | NO { $$ = make_str("no"); }
5318 | NOCREATEDB { $$ = make_str("nocreatedb"); }
5319 | NOCREATEUSER { $$ = make_str("nocreateuser"); }
5320 | NOTHING { $$ = make_str("nothing"); }
5321 | NOTIFY { $$ = make_str("notify"); }
5322 | OF { $$ = make_str("of"); }
5323 | OIDS { $$ = make_str("oids"); }
5324 | OPERATOR { $$ = make_str("operator"); }
5325 | OPTION { $$ = make_str("option"); }
5326 | OUT_P { $$ = make_str("out"); }
5327 | OWNER { $$ = make_str("owner"); }
5328 | PARTIAL { $$ = make_str("partial"); }
5329 | PASSWORD { $$ = make_str("password"); }
5330 | PATH_P { $$ = make_str("path"); }
5331 | PENDANT { $$ = make_str("pendant"); }
5332 | PRECISION { $$ = make_str("precision"); }
5333 | PREPARE { $$ = make_str("prepare"); }
5334 | PRESERVE { $$ = make_str("preserver"); }
5335 | PRIOR { $$ = make_str("prior"); }
5336 | PRIVILEGES { $$ = make_str("privileges"); }
5337 | PROCEDURAL { $$ = make_str("procedural"); }
5338 | PROCEDURE { $$ = make_str("procedure"); }
5339 | READ { $$ = make_str("read"); }
5340 | RECHECK { $$ = make_str("recheck"); }
5341 | REINDEX { $$ = make_str("reindex"); }
5342 | RELATIVE { $$ = make_str("relative"); }
5343 | RENAME { $$ = make_str("rename"); }
5344 | REPLACE { $$ = make_str("replace"); }
5345 | RESET { $$ = make_str("reset"); }
5346 | RESTRICT { $$ = make_str("restrict"); }
5347 | RETURNS { $$ = make_str("returns"); }
5348 | REVOKE { $$ = make_str("revoke"); }
5349 | ROLLBACK { $$ = make_str("rollback"); }
5350 | ROWS { $$ = make_str("rows"); }
5351 | RULE { $$ = make_str("rule"); }
5352 | SCHEMA { $$ = make_str("schema"); }
5353 | SCROLL { $$ = make_str("scroll"); }
5354 | SECOND_P { $$ = make_str("second"); }
5355 | SESSION { $$ = make_str("session"); }
5356 | SEQUENCE { $$ = make_str("sequence"); }
5357 | SERIALIZABLE { $$ = make_str("serializable"); }
5358 | SET { $$ = make_str("set"); }
5359 | SHARE { $$ = make_str("share"); }
5360 | SHOW { $$ = make_str("show"); }
5361 | SIMPLE { $$ = make_str("simple"); }
5362 | STABLE { $$ = make_str("stable"); }
5363 | START { $$ = make_str("start"); }
5364 | STATEMENT { $$ = make_str("statement"); }
5365 | STATISTICS { $$ = make_str("statistics"); }
5366 | STDIN { $$ = make_str("stdin"); }
5367 | STDOUT { $$ = make_str("stdout"); }
5368 | STORAGE { $$ = make_str("storage"); }
5369 | SYSID { $$ = make_str("sysid"); }
5370 | TEMP { $$ = make_str("temp"); }
5371 | TEMPLATE { $$ = make_str("template"); }
5372 | TEMPORARY { $$ = make_str("temporary"); }
5373 | TOAST { $$ = make_str("toast"); }
5374 | TRANSACTION { $$ = make_str("transaction"); }
5375 | TRIGGER { $$ = make_str("trigger"); }
5376 | TRUNCATE { $$ = make_str("truncate"); }
5377 | TRUSTED { $$ = make_str("trusted"); }
5378 | TYPE_P { $$ = make_str("type"); }
5379 | UNENCRYPTED { $$ = make_str("unencrypted"); }
5380 | UNKNOWN { $$ = make_str("unknown"); }
5381 | UNLISTEN { $$ = make_str("unlisten"); }
5382 | UNTIL { $$ = make_str("until"); }
5383 | UPDATE { $$ = make_str("update"); }
5384 | USAGE { $$ = make_str("usage"); }
5385 | VACUUM { $$ = make_str("vacuum"); }
5386 | VALID { $$ = make_str("valid"); }
5387 | VALUES { $$ = make_str("values"); }
5388 | VARYING { $$ = make_str("varying"); }
5389 | VERSION { $$ = make_str("version"); }
5390 | VIEW { $$ = make_str("view"); }
5391 | WITH { $$ = make_str("with"); }
5392 | WITHOUT { $$ = make_str("without"); }
5393 | WRITE { $$ = make_str("write"); }
5394 | WORK { $$ = make_str("work"); }
5395 | YEAR_P { $$ = make_str("year"); }
5396 | ZONE { $$ = make_str("zone"); }
5399 /* Column identifier --- keywords that can be column, table, etc names.
5401 * Many of these keywords will in fact be recognized as type or function
5402 * names too; but they have special productions for the purpose, and so
5403 * can't be treated as "generic" type or function names.
5405 * The type names appearing here are not usable as function names
5406 * because they can be followed by '(' in typename productions, which
5407 * looks too much like a function call for an LR(1) parser.
5410 BIGINT { $$ = make_str("bigint");}
5411 | BIT { $$ = make_str("bit"); }
5412 /* CHAR must be excluded from ECPGColLabel because of conflict with UNSIGNED
5413 | CHAR_P { $$ = make_str("char"); }
5415 | CHARACTER { $$ = make_str("character"); }
5416 | COALESCE { $$ = make_str("coalesce"); }
5417 | CONVERT { $$ = make_str("convert"); }
5418 | DEC { $$ = make_str("dec"); }
5419 | DECIMAL { $$ = make_str("decimal"); }
5420 | EXISTS { $$ = make_str("exists"); }
5421 | EXTRACT { $$ = make_str("extract"); }
5422 | FLOAT_P { $$ = make_str("float"); }
5423 /* INT must be excluded from ECPGColLabel because of conflict
5424 | INT { $$ = make_str("int"); }
5426 | INTEGER { $$ = make_str("integer"); }
5427 | INTERVAL { $$ = make_str("interval"); }
5428 | NCHAR { $$ = make_str("nchar"); }
5429 | NONE { $$ = make_str("none"); }
5430 | NULLIF { $$ = make_str("nullif"); }
5431 | NUMERIC { $$ = make_str("numeric"); }
5432 | POSITION { $$ = make_str("position"); }
5433 | REAL { $$ = make_str("real"); }
5434 | ROW { $$ = make_str("row"); }
5435 | SETOF { $$ = make_str("setof"); }
5436 | SMALLINT { $$ = make_str("smallint"); }
5437 | SUBSTRING { $$ = make_str("substring"); }
5438 | TIME { $$ = make_str("time"); }
5439 | TIMESTAMP { $$ = make_str("timestamp"); }
5440 | TREAT { $$ = make_str("treat"); }
5441 | TRIM { $$ = make_str("trim"); }
5442 | VARCHAR { $$ = make_str("varchar"); }
5445 /* Function identifier --- keywords that can be function names.
5447 * Most of these are keywords that are used as operators in expressions;
5448 * in general such keywords can't be column names because they would be
5449 * ambiguous with variables, but they are unambiguous as function identifiers.
5451 * Do not include POSITION, SUBSTRING, etc here since they have explicit
5452 * productions in a_expr to support the goofy SQL9x argument syntax.
5453 * - thomas 2000-11-28
5456 AUTHORIZATION { $$ = make_str("authorization"); }
5457 | BETWEEN { $$ = make_str("between"); }
5458 | BINARY { $$ = make_str("binary"); }
5459 | CROSS { $$ = make_str("cross"); }
5460 | FREEZE { $$ = make_str("freeze"); }
5461 | FULL { $$ = make_str("full"); }
5462 | ILIKE { $$ = make_str("ilike"); }
5463 | IN_P { $$ = make_str("in"); }
5464 | INNER_P { $$ = make_str("inner"); }
5465 | IS { $$ = make_str("is"); }
5466 | ISNULL { $$ = make_str("isnull"); }
5467 | JOIN { $$ = make_str("join"); }
5468 | LEFT { $$ = make_str("left"); }
5469 | LIKE { $$ = make_str("like"); }
5470 | NATURAL { $$ = make_str("natural"); }
5471 | NOTNULL { $$ = make_str("notnull"); }
5472 | OUTER_P { $$ = make_str("outer"); }
5473 | OVERLAPS { $$ = make_str("overlaps"); }
5474 | RIGHT { $$ = make_str("right"); }
5475 | SIMILAR { $$ = make_str("similar"); }
5476 | VERBOSE { $$ = make_str("verbose"); }
5479 /* Reserved keyword --- these keywords are usable only as a ColLabel.
5481 * Keywords appear here if they could not be distinguished from variable,
5482 * type, or function names in some contexts. Don't put things here unless
5486 ALL { $$ = make_str("all"); }
5487 | ANALYSE { $$ = make_str("analyse"); } /* British */
5488 | ANALYZE { $$ = make_str("analyze"); }
5489 | AND { $$ = make_str("and"); }
5490 | ANY { $$ = make_str("any"); }
5491 | AS { $$ = make_str("as"); }
5492 | ASC { $$ = make_str("asc"); }
5493 | BOTH { $$ = make_str("both"); }
5494 | CASE { $$ = make_str("case"); }
5495 | CAST { $$ = make_str("cast"); }
5496 | CHECK { $$ = make_str("check"); }
5497 | COLLATE { $$ = make_str("collate"); }
5498 | COLUMN { $$ = make_str("column"); }
5499 | CONSTRAINT { $$ = make_str("constraint"); }
5500 | CREATE { $$ = make_str("create"); }
5501 | CURRENT_DATE { $$ = make_str("current_date"); }
5502 | CURRENT_TIME { $$ = make_str("current_time"); }
5503 | CURRENT_TIMESTAMP { $$ = make_str("current_timestamp"); }
5504 | CURRENT_USER { $$ = make_str("current_user"); }
5505 | DEFAULT { $$ = make_str("default"); }
5506 | DEFERRABLE { $$ = make_str("deferrable"); }
5507 | DESC { $$ = make_str("desc"); }
5508 | DISTINCT { $$ = make_str("distinct"); }
5509 | DO { $$ = make_str("do"); }
5510 | ELSE { $$ = make_str("else"); }
5511 | END_P { $$ = make_str("end"); }
5512 | EXCEPT { $$ = make_str("except"); }
5513 | FALSE_P { $$ = make_str("false"); }
5514 | FOR { $$ = make_str("for"); }
5515 | FOREIGN { $$ = make_str("foreign"); }
5516 | FROM { $$ = make_str("from"); }
5517 | GRANT { $$ = make_str("grant"); }
5518 | GROUP_P { $$ = make_str("group"); }
5519 | HAVING { $$ = make_str("having"); }
5520 | INITIALLY { $$ = make_str("initially"); }
5521 | INTERSECT { $$ = make_str("intersect"); }
5522 | INTO { $$ = make_str("into"); }
5523 | LEADING { $$ = make_str("leading"); }
5524 | LIMIT { $$ = make_str("limit"); }
5525 | NEW { $$ = make_str("new"); }
5526 | NOT { $$ = make_str("not"); }
5527 | NULL_P { $$ = make_str("null"); }
5528 | OFF { $$ = make_str("off"); }
5529 | OFFSET { $$ = make_str("offset"); }
5530 | OLD { $$ = make_str("old"); }
5531 | ON { $$ = make_str("on"); }
5532 | ONLY { $$ = make_str("only"); }
5533 | OR { $$ = make_str("or"); }
5534 | ORDER { $$ = make_str("order"); }
5535 | PRIMARY { $$ = make_str("primary"); }
5536 | REFERENCES { $$ = make_str("references"); }
5537 | SELECT { $$ = make_str("select"); }
5538 | SESSION_USER { $$ = make_str("session_user"); }
5539 | SOME { $$ = make_str("some"); }
5540 | TABLE { $$ = make_str("table"); }
5541 | THEN { $$ = make_str("then"); }
5542 | TO { $$ = make_str("to"); }
5543 | TRAILING { $$ = make_str("trailing"); }
5544 | TRUE_P { $$ = make_str("true"); }
5545 /* UNION must be excluded from ECPGColLabel because of conflict with s_union
5546 | UNION { $$ = make_str("union"); }
5548 | UNIQUE { $$ = make_str("unique"); }
5549 | USER { $$ = make_str("user"); }
5550 | USING { $$ = make_str("using"); }
5551 | WHEN { $$ = make_str("when"); }
5552 | WHERE { $$ = make_str("where"); }
5556 into_list : coutputvariable | into_list ',' coutputvariable
5559 ecpgstart: SQL_START { reset_variables(); }
5562 c_args: /*EMPTY*/ { $$ = EMPTY; }
5563 | c_list { $$ = $1; }
5566 coutputvariable: CVARIABLE indicator
5567 { add_variable(&argsresult, find_variable($1), find_variable($2)); }
5569 { add_variable(&argsresult, find_variable($1), &no_indicator); }
5573 civarind: CVARIABLE indicator
5575 if ($2 != NULL && (find_variable($2))->type->type == ECPGt_array)
5576 mmerror(PARSE_ERROR, ET_ERROR, "arrays of indicators are not allowed on input");
5578 add_variable(&argsinsert, find_variable($1), ($2 == NULL) ? &no_indicator : find_variable($2));
5584 add_variable(&argsinsert, find_variable($1), &no_indicator);
5589 indicator: CVARIABLE { check_indicator((find_variable($1))->type); $$ = $1; }
5590 | SQL_INDICATOR CVARIABLE { check_indicator((find_variable($2))->type); $$ = $2; }
5591 | SQL_INDICATOR name { check_indicator((find_variable($2))->type); $$ = $2; }
5594 ident: IDENT { $$ = $1; }
5595 | CSTRING { $$ = make3_str(make_str("\""), $1, make_str("\"")); }
5598 quoted_ident_stringvar: name
5599 { $$ = make3_str(make_str("\""), $1, make_str("\"")); }
5601 { $$ = make3_str(make_str("("), $1, make_str(")")); }
5608 c_stuff_item: c_anything { $$ = $1; }
5609 | '(' ')' { $$ = make_str("()"); }
5611 { $$ = cat_str(3, make_str("("), $2, make_str(")")); }
5614 c_stuff: c_stuff_item { $$ = $1; }
5615 | c_stuff c_stuff_item
5616 { $$ = cat2_str($1, $2); }
5619 c_list: c_term { $$ = $1; }
5620 | c_list ',' c_term { $$ = cat_str(3, $1, make_str(","), $3); }
5623 c_term: c_stuff { $$ = $1; }
5624 | '{' c_list '}' { $$ = cat_str(3, make_str("{"), $2, make_str("}")); }
5627 c_thing: c_anything { $$ = $1; }
5628 | '(' { $$ = make_str("("); }
5629 | ')' { $$ = make_str(")"); }
5630 | ',' { $$ = make_str(","); }
5631 | ';' { $$ = make_str(";"); }
5634 c_anything: IDENT { $$ = $1; }
5635 | CSTRING { $$ = make3_str(make_str("\""), $1, make_str("\"")); }
5636 | PosIntConst { $$ = $1; }
5637 | Fconst { $$ = $1; }
5638 | Sconst { $$ = $1; }
5639 | '*' { $$ = make_str("*"); }
5640 | '+' { $$ = make_str("+"); }
5641 | '-' { $$ = make_str("-"); }
5642 | '/' { $$ = make_str("/"); }
5643 | '%' { $$ = make_str("%"); }
5644 | NULL_P { $$ = make_str("NULL"); }
5645 | S_ADD { $$ = make_str("+="); }
5646 | S_AND { $$ = make_str("&&"); }
5647 | S_ANYTHING { $$ = make_name(); }
5648 | S_AUTO { $$ = make_str("auto"); }
5649 | S_CONST { $$ = make_str("const"); }
5650 | S_DEC { $$ = make_str("--"); }
5651 | S_DIV { $$ = make_str("/="); }
5652 | S_DOTPOINT { $$ = make_str(".*"); }
5653 | S_EQUAL { $$ = make_str("=="); }
5654 | S_EXTERN { $$ = make_str("extern"); }
5655 | S_INC { $$ = make_str("++"); }
5656 | S_LSHIFT { $$ = make_str("<<"); }
5657 | S_MEMBER { $$ = make_str("->"); }
5658 | S_MEMPOINT { $$ = make_str("->*"); }
5659 | S_MOD { $$ = make_str("%="); }
5660 | S_MUL { $$ = make_str("*="); }
5661 | S_NEQUAL { $$ = make_str("!="); }
5662 | S_OR { $$ = make_str("||"); }
5663 | S_REGISTER { $$ = make_str("register"); }
5664 | S_RSHIFT { $$ = make_str(">>"); }
5665 | S_STATIC { $$ = make_str("static"); }
5666 | S_SUB { $$ = make_str("-="); }
5667 | S_TYPEDEF { $$ = make_str("typedef"); }
5668 | SQL_BOOL { $$ = make_str("bool"); }
5669 | SQL_ENUM { $$ = make_str("enum"); }
5670 | INT { $$ = make_str("int"); }
5671 | SQL_LONG { $$ = make_str("long"); }
5672 | SQL_SHORT { $$ = make_str("short"); }
5673 | SQL_SIGNED { $$ = make_str("signed"); }
5674 | SQL_STRUCT { $$ = make_str("struct"); }
5675 | SQL_UNSIGNED { $$ = make_str("unsigned"); }
5676 | CHAR_P { $$ = make_str("char"); }
5677 | DOUBLE { $$ = make_str("double"); }
5678 | FLOAT_P { $$ = make_str("float"); }
5679 | UNION { $$ = make_str("union"); }
5680 | VARCHAR { $$ = make_str("varchar"); }
5681 | '[' { $$ = make_str("["); }
5682 | ']' { $$ = make_str("]"); }
5683 | '=' { $$ = make_str("="); }
5688 void yyerror( char * error)
5692 snprintf(buf,sizeof buf,"%s at or near \"%s\"", error, token_start ? token_start : yytext);
5693 buf[sizeof(buf)-1]=0;
5694 mmerror(PARSE_ERROR, ET_ERROR, buf);