1 /* Copyright comment */
4 #include "access/htup.h"
5 #include "catalog/catname.h"
6 #include "utils/numeric.h"
7 #include "utils/memutils.h"
8 #include "storage/bufpage.h"
13 #include "mb/pg_wchar.h"
16 #define STRUCT_DEPTH 128
19 * Variables containing simple states.
23 static char *connection = NULL;
24 static int QueryIsRule = 0, ForUpdateNotAllowed = 0;
25 static struct this_type actual_type[STRUCT_DEPTH];
26 static char *actual_storage[STRUCT_DEPTH];
28 /* temporarily store struct members while creating the data structure */
29 struct ECPGstruct_member *struct_member_list[STRUCT_DEPTH] = { NULL };
31 struct ECPGtype ecpg_no_indicator = {ECPGt_NO_INDICATOR, 0L, {NULL}};
32 struct variable no_indicator = {"no_indicator", &ecpg_no_indicator, 0, NULL};
34 struct ECPGtype ecpg_query = {ECPGt_char_variable, 0L, {NULL}};
37 * Handle the filename and line numbering.
39 char * input_filename = NULL;
45 fprintf(yyout, "\n#line %d \"%s\"\n", yylineno + 1, input_filename);
49 output_simple_statement(char *cmd)
57 * store the whenever action here
59 static struct when when_error, when_nf, when_warn;
62 print_action(struct when *w)
66 case W_SQLPRINT: fprintf(yyout, "sqlprint();");
68 case W_GOTO: fprintf(yyout, "goto %s;", w->command);
70 case W_DO: fprintf(yyout, "%s;", w->command);
72 case W_STOP: fprintf(yyout, "exit (1);");
74 case W_BREAK: fprintf(yyout, "break;");
76 default: fprintf(yyout, "{/* %d not implemented yet */}", w->code);
82 whenever_action(int mode)
84 if ((mode&1) == 1 && when_nf.code != W_NOTHING)
87 fprintf(yyout, "\nif (sqlca.sqlcode == ECPG_NOT_FOUND) ");
88 print_action(&when_nf);
90 if (when_warn.code != W_NOTHING)
93 fprintf(yyout, "\nif (sqlca.sqlwarn[0] == 'W') ");
94 print_action(&when_warn);
96 if (when_error.code != W_NOTHING)
99 fprintf(yyout, "\nif (sqlca.sqlcode < 0) ");
100 print_action(&when_error);
104 output_line_number();
108 * Handling of variables.
112 * brace level counter
116 static struct variable * allvariables = NULL;
118 static struct variable *
119 new_variable(const char * name, struct ECPGtype * type)
121 struct variable * p = (struct variable*) mm_alloc(sizeof(struct variable));
123 p->name = mm_strdup(name);
125 p->brace_level = braces_open;
127 p->next = allvariables;
133 static struct variable * find_variable(char * name);
135 static struct variable *
136 find_struct_member(char *name, char *str, struct ECPGstruct_member *members)
138 char *next = strchr(++str, '.'), c = '\0';
146 for (; members; members = members->next)
148 if (strcmp(members->name, str) == 0)
153 switch (members->typ->typ)
156 return(new_variable(name, ECPGmake_array_type(members->typ->u.element, members->typ->size)));
159 return(new_variable(name, ECPGmake_struct_type(members->typ->u.members, members->typ->typ)));
161 return(new_variable(name, ECPGmake_simple_type(members->typ->typ, members->typ->size)));
170 return(find_struct_member(name, next, members->typ->u.element->u.members));
172 else return(find_struct_member(name, next, members->typ->u.members));
180 static struct variable *
181 find_struct(char * name, char *next)
186 /* first get the mother structure entry */
188 p = find_variable(name);
192 if (p->type->typ != ECPGt_struct && p->type->typ != ECPGt_union)
194 sprintf(errortext, "variable %s is not a pointer", name);
198 if (p->type->u.element->typ != ECPGt_struct && p->type->u.element->typ != ECPGt_union)
200 sprintf(errortext, "variable %s is not a pointer to a structure or a union", name);
204 /* restore the name, we will need it later on */
208 return find_struct_member(name, next, p->type->u.element->u.members);
212 if (p->type->typ != ECPGt_struct && p->type->typ != ECPGt_union)
214 sprintf(errortext, "variable %s is neither a structure nor a union", name);
218 /* restore the name, we will need it later on */
221 return find_struct_member(name, next, p->type->u.members);
225 static struct variable *
226 find_simple(char * name)
230 for (p = allvariables; p; p = p->next)
232 if (strcmp(p->name, name) == 0)
239 /* Note that this function will end the program in case of an unknown */
241 static struct variable *
242 find_variable(char * name)
247 if ((next = strchr(name, '.')) != NULL)
248 p = find_struct(name, next);
249 else if ((next = strstr(name, "->")) != NULL)
250 p = find_struct(name, next);
252 p = find_simple(name);
256 sprintf(errortext, "The variable %s is not declared", name);
264 remove_variables(int brace_level)
266 struct variable * p, *prev;
268 for (p = prev = allvariables; p; p = p ? p->next : NULL)
270 if (p->brace_level >= brace_level)
273 if (p == allvariables)
274 prev = allvariables = p->next;
276 prev->next = p->next;
278 ECPGfree_type(p->type);
290 * Here are the variables that need to be handled on every request.
291 * These are of two kinds: input and output.
292 * I will make two lists for them.
295 struct arguments * argsinsert = NULL;
296 struct arguments * argsresult = NULL;
299 reset_variables(void)
306 /* Add a variable to a request. */
308 add_variable(struct arguments ** list, struct variable * var, struct variable * ind)
310 struct arguments * p = (struct arguments *)mm_alloc(sizeof(struct arguments));
318 /* Dump out a list of all the variable on this list.
319 This is a recursive function that works from the end of the list and
320 deletes the list as we go on.
323 dump_variables(struct arguments * list, int mode)
330 /* The list is build up from the beginning so lets first dump the
334 dump_variables(list->next, mode);
336 /* Then the current element and its indicator */
337 ECPGdump_a_type(yyout, list->variable->name, list->variable->type,
338 (list->indicator->type->typ != ECPGt_NO_INDICATOR) ? list->indicator->name : NULL,
339 (list->indicator->type->typ != ECPGt_NO_INDICATOR) ? list->indicator->type : NULL, NULL, NULL);
341 /* Then release the list element. */
347 check_indicator(struct ECPGtype *var)
349 /* make sure this is a valid indicator variable */
352 struct ECPGstruct_member *p;
357 case ECPGt_unsigned_short:
358 case ECPGt_unsigned_int:
359 case ECPGt_unsigned_long:
364 for (p = var->u.members; p; p = p->next)
365 check_indicator(p->typ);
369 check_indicator(var->u.element);
372 yyerror ("indicator variable must be integer type");
378 make1_str(const char *str)
380 char * res_str = (char *)mm_alloc(strlen(str) + 1);
382 strcpy(res_str, str);
387 make2_str(char *str1, char *str2)
389 char * res_str = (char *)mm_alloc(strlen(str1) + strlen(str2) + 1);
391 strcpy(res_str, str1);
392 strcat(res_str, str2);
399 cat2_str(char *str1, char *str2)
401 char * res_str = (char *)mm_alloc(strlen(str1) + strlen(str2) + 2);
403 strcpy(res_str, str1);
404 strcat(res_str, " ");
405 strcat(res_str, str2);
412 make3_str(char *str1, char *str2, char * str3)
414 char * res_str = (char *)mm_alloc(strlen(str1) + strlen(str2) + strlen(str3) + 1);
416 strcpy(res_str, str1);
417 strcat(res_str, str2);
418 strcat(res_str, str3);
426 cat3_str(char *str1, char *str2, char * str3)
428 char * res_str = (char *)mm_alloc(strlen(str1) + strlen(str2) + strlen(str3) + 3);
430 strcpy(res_str, str1);
431 strcat(res_str, " ");
432 strcat(res_str, str2);
433 strcat(res_str, " ");
434 strcat(res_str, str3);
442 make4_str(char *str1, char *str2, char *str3, char *str4)
444 char * res_str = (char *)mm_alloc(strlen(str1) + strlen(str2) + strlen(str3) + strlen(str4) + 1);
446 strcpy(res_str, str1);
447 strcat(res_str, str2);
448 strcat(res_str, str3);
449 strcat(res_str, str4);
458 cat4_str(char *str1, char *str2, char *str3, char *str4)
460 char * res_str = (char *)mm_alloc(strlen(str1) + strlen(str2) + strlen(str3) + strlen(str4) + 4);
462 strcpy(res_str, str1);
463 strcat(res_str, " ");
464 strcat(res_str, str2);
465 strcat(res_str, " ");
466 strcat(res_str, str3);
467 strcat(res_str, " ");
468 strcat(res_str, str4);
477 make5_str(char *str1, char *str2, char *str3, char *str4, char *str5)
479 char * res_str = (char *)mm_alloc(strlen(str1) + strlen(str2) + strlen(str3) + strlen(str4) + strlen(str5) + 1);
481 strcpy(res_str, str1);
482 strcat(res_str, str2);
483 strcat(res_str, str3);
484 strcat(res_str, str4);
485 strcat(res_str, str5);
495 cat5_str(char *str1, char *str2, char *str3, char *str4, char *str5)
497 char * res_str = (char *)mm_alloc(strlen(str1) + strlen(str2) + strlen(str3) + strlen(str4) + strlen(str5) + 5);
499 strcpy(res_str, str1);
500 strcat(res_str, " ");
501 strcat(res_str, str2);
502 strcat(res_str, " ");
503 strcat(res_str, str3);
504 strcat(res_str, " ");
505 strcat(res_str, str4);
506 strcat(res_str, " ");
507 strcat(res_str, str5);
519 char * name = (char *)mm_alloc(yyleng + 1);
521 strncpy(name, yytext, yyleng);
527 output_statement(char * stmt, int mode)
529 int i, j=strlen(stmt);
531 fprintf(yyout, "{ ECPGdo(__LINE__, %s, \"", connection ? connection : "NULL");
533 /* do this char by char as we have to filter '\"' */
534 for (i = 0;i < j; i++)
536 fputc(stmt[i], yyout);
537 fputs("\", ", yyout);
539 /* dump variables to C file*/
540 dump_variables(argsinsert, 1);
541 fputs("ECPGt_EOIT, ", yyout);
542 dump_variables(argsresult, 1);
543 fputs("ECPGt_EORT);", yyout);
545 whenever_action(mode);
547 if (connection != NULL)
551 static struct typedefs *
552 get_typedef(char *name)
554 struct typedefs *this;
556 for (this = types; this && strcmp(this->name, name); this = this->next);
559 sprintf(errortext, "invalid datatype '%s'", name);
567 adjust_array(enum ECPGttype type_enum, int *dimension, int *length, int type_dimension, int type_index, bool pointer)
572 yyerror("No multi-dimensional array support");
574 *length = type_index;
577 if (type_dimension >= 0)
579 if (*dimension >= 0 && *length >= 0)
580 yyerror("No multi-dimensional array support");
583 *length = *dimension;
585 *dimension = type_dimension;
588 if (*length >= 0 && *dimension >= 0 && pointer)
589 yyerror("No multi-dimensional array support");
595 /* pointer has to get dimension 0 */
598 *length = *dimension;
603 yyerror("No multi-dimensional array support for structures");
607 /* pointer has to get dimension 0 */
611 /* one index is the string length */
614 *length = *dimension;
620 case ECPGt_unsigned_char:
621 /* pointer has to get length 0 */
625 /* one index is the string length */
628 *length = (*dimension < 0) ? 1 : *dimension;
634 /* a pointer has dimension = 0 */
636 *length = *dimension;
641 yyerror("No multi-dimensional array support for simple data types");
656 struct this_type type;
657 enum ECPGttype type_enum;
660 /* special embedded SQL token */
661 %token SQL_AT SQL_AUTOCOMMIT SQL_BOOL SQL_BREAK
662 %token SQL_CALL SQL_CONNECT SQL_CONNECTION SQL_CONTINUE
663 %token SQL_DEALLOCATE SQL_DISCONNECT SQL_ENUM
664 %token SQL_FOUND SQL_FREE SQL_GO SQL_GOTO
665 %token SQL_IDENTIFIED SQL_IMMEDIATE SQL_INDICATOR SQL_INT SQL_LONG
666 %token SQL_OFF SQL_OPEN SQL_PREPARE SQL_RELEASE SQL_REFERENCE
667 %token SQL_SECTION SQL_SHORT SQL_SIGNED SQL_SQLERROR SQL_SQLPRINT
668 %token SQL_SQLWARNING SQL_START SQL_STOP SQL_STRUCT SQL_UNSIGNED
669 %token SQL_VAR SQL_WHENEVER
672 %token S_ANYTHING S_AUTO S_BOOL S_CHAR S_CONST S_DOUBLE S_ENUM S_EXTERN
673 %token S_FLOAT S_INT S
674 %token S_LONG S_REGISTER S_SHORT S_SIGNED S_STATIC S_STRUCT
675 %token S_UNION S_UNSIGNED S_VARCHAR
677 /* I need this and don't know where it is defined inside the backend */
680 /* Keywords (in SQL92 reserved words) */
681 %token ABSOLUTE, ACTION, ADD, ALL, ALTER, AND, ANY, AS, ASC,
682 BEGIN_TRANS, BETWEEN, BOTH, BY,
683 CASCADE, CASE, CAST, CHAR, CHARACTER, CHECK, CLOSE,
684 COALESCE, COLLATE, COLUMN, COMMIT,
685 CONSTRAINT, CREATE, CROSS, CURRENT, CURRENT_DATE, CURRENT_TIME,
686 CURRENT_TIMESTAMP, CURRENT_USER, CURSOR,
687 DAY_P, DECIMAL, DECLARE, DEFAULT, DELETE, DESC, DISTINCT, DOUBLE, DROP,
688 ELSE, END_TRANS, EXCEPT, EXECUTE, EXISTS, EXTRACT,
689 FALSE_P, FETCH, FLOAT, FOR, FOREIGN, FROM, FULL,
690 GLOBAL, GRANT, GROUP, HAVING, HOUR_P,
691 IN, INNER_P, INSENSITIVE, INSERT, INTERSECT, INTERVAL, INTO, IS,
692 ISOLATION, JOIN, KEY, LANGUAGE, LEADING, LEFT, LEVEL, LIKE, LOCAL,
693 MATCH, MINUTE_P, MONTH_P, NAMES,
694 NATIONAL, NATURAL, NCHAR, NEXT, NO, NOT, NULLIF, NULL_P, NUMERIC,
695 OF, ON, ONLY, OPTION, OR, ORDER, OUTER_P,
696 PARTIAL, POSITION, PRECISION, PRIMARY, PRIOR, PRIVILEGES, PROCEDURE, PUBLIC,
697 READ, REFERENCES, RELATIVE, REVOKE, RIGHT, ROLLBACK,
698 SCROLL, SECOND_P, SELECT, SET, SUBSTRING,
699 TABLE, TEMP, TEMPORARY, THEN, TIME, TIMESTAMP, TIMEZONE_HOUR,
700 TIMEZONE_MINUTE, TO, TRAILING, TRANSACTION, TRIM, TRUE_P,
701 UNION, UNIQUE, UPDATE, USER, USING,
702 VALUES, VARCHAR, VARYING, VIEW,
703 WHEN, WHERE, WITH, WORK, YEAR_P, ZONE
705 /* Keywords (in SQL3 reserved words) */
708 /* Keywords (in SQL92 non-reserved words) */
709 %token COMMITTED, SERIALIZABLE, TYPE_P
711 /* Keywords for Postgres support (not in SQL92 reserved words)
713 * The CREATEDB and CREATEUSER tokens should go away
714 * when some sort of pg_privileges relation is introduced.
715 * - Todd A. Brandys 1998-01-01?
717 %token ABORT_TRANS, ACCESS, AFTER, AGGREGATE, ANALYZE,
718 BACKWARD, BEFORE, BINARY,
719 CACHE, CLUSTER, COPY, CREATEDB, CREATEUSER, CYCLE,
720 DATABASE, DELIMITERS, DO,
721 EACH, ENCODING, EXCLUSIVE, EXPLAIN, EXTEND,
722 FORWARD, FUNCTION, HANDLER,
723 INCREMENT, INDEX, INHERITS, INSTEAD, ISNULL,
724 LANCOMPILER, LIMIT, LISTEN, UNLISTEN, LOAD, LOCATION, LOCK_P,
725 MAXVALUE, MINVALUE, MODE, MOVE,
726 NEW, NOCREATEDB, NOCREATEUSER, NONE, NOTHING, NOTIFY, NOTNULL,
727 OFFSET, OIDS, OPERATOR, PASSWORD, PROCEDURAL,
728 RENAME, RESET, RETURNS, ROW, RULE,
729 SERIAL, SEQUENCE, SETOF, SHARE, SHOW, START, STATEMENT, STDIN, STDOUT,
731 UNLISTEN, UNTIL, VACUUM, VALID, VERBOSE, VERSION
733 /* Special keywords, not in the query language - see the "lex" file */
734 %token <str> IDENT SCONST Op CSTRING CVARIABLE CPP_LINE
735 %token <ival> ICONST PARAM
738 /* these are not real. they are here so that they get generated as #define's*/
750 %left Op /* multi-character ops and user-defined operators */
758 %left '|' /* this is the relation union op, not logical or */
759 /* Unary Operators */
761 %left ';' /* end of statement or natural log */
766 %left UNION INTERSECT EXCEPT
768 %type <str> Iconst Fconst Sconst TransactionStmt CreateStmt UserId
769 %type <str> CreateAsElement OptCreateAs CreateAsList CreateAsStmt
770 %type <str> OptInherit key_reference key_action
771 %type <str> key_match constraint_expr ColLabel SpecialRuleRelation
772 %type <str> ColId default_expr ColQualifier columnDef ColQualList
773 %type <str> ColConstraint ColConstraintElem default_list NumericOnly FloatOnly
774 %type <str> OptTableElementList OptTableElement TableConstraint
775 %type <str> ConstraintElem key_actions constraint_list ColPrimaryKey
776 %type <str> target_list target_el update_target_list
777 %type <str> update_target_el opt_id relation_name database_name
778 %type <str> access_method attr_name class index_name name func_name
779 %type <str> file_name AexprConst ParamNo TypeId
780 %type <str> in_expr_nodes a_expr b_expr
781 %type <str> opt_indirection expr_list extract_list extract_arg
782 %type <str> position_list substr_list substr_from
783 %type <str> trim_list in_expr substr_for attr attrs
784 %type <str> Typename SimpleTypename Generic Numeric generic opt_float opt_numeric
785 %type <str> opt_decimal Character character opt_varying opt_charset
786 %type <str> opt_collate Datetime datetime opt_timezone opt_interval
787 %type <str> numeric a_expr_or_null row_expr row_descriptor row_list
788 %type <str> SelectStmt SubSelect result OptTemp OptTempType OptTempScope
789 %type <str> opt_table opt_union opt_unique sort_clause sortby_list
790 %type <str> sortby OptUseOp opt_inh_star relation_name_list name_list
791 %type <str> group_clause having_clause from_clause c_list
792 %type <str> table_list join_outer where_clause relation_expr row_op sub_type
793 %type <str> opt_column_list insert_rest InsertStmt OptimizableStmt
794 %type <str> columnList DeleteStmt LockStmt UpdateStmt CursorStmt
795 %type <str> NotifyStmt columnElem copy_dirn c_expr UnlistenStmt
796 %type <str> copy_delimiter ListenStmt CopyStmt copy_file_name opt_binary
797 %type <str> opt_with_copy FetchStmt opt_direction fetch_how_many opt_portal_name
798 %type <str> ClosePortalStmt DestroyStmt VacuumStmt opt_verbose
799 %type <str> opt_analyze opt_va_list va_list ExplainStmt index_params
800 %type <str> index_list func_index index_elem opt_type opt_class access_method_clause
801 %type <str> index_opt_unique IndexStmt set_opt func_return def_rest
802 %type <str> func_args_list func_args opt_with ProcedureStmt def_arg
803 %type <str> def_elem def_list definition def_name def_type DefineStmt
804 %type <str> opt_instead event event_object RuleActionList,
805 %type <str> RuleActionBlock RuleActionMulti join_list
806 %type <str> RuleStmt opt_column opt_name oper_argtypes
807 %type <str> MathOp RemoveFuncStmt aggr_argtype for_update_clause
808 %type <str> RemoveAggrStmt remove_type RemoveStmt ExtendStmt
809 %type <str> RemoveOperStmt RenameStmt all_Op user_valid_clause
810 %type <str> VariableSetStmt var_value zone_value VariableShowStmt
811 %type <str> VariableResetStmt AddAttrStmt alter_clause DropUserStmt
812 %type <str> user_passwd_clause user_createdb_clause opt_trans
813 %type <str> user_createuser_clause user_group_list user_group_clause
814 %type <str> CreateUserStmt AlterUserStmt CreateSeqStmt OptSeqList
815 %type <str> OptSeqElem TriggerForSpec TriggerForOpt TriggerForType
816 %type <str> DropTrigStmt TriggerOneEvent TriggerEvents RuleActionStmt
817 %type <str> TriggerActionTime CreateTrigStmt DropPLangStmt PLangTrusted
818 %type <str> CreatePLangStmt IntegerOnly TriggerFuncArgs TriggerFuncArg
819 %type <str> ViewStmt LoadStmt CreatedbStmt opt_database1 opt_database2 location
820 %type <str> DestroydbStmt ClusterStmt grantee RevokeStmt encoding
821 %type <str> GrantStmt privileges operation_commalist operation
822 %type <str> opt_cursor opt_lmode
823 %type <str> case_expr when_clause_list case_default case_arg when_clause
824 %type <str> select_clause opt_select_limit select_limit_value
825 %type <str> select_offset_value table_list using_expr join_expr
826 %type <str> using_list from_expr table_expr join_clause join_type
827 %type <str> join_qual update_list join_clause join_clause_with_union
828 %type <str> opt_level opt_lock lock_type
830 %type <str> ECPGWhenever ECPGConnect connection_target ECPGOpen opt_using
831 %type <str> indicator ECPGExecute ecpg_expr dotext ECPGPrepare
832 %type <str> storage_clause opt_initializer vartext c_anything blockstart
833 %type <str> blockend variable_list variable var_anything do_anything
834 %type <str> opt_pointer cvariable ECPGDisconnect dis_name
835 %type <str> stmt symbol opt_symbol ECPGRelease execstring server_name
836 %type <str> connection_object opt_server opt_port c_thing opt_reference
837 %type <str> user_name opt_user char_variable ora_user ident
838 %type <str> db_prefix server opt_options opt_connection_name
839 %type <str> ECPGSetConnection c_line cpp_line s_enum ECPGTypedef
840 %type <str> enum_type civariableonly ECPGCursorStmt ECPGDeallocate
841 %type <str> ECPGFree ECPGDeclare ECPGVar sql_variable_declarations
842 %type <str> sql_declaration sql_variable_list sql_variable opt_at
843 %type <str> struct_type s_struct declaration variable_declarations
844 %type <str> s_struct s_union union_type ECPGSetAutocommit on_off
846 %type <type_enum> simple_type varchar_type
848 %type <type> type ctype
850 %type <action> action
852 %type <index> opt_array_bounds opt_type_array_bounds
858 statements: /* empty */
859 | statements statement
861 statement: ecpgstart opt_at stmt ';' { connection = NULL; }
864 | c_thing { fprintf(yyout, "%s", $1); free($1); }
865 | cpp_line { fprintf(yyout, "%s", $1); free($1); }
866 | blockstart { fputs($1, yyout); free($1); }
867 | blockend { fputs($1, yyout); free($1); }
869 opt_at: SQL_AT connection_target { connection = $2; }
871 stmt: AddAttrStmt { output_statement($1, 0); }
872 | AlterUserStmt { output_statement($1, 0); }
873 | ClosePortalStmt { output_statement($1, 0); }
874 | CopyStmt { output_statement($1, 0); }
875 | CreateStmt { output_statement($1, 0); }
876 | CreateAsStmt { output_statement($1, 0); }
877 | CreateSeqStmt { output_statement($1, 0); }
878 | CreatePLangStmt { output_statement($1, 0); }
879 | CreateTrigStmt { output_statement($1, 0); }
880 | CreateUserStmt { output_statement($1, 0); }
881 | ClusterStmt { output_statement($1, 0); }
882 | DefineStmt { output_statement($1, 0); }
883 | DestroyStmt { output_statement($1, 0); }
884 | DropPLangStmt { output_statement($1, 0); }
885 | DropTrigStmt { output_statement($1, 0); }
886 | DropUserStmt { output_statement($1, 0); }
887 | ExtendStmt { output_statement($1, 0); }
888 | ExplainStmt { output_statement($1, 0); }
889 | FetchStmt { output_statement($1, 1); }
890 | GrantStmt { output_statement($1, 0); }
891 | IndexStmt { output_statement($1, 0); }
892 | ListenStmt { output_statement($1, 0); }
893 | UnlistenStmt { output_statement($1, 0); }
894 | LockStmt { output_statement($1, 0); }
895 | ProcedureStmt { output_statement($1, 0); }
896 | RemoveAggrStmt { output_statement($1, 0); }
897 | RemoveOperStmt { output_statement($1, 0); }
898 | RemoveFuncStmt { output_statement($1, 0); }
899 | RemoveStmt { output_statement($1, 0); }
900 | RenameStmt { output_statement($1, 0); }
901 | RevokeStmt { output_statement($1, 0); }
903 if (strncmp($1, "/* " , sizeof("/* ")-1) == 0)
904 output_simple_statement($1);
906 output_statement($1, 1);
908 | RuleStmt { output_statement($1, 0); }
910 fprintf(yyout, "{ ECPGtrans(__LINE__, %s, \"%s\");", connection ? connection : "NULL", $1);
914 | ViewStmt { output_statement($1, 0); }
915 | LoadStmt { output_statement($1, 0); }
916 | CreatedbStmt { output_statement($1, 0); }
917 | DestroydbStmt { output_statement($1, 0); }
918 | VacuumStmt { output_statement($1, 0); }
919 | VariableSetStmt { output_statement($1, 0); }
920 | VariableShowStmt { output_statement($1, 0); }
921 | VariableResetStmt { output_statement($1, 0); }
924 yyerror("no at option for connect statement.\n");
926 fprintf(yyout, "{ ECPGconnect(__LINE__, %s, %d);", $1, autocommit);
931 output_simple_statement($1);
935 yyerror("no at option for connect statement.\n");
943 output_simple_statement($1);
947 yyerror("no at option for disconnect statement.\n");
949 fprintf(yyout, "{ ECPGdisconnect(__LINE__, \"%s\");", $1);
954 output_statement($1, 0);
957 fprintf(yyout, "{ ECPGdeallocate(__LINE__, %s, \"%s\");", connection ? connection : "NULL", $1);
964 for (ptr = cur; ptr != NULL; ptr=ptr->next)
966 if (strcmp(ptr->name, $1) == 0)
972 sprintf(errortext, "trying to open undeclared cursor %s\n", $1);
976 fprintf(yyout, "{ ECPGdo(__LINE__, %s, \"%s\",", ptr->connection ? ptr->connection : "NULL", ptr->command);
977 /* dump variables to C file*/
978 dump_variables(ptr->argsinsert, 0);
979 dump_variables(argsinsert, 0);
980 fputs("ECPGt_EOIT, ", yyout);
981 dump_variables(ptr->argsresult, 0);
982 fputs("ECPGt_EORT);", yyout);
988 yyerror("no at option for set connection statement.\n");
990 fprintf(yyout, "{ ECPGprepare(__LINE__, %s);", $1);
994 | ECPGRelease { /* output already done */ }
995 | ECPGSetAutocommit {
996 fprintf(yyout, "{ ECPGsetcommit(__LINE__, \"%s\", %s);", $1, connection ? connection : "NULL");
1000 | ECPGSetConnection {
1002 yyerror("no at option for set connection statement.\n");
1004 fprintf(yyout, "{ ECPGsetconn(__LINE__, %s);", $1);
1010 yyerror("no at option for typedef statement.\n");
1012 output_simple_statement($1);
1016 yyerror("no at option for var statement.\n");
1018 output_simple_statement($1);
1022 yyerror("no at option for whenever statement.\n");
1024 output_simple_statement($1);
1030 * We start with a lot of stuff that's very similar to the backend's parsing
1033 /*****************************************************************************
1035 * Create a new Postgres DBMS user
1038 *****************************************************************************/
1040 CreateUserStmt: CREATE USER UserId user_passwd_clause user_createdb_clause
1041 user_createuser_clause user_group_clause user_valid_clause
1043 $$ = cat3_str(cat5_str(make1_str("create user"), $3, $4, $5, $6), $7, $8);
1047 /*****************************************************************************
1049 * Alter a postresql DBMS user
1052 *****************************************************************************/
1054 AlterUserStmt: ALTER USER UserId user_passwd_clause user_createdb_clause
1055 user_createuser_clause user_group_clause user_valid_clause
1057 $$ = cat3_str(cat5_str(make1_str("alter user"), $3, $4, $5, $6), $7, $8);
1061 /*****************************************************************************
1063 * Drop a postresql DBMS user
1066 *****************************************************************************/
1068 DropUserStmt: DROP USER UserId
1070 $$ = cat2_str(make1_str("drop user"), $3);
1074 user_passwd_clause: WITH PASSWORD UserId { $$ = cat2_str(make1_str("with password") , $3); }
1075 | /*EMPTY*/ { $$ = make1_str(""); }
1078 user_createdb_clause: CREATEDB
1080 $$ = make1_str("createdb");
1084 $$ = make1_str("nocreatedb");
1086 | /*EMPTY*/ { $$ = make1_str(""); }
1089 user_createuser_clause: CREATEUSER
1091 $$ = make1_str("createuser");
1095 $$ = make1_str("nocreateuser");
1097 | /*EMPTY*/ { $$ = NULL; }
1100 user_group_list: user_group_list ',' UserId
1102 $$ = cat3_str($1, make1_str(","), $3);
1110 user_group_clause: IN GROUP user_group_list { $$ = cat2_str(make1_str("in group"), $3); }
1111 | /*EMPTY*/ { $$ = make1_str(""); }
1114 user_valid_clause: VALID UNTIL Sconst { $$ = cat2_str(make1_str("valid until"), $3); }
1115 | /*EMPTY*/ { $$ = make1_str(""); }
1118 /*****************************************************************************
1120 * Set PG internal variable
1121 * SET name TO 'var_value'
1122 * Include SQL92 syntax (thomas 1997-10-22):
1123 * SET TIME ZONE 'var_value'
1125 *****************************************************************************/
1127 VariableSetStmt: SET ColId TO var_value
1129 $$ = cat4_str(make1_str("set"), $2, make1_str("to"), $4);
1131 | SET ColId '=' var_value
1133 $$ = cat4_str(make1_str("set"), $2, make1_str("="), $4);
1135 | SET TIME ZONE zone_value
1137 $$ = cat2_str(make1_str("set time zone"), $4);
1139 | SET TRANSACTION ISOLATION LEVEL opt_level
1141 $$ = cat2_str(make1_str("set transaction isolation level"), $5);
1143 | SET NAMES encoding
1146 $$ = cat2_str(make1_str("set names"), $3);
1148 yyerror("SET NAMES is not supported");
1153 opt_level: READ COMMITTED { $$ = make1_str("read committed"); }
1154 | SERIALIZABLE { $$ = make1_str("serializable"); }
1158 var_value: Sconst { $$ = $1; }
1159 | DEFAULT { $$ = make1_str("default"); }
1162 zone_value: Sconst { $$ = $1; }
1163 | DEFAULT { $$ = make1_str("default"); }
1164 | LOCAL { $$ = make1_str("local"); }
1167 VariableShowStmt: SHOW ColId
1169 $$ = cat2_str(make1_str("show"), $2);
1173 $$ = make1_str("show time zone");
1175 | SHOW TRANSACTION ISOLATION LEVEL
1177 $$ = make1_str("show transaction isolation level");
1181 VariableResetStmt: RESET ColId
1183 $$ = cat2_str(make1_str("reset"), $2);
1187 $$ = make1_str("reset time zone");
1189 | RESET TRANSACTION ISOLATION LEVEL
1191 $$ = make1_str("reset transaction isolation level");
1196 /*****************************************************************************
1199 * addattr ( attr1 = type1 .. attrn = typen ) to <relname> [*]
1201 *****************************************************************************/
1203 AddAttrStmt: ALTER TABLE relation_name opt_inh_star alter_clause
1205 $$ = cat4_str(make1_str("alter table"), $3, $4, $5);
1209 alter_clause: ADD opt_column columnDef
1211 $$ = cat3_str(make1_str("add"), $2, $3);
1213 | ADD '(' OptTableElementList ')'
1215 $$ = make3_str(make1_str("add("), $3, make1_str(")"));
1217 | DROP opt_column ColId
1218 { yyerror("ALTER TABLE/DROP COLUMN not yet implemented"); }
1219 | ALTER opt_column ColId SET DEFAULT default_expr
1220 { yyerror("ALTER TABLE/ALTER COLUMN/SET DEFAULT not yet implemented"); }
1221 | ALTER opt_column ColId DROP DEFAULT
1222 { yyerror("ALTER TABLE/ALTER COLUMN/DROP DEFAULT not yet implemented"); }
1223 | ADD ConstraintElem
1224 { yyerror("ALTER TABLE/ADD CONSTRAINT not yet implemented"); }
1227 /*****************************************************************************
1232 *****************************************************************************/
1234 ClosePortalStmt: CLOSE opt_id
1236 $$ = cat2_str(make1_str("close"), $2);
1240 opt_id: ColId { $$ = $1; }
1241 | /*EMPTY*/ { $$ = NULL; }
1244 /*****************************************************************************
1247 * COPY [BINARY] <relname> FROM/TO
1248 * [USING DELIMITERS <delimiter>]
1250 *****************************************************************************/
1252 CopyStmt: COPY opt_binary relation_name opt_with_copy copy_dirn copy_file_name copy_delimiter
1254 $$ = cat3_str(cat5_str(make1_str("copy"), $2, $3, $4, $5), $6, $7);
1259 { $$ = make1_str("to"); }
1261 { $$ = make1_str("from"); }
1265 * copy_file_name NULL indicates stdio is used. Whether stdin or stdout is
1266 * used depends on the direction. (It really doesn't make sense to copy from
1267 * stdout. We silently correct the "typo". - AY 9/94
1269 copy_file_name: Sconst { $$ = $1; }
1270 | STDIN { $$ = make1_str("stdin"); }
1271 | STDOUT { $$ = make1_str("stdout"); }
1274 opt_binary: BINARY { $$ = make1_str("binary"); }
1275 | /*EMPTY*/ { $$ = make1_str(""); }
1278 opt_with_copy: WITH OIDS { $$ = make1_str("with oids"); }
1279 | /*EMPTY*/ { $$ = make1_str(""); }
1283 * the default copy delimiter is tab but the user can configure it
1285 copy_delimiter: USING DELIMITERS Sconst { $$ = cat2_str(make1_str("using delimiters"), $3); }
1286 | /*EMPTY*/ { $$ = make1_str(""); }
1291 /*****************************************************************************
1296 *****************************************************************************/
1298 CreateStmt: CREATE OptTemp TABLE relation_name '(' OptTableElementList ')'
1301 $$ = cat3_str(cat4_str(make1_str("create"), $2, make1_str("table"), $4), make3_str(make1_str("("), $6, make1_str(")")), $8);
1305 OptTemp: OptTempType { $$ = $1; }
1306 | OptTempScope OptTempType { $$ = cat2_str($1,$2); }
1309 OptTempType: TEMP { $$ = make1_str("temp"); }
1310 | TEMPORARY { $$ = make1_str("temporary"); }
1311 | /* EMPTY */ { $$ = make1_str(""); }
1314 OptTempScope: GLOBAL
1316 yyerror("GLOBAL TEMPORARY TABLE is not currently supported");
1317 $$ = make1_str("global");
1319 | LOCAL { $$ = make1_str("local"); }
1323 OptTableElementList: OptTableElementList ',' OptTableElement
1325 $$ = cat3_str($1, make1_str(","), $3);
1331 | /*EMPTY*/ { $$ = make1_str(""); }
1334 OptTableElement: columnDef { $$ = $1; }
1335 | TableConstraint { $$ = $1; }
1338 columnDef: ColId Typename ColQualifier
1340 $$ = cat3_str($1, $2, $3);
1342 | ColId SERIAL ColPrimaryKey
1344 $$ = make3_str($1, make1_str(" serial "), $3);
1348 ColQualifier: ColQualList { $$ = $1; }
1349 | /*EMPTY*/ { $$ = make1_str(""); }
1352 ColQualList: ColQualList ColConstraint { $$ = cat2_str($1,$2); }
1353 | ColConstraint { $$ = $1; }
1356 ColPrimaryKey: PRIMARY KEY
1358 $$ = make1_str("primary key");
1367 CONSTRAINT name ColConstraintElem
1369 $$ = cat3_str(make1_str("constraint"), $2, $3);
1375 /* DEFAULT NULL is already the default for Postgres.
1376 * Bue define it here and carry it forward into the system
1377 * to make it explicit.
1378 * - thomas 1998-09-13
1379 * WITH NULL and NULL are not SQL92-standard syntax elements,
1380 * so leave them out. Use DEFAULT NULL to explicitly indicate
1381 * that a column may have that value. WITH NULL leads to
1382 * shift/reduce conflicts with WITH TIME ZONE anyway.
1383 * - thomas 1999-01-08
1385 ColConstraintElem: CHECK '(' constraint_expr ')'
1387 $$ = make3_str(make1_str("check("), $3, make1_str(")"));
1391 $$ = make1_str("default null");
1393 | DEFAULT default_expr
1395 $$ = cat2_str(make1_str("default"), $2);
1399 $$ = make1_str("not null");
1403 $$ = make1_str("unique");
1407 $$ = make1_str("primary key");
1409 | REFERENCES ColId opt_column_list key_match key_actions
1411 fprintf(stderr, "CREATE TABLE/FOREIGN KEY clause ignored; not yet implemented");
1416 default_list: default_list ',' default_expr
1418 $$ = cat3_str($1, make1_str(","), $3);
1426 /* The Postgres default column value is NULL.
1427 * Rather than carrying DEFAULT NULL forward as a clause,
1428 * let's just have it be a no-op.
1430 { $$ = make1_str("null"); }
1431 * - thomas 1998-09-13
1434 default_expr: AexprConst
1436 | '-' default_expr %prec UMINUS
1437 { $$ = cat2_str(make1_str("-"), $2); }
1438 | default_expr '+' default_expr
1439 { $$ = cat3_str($1, make1_str("+"), $3); }
1440 | default_expr '-' default_expr
1441 { $$ = cat3_str($1, make1_str("-"), $3); }
1442 | default_expr '/' default_expr
1443 { $$ = cat3_str($1, make1_str("/"), $3); }
1444 | default_expr '%' default_expr
1445 { $$ = cat3_str($1, make1_str("%"), $3); }
1446 | default_expr '*' default_expr
1447 { $$ = cat3_str($1, make1_str("*"), $3); }
1448 | default_expr '^' default_expr
1449 { $$ = cat3_str($1, make1_str("^"), $3); }
1450 | default_expr '=' default_expr
1451 { yyerror("boolean expressions not supported in DEFAULT"); }
1452 | default_expr '<' default_expr
1453 { yyerror("boolean expressions not supported in DEFAULT"); }
1454 | default_expr '>' default_expr
1455 { yyerror("boolean expressions not supported in DEFAULT"); }
1456 /* not possible in embedded sql
1458 { $$ = cat2_str(make1_str(":"), $2); }
1461 { $$ = cat2_str(make1_str(";"), $2); }
1463 { $$ = cat2_str(make1_str("|"), $2); }
1464 | default_expr TYPECAST Typename
1465 { $$ = cat3_str($1, make1_str("::"), $3); }
1466 | CAST '(' default_expr AS Typename ')'
1468 $$ = cat3_str(make2_str(make1_str("cast("), $3) , make1_str("as"), make2_str($5, make1_str(")")));
1470 | '(' default_expr ')'
1471 { $$ = make3_str(make1_str("("), $2, make1_str(")")); }
1473 { $$ = cat2_str($1, make1_str("()")); }
1474 | func_name '(' default_list ')'
1475 { $$ = cat2_str($1, make3_str(make1_str("("), $3, make1_str(")"))); }
1476 | default_expr Op default_expr
1478 if (!strcmp("<=", $2) || !strcmp(">=", $2))
1479 yyerror("boolean expressions not supported in DEFAULT");
1480 $$ = cat3_str($1, $2, $3);
1483 { $$ = cat2_str($1, $2); }
1485 { $$ = cat2_str($1, $2); }
1486 /* XXX - thomas 1997-10-07 v6.2 function-specific code to be changed */
1488 { $$ = make1_str("current_date"); }
1490 { $$ = make1_str("current_time"); }
1491 | CURRENT_TIME '(' Iconst ')'
1494 fprintf(stderr, "CURRENT_TIME(%s) precision not implemented; zero used instead",$3);
1495 $$ = "current_time";
1498 { $$ = make1_str("current_timestamp"); }
1499 | CURRENT_TIMESTAMP '(' Iconst ')'
1502 fprintf(stderr, "CURRENT_TIMESTAMP(%s) precision not implemented; zero used instead",$3);
1503 $$ = "current_timestamp";
1506 { $$ = make1_str("current_user"); }
1508 { $$ = make1_str("user"); }
1511 /* ConstraintElem specifies constraint syntax which is not embedded into
1512 * a column definition. ColConstraintElem specifies the embedded form.
1513 * - thomas 1997-12-03
1515 TableConstraint: CONSTRAINT name ConstraintElem
1517 $$ = cat3_str(make1_str("constraint"), $2, $3);
1523 ConstraintElem: CHECK '(' constraint_expr ')'
1525 $$ = make3_str(make1_str("check("), $3, make1_str(")"));
1527 | UNIQUE '(' columnList ')'
1529 $$ = make3_str(make1_str("unique("), $3, make1_str(")"));
1531 | PRIMARY KEY '(' columnList ')'
1533 $$ = make3_str(make1_str("primary key("), $4, make1_str(")"));
1535 | FOREIGN KEY '(' columnList ')' REFERENCES ColId opt_column_list key_match key_actions
1537 fprintf(stderr, "CREATE TABLE/FOREIGN KEY clause ignored; not yet implemented");
1542 constraint_list: constraint_list ',' constraint_expr
1544 $$ = cat3_str($1, make1_str(","), $3);
1552 constraint_expr: AexprConst
1555 { $$ = make1_str("null"); }
1560 | '-' constraint_expr %prec UMINUS
1561 { $$ = cat2_str(make1_str("-"), $2); }
1562 | constraint_expr '+' constraint_expr
1563 { $$ = cat3_str($1, make1_str("+"), $3); }
1564 | constraint_expr '-' constraint_expr
1565 { $$ = cat3_str($1, make1_str("-"), $3); }
1566 | constraint_expr '/' constraint_expr
1567 { $$ = cat3_str($1, make1_str("/"), $3); }
1568 | constraint_expr '%' constraint_expr
1569 { $$ = cat3_str($1, make1_str("%"), $3); }
1570 | constraint_expr '*' constraint_expr
1571 { $$ = cat3_str($1, make1_str("*"), $3); }
1572 | constraint_expr '^' constraint_expr
1573 { $$ = cat3_str($1, make1_str("^"), $3); }
1574 | constraint_expr '=' constraint_expr
1575 { $$ = cat3_str($1, make1_str("="), $3); }
1576 | constraint_expr '<' constraint_expr
1577 { $$ = cat3_str($1, make1_str("<"), $3); }
1578 | constraint_expr '>' constraint_expr
1579 { $$ = cat3_str($1, make1_str(">"), $3); }
1580 /* this one doesn't work with embedded sql anyway
1581 | ':' constraint_expr
1582 { $$ = cat2_str(make1_str(":"), $2); }
1584 | ';' constraint_expr
1585 { $$ = cat2_str(make1_str(";"), $2); }
1586 | '|' constraint_expr
1587 { $$ = cat2_str(make1_str("|"), $2); }
1588 | constraint_expr TYPECAST Typename
1590 $$ = cat3_str($1, make1_str("::"), $3);
1592 | CAST '(' constraint_expr AS Typename ')'
1594 $$ = cat3_str(make2_str(make1_str("cast("), $3), make1_str("as"), make2_str($5, make1_str(")")));
1596 | '(' constraint_expr ')'
1597 { $$ = make3_str(make1_str("("), $2, make1_str(")")); }
1600 { $$ = cat2_str($1, make1_str("()")); }
1602 | func_name '(' constraint_list ')'
1604 $$ = cat2_str($1, make3_str(make1_str("("), $3, make1_str(")")));
1606 | constraint_expr Op constraint_expr
1607 { $$ = cat3_str($1, $2, $3); }
1608 | constraint_expr LIKE constraint_expr
1609 { $$ = cat3_str($1, make1_str("like"), $3); }
1610 | constraint_expr NOT LIKE constraint_expr
1611 { $$ = cat3_str($1, make1_str("not like"), $4); }
1612 | constraint_expr AND constraint_expr
1613 { $$ = cat3_str($1, make1_str("and"), $3); }
1614 | constraint_expr OR constraint_expr
1615 { $$ = cat3_str($1, make1_str("or"), $3); }
1616 | NOT constraint_expr
1617 { $$ = cat2_str(make1_str("not"), $2); }
1618 | Op constraint_expr
1619 { $$ = cat2_str($1, $2); }
1620 | constraint_expr Op
1621 { $$ = cat2_str($1, $2); }
1622 | constraint_expr ISNULL
1623 { $$ = cat2_str($1, make1_str("isnull")); }
1624 | constraint_expr IS NULL_P
1625 { $$ = cat2_str($1, make1_str("is null")); }
1626 | constraint_expr NOTNULL
1627 { $$ = cat2_str($1, make1_str("notnull")); }
1628 | constraint_expr IS NOT NULL_P
1629 { $$ = cat2_str($1, make1_str("is not null")); }
1630 | constraint_expr IS TRUE_P
1631 { $$ = cat2_str($1, make1_str("is true")); }
1632 | constraint_expr IS FALSE_P
1633 { $$ = cat2_str($1, make1_str("is false")); }
1634 | constraint_expr IS NOT TRUE_P
1635 { $$ = cat2_str($1, make1_str("is not true")); }
1636 | constraint_expr IS NOT FALSE_P
1637 { $$ = cat2_str($1, make1_str("is not false")); }
1638 | constraint_expr IN '(' c_list ')'
1639 { $$ = cat4_str($1, make1_str("in ("), $4, make1_str(")")); }
1640 | constraint_expr NOT IN '(' c_list ')'
1641 { $$ = cat4_str($1, make1_str("not in ("), $5, make1_str(")")); }
1642 | constraint_expr BETWEEN c_expr AND c_expr
1643 { $$ = cat5_str($1, make1_str("between"), $3, make1_str("and"), $5); }
1644 | constraint_expr NOT BETWEEN c_expr AND c_expr
1645 { $$ = cat5_str($1, make1_str("not between"), $4, make1_str("and"), $6); }
1647 c_list: c_list ',' c_expr
1649 $$ = make3_str($1, make1_str(", "), $3);
1661 key_match: MATCH FULL { $$ = make1_str("match full"); }
1662 | MATCH PARTIAL { $$ = make1_str("match partial"); }
1663 | /*EMPTY*/ { $$ = make1_str(""); }
1666 key_actions: key_action key_action { $$ = cat2_str($1, $2); }
1667 | key_action { $$ = $1; }
1668 | /*EMPTY*/ { $$ = make1_str(""); }
1671 key_action: ON DELETE key_reference { $$ = cat2_str(make1_str("on delete"), $3); }
1672 | ON UPDATE key_reference { $$ = cat2_str(make1_str("on update"), $3); }
1675 key_reference: NO ACTION { $$ = make1_str("no action"); }
1676 | CASCADE { $$ = make1_str("cascade"); }
1677 | SET DEFAULT { $$ = make1_str("set default"); }
1678 | SET NULL_P { $$ = make1_str("set null"); }
1681 OptInherit: INHERITS '(' relation_name_list ')' { $$ = make3_str(make1_str("inherits ("), $3, make1_str(")")); }
1682 | /*EMPTY*/ { $$ = make1_str(""); }
1685 CreateAsStmt: CREATE OptTemp TABLE relation_name OptCreateAs AS SubSelect
1687 $$ = cat5_str(cat3_str(make1_str("create"), $2, make1_str("table")), $4, $5, make1_str("as"), $7);
1691 OptCreateAs: '(' CreateAsList ')' { $$ = make3_str(make1_str("("), $2, make1_str(")")); }
1692 | /*EMPTY*/ { $$ = make1_str(""); }
1695 CreateAsList: CreateAsList ',' CreateAsElement { $$ = cat3_str($1, make1_str(","), $3); }
1696 | CreateAsElement { $$ = $1; }
1699 CreateAsElement: ColId { $$ = $1; }
1702 /*****************************************************************************
1705 * CREATE SEQUENCE seqname
1707 *****************************************************************************/
1709 CreateSeqStmt: CREATE SEQUENCE relation_name OptSeqList
1711 $$ = cat3_str(make1_str("create sequence"), $3, $4);
1715 OptSeqList: OptSeqList OptSeqElem
1716 { $$ = cat2_str($1, $2); }
1717 | { $$ = make1_str(""); }
1720 OptSeqElem: CACHE IntegerOnly
1722 $$ = cat2_str(make1_str("cache"), $2);
1726 $$ = make1_str("cycle");
1728 | INCREMENT IntegerOnly
1730 $$ = cat2_str(make1_str("increment"), $2);
1732 | MAXVALUE IntegerOnly
1734 $$ = cat2_str(make1_str("maxvalue"), $2);
1736 | MINVALUE IntegerOnly
1738 $$ = cat2_str(make1_str("minvalue"), $2);
1742 $$ = cat2_str(make1_str("start"), $2);
1746 NumericOnly: FloatOnly { $$ = $1; }
1747 | IntegerOnly { $$ = $1; }
1755 $$ = cat2_str(make1_str("-"), $2);
1766 $$ = cat2_str(make1_str("-"), $2);
1770 /*****************************************************************************
1773 * CREATE PROCEDURAL LANGUAGE ...
1774 * DROP PROCEDURAL LANGUAGE ...
1776 *****************************************************************************/
1778 CreatePLangStmt: CREATE PLangTrusted PROCEDURAL LANGUAGE Sconst
1779 HANDLER def_name LANCOMPILER Sconst
1781 $$ = cat4_str(cat5_str(make1_str("create"), $2, make1_str("precedural language"), $5, make1_str("handler")), $7, make1_str("langcompiler"), $9);
1785 PLangTrusted: TRUSTED { $$ = make1_str("trusted"); }
1786 | { $$ = make1_str(""); }
1788 DropPLangStmt: DROP PROCEDURAL LANGUAGE Sconst
1790 $$ = cat2_str(make1_str("drop procedural language"), $4);
1794 /*****************************************************************************
1797 * CREATE TRIGGER ...
1800 *****************************************************************************/
1802 CreateTrigStmt: CREATE TRIGGER name TriggerActionTime TriggerEvents ON
1803 relation_name TriggerForSpec EXECUTE PROCEDURE
1804 name '(' TriggerFuncArgs ')'
1806 $$ = cat2_str(cat5_str(cat5_str(make1_str("create trigger"), $3, $4, $5, make1_str("on")), $7, $8, make1_str("execute procedure"), $11), make3_str(make1_str("("), $13, make1_str(")")));
1810 TriggerActionTime: BEFORE { $$ = make1_str("before"); }
1811 | AFTER { $$ = make1_str("after"); }
1814 TriggerEvents: TriggerOneEvent
1818 | TriggerOneEvent OR TriggerOneEvent
1820 $$ = cat3_str($1, make1_str("or"), $3);
1822 | TriggerOneEvent OR TriggerOneEvent OR TriggerOneEvent
1824 $$ = cat5_str($1, make1_str("or"), $3, make1_str("or"), $5);
1828 TriggerOneEvent: INSERT { $$ = make1_str("insert"); }
1829 | DELETE { $$ = make1_str("delete"); }
1830 | UPDATE { $$ = make1_str("update"); }
1833 TriggerForSpec: FOR TriggerForOpt TriggerForType
1835 $$ = cat3_str(make1_str("for"), $2, $3);
1839 TriggerForOpt: EACH { $$ = make1_str("each"); }
1840 | /*EMPTY*/ { $$ = make1_str(""); }
1843 TriggerForType: ROW { $$ = make1_str("row"); }
1844 | STATEMENT { $$ = make1_str("statement"); }
1847 TriggerFuncArgs: TriggerFuncArg
1849 | TriggerFuncArgs ',' TriggerFuncArg
1850 { $$ = cat3_str($1, make1_str(","), $3); }
1852 { $$ = make1_str(""); }
1855 TriggerFuncArg: Iconst
1863 | Sconst { $$ = $1; }
1864 | ident { $$ = $1; }
1867 DropTrigStmt: DROP TRIGGER name ON relation_name
1869 $$ = cat4_str(make1_str("drop trigger"), $3, make1_str("on"), $5);
1873 /*****************************************************************************
1876 * define (type,operator,aggregate)
1878 *****************************************************************************/
1880 DefineStmt: CREATE def_type def_rest
1882 $$ = cat3_str(make1_str("create"), $2, $3);
1886 def_rest: def_name definition
1888 $$ = cat2_str($1, $2);
1892 def_type: OPERATOR { $$ = make1_str("operator"); }
1893 | TYPE_P { $$ = make1_str("type"); }
1894 | AGGREGATE { $$ = make1_str("aggregate"); }
1897 def_name: PROCEDURE { $$ = make1_str("procedure"); }
1898 | JOIN { $$ = make1_str("join"); }
1899 | ColId { $$ = $1; }
1900 | MathOp { $$ = $1; }
1904 definition: '(' def_list ')' { $$ = make3_str(make1_str("("), $2, make1_str(")")); }
1907 def_list: def_elem { $$ = $1; }
1908 | def_list ',' def_elem { $$ = cat3_str($1, make1_str(","), $3); }
1911 def_elem: def_name '=' def_arg {
1912 $$ = cat3_str($1, make1_str("="), $3);
1918 | DEFAULT '=' def_arg
1920 $$ = cat2_str(make1_str("default ="), $3);
1924 def_arg: ColId { $$ = $1; }
1925 | all_Op { $$ = $1; }
1926 | NumericOnly { $$ = $1; }
1927 | Sconst { $$ = $1; }
1930 $$ = cat2_str(make1_str("setof"), $2);
1934 /*****************************************************************************
1937 * destroy <relname1> [, <relname2> .. <relnameN> ]
1939 *****************************************************************************/
1941 DestroyStmt: DROP TABLE relation_name_list
1943 $$ = cat2_str(make1_str("drop table"), $3);
1945 | DROP SEQUENCE relation_name_list
1947 $$ = cat2_str(make1_str("drop sequence"), $3);
1953 /*****************************************************************************
1956 * fetch/move [forward | backward] [ # | all ] [ in <portalname> ]
1957 * fetch [ forward | backward | absolute | relative ]
1958 * [ # | all | next | prior ] [ [ in | from ] <portalname> ]
1960 *****************************************************************************/
1962 FetchStmt: FETCH opt_direction fetch_how_many opt_portal_name INTO into_list
1964 if (strncmp($2, "relative", strlen("relative")) == 0 && atol($3) == 0L)
1965 yyerror("FETCH/RELATIVE at current position is not supported");
1967 $$ = cat4_str(make1_str("fetch"), $2, $3, $4);
1969 | MOVE opt_direction fetch_how_many opt_portal_name
1971 $$ = cat4_str(make1_str("fetch"), $2, $3, $4);
1975 opt_direction: FORWARD { $$ = make1_str("forward"); }
1976 | BACKWARD { $$ = make1_str("backward"); }
1977 | RELATIVE { $$ = make1_str("relative"); }
1980 fprintf(stderr, "FETCH/ABSOLUTE not supported, using RELATIVE");
1981 $$ = make1_str("absolute");
1983 | /*EMPTY*/ { $$ = make1_str(""); /* default */ }
1986 fetch_how_many: Iconst { $$ = $1; }
1987 | '-' Iconst { $$ = make2_str(make1_str("-"), $2); }
1988 | ALL { $$ = make1_str("all"); }
1989 | NEXT { $$ = make1_str("next"); }
1990 | PRIOR { $$ = make1_str("prior"); }
1991 | /*EMPTY*/ { $$ = make1_str(""); /*default*/ }
1994 opt_portal_name: IN name { $$ = cat2_str(make1_str("in"), $2); }
1995 | FROM name { $$ = cat2_str(make1_str("from"), $2); }
1996 /* | name { $$ = cat2_str(make1_str("in"), $1); */
1997 | /*EMPTY*/ { $$ = make1_str(""); }
2001 /*****************************************************************************
2004 * GRANT [privileges] ON [relation_name_list] TO [GROUP] grantee
2006 *****************************************************************************/
2008 GrantStmt: GRANT privileges ON relation_name_list TO grantee opt_with_grant
2010 $$ = cat2_str(cat5_str(make1_str("grant"), $2, make1_str("on"), $4, make1_str("to")), $6);
2014 privileges: ALL PRIVILEGES
2016 $$ = make1_str("all privileges");
2020 $$ = make1_str("all");
2022 | operation_commalist
2028 operation_commalist: operation
2032 | operation_commalist ',' operation
2034 $$ = cat3_str($1, make1_str(","), $3);
2040 $$ = make1_str("select");
2044 $$ = make1_str("insert");
2048 $$ = make1_str("update");
2052 $$ = make1_str("delete");
2056 $$ = make1_str("rule");
2062 $$ = make1_str("public");
2066 $$ = cat2_str(make1_str("group"), $2);
2074 opt_with_grant: WITH GRANT OPTION
2076 yyerror("WITH GRANT OPTION is not supported. Only relation owners can set privileges");
2082 /*****************************************************************************
2085 * REVOKE [privileges] ON [relation_name] FROM [user]
2087 *****************************************************************************/
2089 RevokeStmt: REVOKE privileges ON relation_name_list FROM grantee
2091 $$ = cat2_str(cat5_str(make1_str("revoke"), $2, make1_str("on"), $4, make1_str("from")), $6);
2097 /*****************************************************************************
2100 * create index <indexname> on <relname>
2101 * using <access> "(" (<col> with <op>)+ ")" [with
2104 * [where <qual>] is not supported anymore
2105 *****************************************************************************/
2107 IndexStmt: CREATE index_opt_unique INDEX index_name ON relation_name
2108 access_method_clause '(' index_params ')' opt_with
2110 /* should check that access_method is valid,
2111 etc ... but doesn't */
2112 $$ = cat5_str(cat5_str(make1_str("create"), $2, make1_str("index"), $4, make1_str("on")), $6, $7, make3_str(make1_str("("), $9, make1_str(")")), $11);
2116 index_opt_unique: UNIQUE { $$ = make1_str("unique"); }
2117 | /*EMPTY*/ { $$ = make1_str(""); }
2120 access_method_clause: USING access_method { $$ = cat2_str(make1_str("using"), $2); }
2121 | /*EMPTY*/ { $$ = make1_str(""); }
2124 index_params: index_list { $$ = $1; }
2125 | func_index { $$ = $1; }
2128 index_list: index_list ',' index_elem { $$ = cat3_str($1, make1_str(","), $3); }
2129 | index_elem { $$ = $1; }
2132 func_index: func_name '(' name_list ')' opt_type opt_class
2134 $$ = cat4_str($1, make3_str(make1_str("("), $3, ")"), $5, $6);
2138 index_elem: attr_name opt_type opt_class
2140 $$ = cat3_str($1, $2, $3);
2144 opt_type: ':' Typename { $$ = cat2_str(make1_str(":"), $2); }
2145 | FOR Typename { $$ = cat2_str(make1_str("for"), $2); }
2146 | /*EMPTY*/ { $$ = make1_str(""); }
2149 /* opt_class "WITH class" conflicts with preceeding opt_type
2150 * for Typename of "TIMESTAMP WITH TIME ZONE"
2151 * So, remove "WITH class" from the syntax. OK??
2152 * - thomas 1997-10-12
2153 * | WITH class { $$ = $2; }
2155 opt_class: class { $$ = $1; }
2156 | USING class { $$ = cat2_str(make1_str("using"), $2); }
2157 | /*EMPTY*/ { $$ = make1_str(""); }
2160 /*****************************************************************************
2163 * extend index <indexname> [where <qual>]
2165 *****************************************************************************/
2167 ExtendStmt: EXTEND INDEX index_name where_clause
2169 $$ = cat3_str(make1_str("extend index"), $3, $4);
2174 /*****************************************************************************
2177 * execute recipe <recipeName>
2179 *****************************************************************************/
2181 RecipeStmt: EXECUTE RECIPE recipe_name
2183 $$ = cat2_str(make1_str("execute recipe"), $3);
2187 /*****************************************************************************
2190 * define function <fname>
2191 * (language = <lang>, returntype = <typename>
2192 * [, arch_pct = <percentage | pre-defined>]
2193 * [, disk_pct = <percentage | pre-defined>]
2194 * [, byte_pct = <percentage | pre-defined>]
2195 * [, perbyte_cpu = <int | pre-defined>]
2196 * [, percall_cpu = <int | pre-defined>]
2198 * [arg is (<type-1> { , <type-n>})]
2199 * as <filename or code in language as appropriate>
2201 *****************************************************************************/
2203 ProcedureStmt: CREATE FUNCTION func_name func_args
2204 RETURNS func_return opt_with AS Sconst LANGUAGE Sconst
2206 $$ = cat2_str(cat5_str(cat5_str(make1_str("create function"), $3, $4, make1_str("returns"), $6), $7, make1_str("as"), $9, make1_str("language")), $11);
2209 opt_with: WITH definition { $$ = cat2_str(make1_str("with"), $2); }
2210 | /*EMPTY*/ { $$ = make1_str(""); }
2213 func_args: '(' func_args_list ')' { $$ = make3_str(make1_str("("), $2, make1_str(")")); }
2214 | '(' ')' { $$ = make1_str("()"); }
2217 func_args_list: TypeId { $$ = $1; }
2218 | func_args_list ',' TypeId
2219 { $$ = cat3_str($1, make1_str(","), $3); }
2222 func_return: set_opt TypeId
2224 $$ = cat2_str($1, $2);
2228 set_opt: SETOF { $$ = make1_str("setof"); }
2229 | /*EMPTY*/ { $$ = make1_str(""); }
2233 /*****************************************************************************
2237 * remove function <funcname>
2238 * (REMOVE FUNCTION "funcname" (arg1, arg2, ...))
2239 * remove aggregate <aggname>
2240 * (REMOVE AGGREGATE "aggname" "aggtype")
2241 * remove operator <opname>
2242 * (REMOVE OPERATOR "opname" (leftoperand_typ rightoperand_typ))
2243 * remove type <typename>
2244 * (REMOVE TYPE "typename")
2245 * remove rule <rulename>
2246 * (REMOVE RULE "rulename")
2248 *****************************************************************************/
2250 RemoveStmt: DROP remove_type name
2252 $$ = cat3_str(make1_str("drop"), $2, $3);
2256 remove_type: TYPE_P { $$ = make1_str("type"); }
2257 | INDEX { $$ = make1_str("index"); }
2258 | RULE { $$ = make1_str("rule"); }
2259 | VIEW { $$ = make1_str("view"); }
2263 RemoveAggrStmt: DROP AGGREGATE name aggr_argtype
2265 $$ = cat3_str(make1_str("drop aggregate"), $3, $4);
2269 aggr_argtype: name { $$ = $1; }
2270 | '*' { $$ = make1_str("*"); }
2274 RemoveFuncStmt: DROP FUNCTION func_name func_args
2276 $$ = cat3_str(make1_str("drop function"), $3, $4);
2281 RemoveOperStmt: DROP OPERATOR all_Op '(' oper_argtypes ')'
2283 $$ = cat3_str(make1_str("drop operator"), $3, make3_str(make1_str("("), $5, make1_str(")")));
2287 all_Op: Op | MathOp;
2289 MathOp: '+' { $$ = make1_str("+"); }
2290 | '-' { $$ = make1_str("-"); }
2291 | '*' { $$ = make1_str("*"); }
2292 | '%' { $$ = make1_str("%"); }
2293 | '/' { $$ = make1_str("/"); }
2294 | '<' { $$ = make1_str("<"); }
2295 | '>' { $$ = make1_str(">"); }
2296 | '=' { $$ = make1_str("="); }
2301 yyerror("parser: argument type missing (use NONE for unary operators)");
2304 { $$ = cat3_str($1, make1_str(","), $3); }
2305 | NONE ',' name /* left unary */
2306 { $$ = cat2_str(make1_str("none,"), $3); }
2307 | name ',' NONE /* right unary */
2308 { $$ = cat2_str($1, make1_str(", none")); }
2312 /*****************************************************************************
2315 * rename <attrname1> in <relname> [*] to <attrname2>
2316 * rename <relname1> to <relname2>
2318 *****************************************************************************/
2320 RenameStmt: ALTER TABLE relation_name opt_inh_star
2321 RENAME opt_column opt_name TO name
2323 $$ = cat4_str(cat5_str(make1_str("alter table"), $3, $4, make1_str("rename"), $6), $7, make1_str("to"), $9);
2327 opt_name: name { $$ = $1; }
2328 | /*EMPTY*/ { $$ = make1_str(""); }
2331 opt_column: COLUMN { $$ = make1_str("colmunn"); }
2332 | /*EMPTY*/ { $$ = make1_str(""); }
2336 /*****************************************************************************
2338 * QUERY: Define Rewrite Rule , Define Tuple Rule
2339 * Define Rule <old rules >
2341 * only rewrite rule is supported -- ay 9/94
2343 *****************************************************************************/
2345 RuleStmt: CREATE RULE name AS
2347 ON event TO event_object where_clause
2348 DO opt_instead RuleActionList
2350 $$ = cat2_str(cat5_str(cat5_str(make1_str("create rule"), $3, make1_str("as on"), $7, make1_str("to")), $9, $10, make1_str("do"), $12), $13);
2354 RuleActionList: NOTHING { $$ = make1_str("nothing"); }
2355 | SelectStmt { $$ = $1; }
2356 | RuleActionStmt { $$ = $1; }
2357 | '[' RuleActionBlock ']' { $$ = cat3_str(make1_str("["), $2, make1_str("]")); }
2358 | '(' RuleActionBlock ')' { $$ = cat3_str(make1_str("("), $2, make1_str(")")); }
2361 RuleActionBlock: RuleActionMulti { $$ = $1; }
2362 | RuleActionStmt { $$ = $1; }
2365 RuleActionMulti: RuleActionMulti RuleActionStmt
2366 { $$ = cat2_str($1, $2); }
2367 | RuleActionMulti RuleActionStmt ';'
2368 { $$ = cat3_str($1, $2, make1_str(";")); }
2369 | RuleActionStmt ';'
2370 { $$ = cat2_str($1, make1_str(";")); }
2373 RuleActionStmt: InsertStmt
2379 event_object: relation_name '.' attr_name
2381 $$ = make3_str($1, make1_str("."), $3);
2389 /* change me to select, update, etc. some day */
2390 event: SELECT { $$ = make1_str("select"); }
2391 | UPDATE { $$ = make1_str("update"); }
2392 | DELETE { $$ = make1_str("delete"); }
2393 | INSERT { $$ = make1_str("insert"); }
2396 opt_instead: INSTEAD { $$ = make1_str("instead"); }
2397 | /*EMPTY*/ { $$ = make1_str(""); }
2401 /*****************************************************************************
2404 * NOTIFY <relation_name> can appear both in rule bodies and
2405 * as a query-level command
2407 *****************************************************************************/
2409 NotifyStmt: NOTIFY relation_name
2411 $$ = cat2_str(make1_str("notify"), $2);
2415 ListenStmt: LISTEN relation_name
2417 $$ = cat2_str(make1_str("listen"), $2);
2421 UnlistenStmt: UNLISTEN relation_name
2423 $$ = cat2_str(make1_str("unlisten"), $2);
2427 $$ = make1_str("unlisten *");
2431 /*****************************************************************************
2442 *****************************************************************************/
2443 TransactionStmt: ABORT_TRANS opt_trans { $$ = make1_str("rollback"); }
2444 | BEGIN_TRANS opt_trans { $$ = make1_str("begin transaction"); }
2445 | COMMIT opt_trans { $$ = make1_str("commit"); }
2446 | END_TRANS opt_trans { $$ = make1_str("commit"); }
2447 | ROLLBACK opt_trans { $$ = make1_str("rollback"); }
2449 opt_trans: WORK { $$ = ""; }
2450 | TRANSACTION { $$ = ""; }
2451 | /*EMPTY*/ { $$ = ""; }
2454 /*****************************************************************************
2457 * define view <viewname> '('target-list ')' [where <quals> ]
2459 *****************************************************************************/
2461 ViewStmt: CREATE VIEW name AS SelectStmt
2463 $$ = cat4_str(make1_str("create view"), $3, make1_str("as"), $5);
2468 /*****************************************************************************
2471 * load make1_str("filename")
2473 *****************************************************************************/
2475 LoadStmt: LOAD file_name
2477 $$ = cat2_str(make1_str("load"), $2);
2482 /*****************************************************************************
2487 *****************************************************************************/
2489 CreatedbStmt: CREATE DATABASE database_name WITH opt_database1 opt_database2
2491 if (strlen($5) == 0 || strlen($6) == 0)
2492 yyerror("CREATE DATABASE WITH requires at least an option");
2494 if (strlen($6) != 0)
2495 yyerror("WITH ENCODING is not supported");
2497 $$ = cat5_str(make1_str("create database"), $3, make1_str("with"), $5, $6);
2499 | CREATE DATABASE database_name
2501 $$ = cat2_str(make1_str("create database"), $3);
2505 opt_database1: LOCATION '=' location { $$ = cat2_str(make1_str("location ="), $3); }
2506 | /*EMPTY*/ { $$ = make1_str(""); }
2509 opt_database2: ENCODING '=' encoding { $$ = cat2_str(make1_str("encoding ="), $3); }
2510 | /*EMPTY*/ { $$ = NULL; }
2513 location: Sconst { $$ = $1; }
2514 | DEFAULT { $$ = make1_str("default"); }
2515 | /*EMPTY*/ { $$ = make1_str(""); }
2518 encoding: Sconst { $$ = $1; }
2519 | DEFAULT { $$ = make1_str("default"); }
2520 | /*EMPTY*/ { $$ = make1_str(""); }
2523 /*****************************************************************************
2528 *****************************************************************************/
2530 DestroydbStmt: DROP DATABASE database_name
2532 $$ = cat2_str(make1_str("drop database"), $3);
2537 /*****************************************************************************
2540 * cluster <index_name> on <relation_name>
2542 *****************************************************************************/
2544 ClusterStmt: CLUSTER index_name ON relation_name
2546 $$ = cat4_str(make1_str("cluster"), $2, make1_str("on"), $4);
2551 /*****************************************************************************
2556 *****************************************************************************/
2558 VacuumStmt: VACUUM opt_verbose opt_analyze
2560 $$ = cat3_str(make1_str("vacuum"), $2, $3);
2562 | VACUUM opt_verbose opt_analyze relation_name opt_va_list
2564 if ( strlen($5) > 0 && strlen($4) == 0 )
2565 yyerror("parser: syntax error at or near \"(\"");
2566 $$ = cat5_str(make1_str("vacuum"), $2, $3, $4, $5);
2570 opt_verbose: VERBOSE { $$ = make1_str("verbose"); }
2571 | /*EMPTY*/ { $$ = make1_str(""); }
2574 opt_analyze: ANALYZE { $$ = make1_str("analyse"); }
2575 | /*EMPTY*/ { $$ = make1_str(""); }
2578 opt_va_list: '(' va_list ')' { $$ = make3_str(make1_str("("), $2, make1_str(")")); }
2579 | /*EMPTY*/ { $$ = make1_str(""); }
2585 { $$=cat3_str($1, make1_str(","), $3); }
2589 /*****************************************************************************
2594 *****************************************************************************/
2596 ExplainStmt: EXPLAIN opt_verbose OptimizableStmt
2598 $$ = cat3_str(make1_str("explain"), $2, $3);
2603 /*****************************************************************************
2605 * Optimizable Stmts: *
2607 * one of the five queries processed by the planner *
2609 * [ultimately] produces query-trees as specified *
2610 * in the query-spec document in ~postgres/ref *
2612 *****************************************************************************/
2614 OptimizableStmt: SelectStmt
2623 /*****************************************************************************
2628 *****************************************************************************/
2630 /* This rule used 'opt_column_list' between 'relation_name' and 'insert_rest'
2631 * originally. When the second rule of 'insert_rest' was changed to use
2632 * the new 'SelectStmt' rule (for INTERSECT and EXCEPT) it produced a shift/red uce
2633 * conflict. So I just changed the rules 'InsertStmt' and 'insert_rest' to accept
2634 * the same statements without any shift/reduce conflicts */
2635 InsertStmt: INSERT INTO relation_name insert_rest
2637 $$ = cat3_str(make1_str("insert into"), $3, $4);
2641 insert_rest: VALUES '(' target_list ')'
2643 $$ = make3_str(make1_str("values("), $3, make1_str(")"));
2647 $$ = make1_str("default values");
2653 | '(' columnList ')' VALUES '(' target_list ')'
2655 $$ = make5_str(make1_str("("), $2, make1_str(") values ("), $6, make1_str(")"));
2657 | '(' columnList ')' SelectStmt
2659 $$ = make4_str(make1_str("("), $2, make1_str(")"), $4);
2663 opt_column_list: '(' columnList ')' { $$ = make3_str(make1_str("("), $2, make1_str(")")); }
2664 | /*EMPTY*/ { $$ = make1_str(""); }
2668 columnList ',' columnElem
2669 { $$ = cat3_str($1, make1_str(","), $3); }
2674 columnElem: ColId opt_indirection
2676 $$ = cat2_str($1, $2);
2681 /*****************************************************************************
2686 *****************************************************************************/
2688 DeleteStmt: DELETE FROM relation_name
2691 $$ = cat3_str(make1_str("delete from"), $3, $4);
2695 LockStmt: LOCK_P opt_table relation_name opt_lock
2697 $$ = cat4_str(make1_str("lock"), $2, $3, $4);
2701 opt_lock: IN lock_type MODE { $$ = cat3_str(make1_str("in"), $2, make1_str("mode")); }
2702 | /*EMPTY*/ { $$ = make1_str("");}
2705 lock_type: SHARE ROW EXCLUSIVE { $$ = make1_str("share row exclusive"); }
2706 | ROW opt_lmode { $$ = cat2_str(make1_str("row"), $2);}
2707 | ACCESS opt_lmode { $$ = cat2_str(make1_str("access"), $2);}
2708 | opt_lmode { $$ = $1; }
2711 opt_lmode: SHARE { $$ = make1_str("share"); }
2712 | EXCLUSIVE { $$ = make1_str("exclusive"); }
2715 /*****************************************************************************
2718 * UpdateStmt (UPDATE)
2720 *****************************************************************************/
2722 UpdateStmt: UPDATE relation_name
2723 SET update_target_list
2727 $$ = cat2_str(cat5_str(make1_str("update"), $2, make1_str("set"), $4, $5), $6);
2732 /*****************************************************************************
2737 *****************************************************************************/
2738 CursorStmt: DECLARE name opt_cursor CURSOR FOR
2739 { ForUpdateNotAllowed = 1; }
2742 struct cursor *ptr, *this;
2744 for (ptr = cur; ptr != NULL; ptr = ptr->next)
2746 if (strcmp($2, ptr->name) == 0)
2748 /* re-definition is a bug */
2749 sprintf(errortext, "cursor %s already defined", $2);
2754 this = (struct cursor *) mm_alloc(sizeof(struct cursor));
2756 /* initial definition */
2759 this->connection = connection;
2760 this->command = cat5_str(make1_str("declare"), mm_strdup($2), $3, make1_str("cursor for"), $7);
2761 this->argsinsert = argsinsert;
2762 this->argsresult = argsresult;
2763 argsinsert = argsresult = NULL;
2767 $$ = cat3_str(make1_str("/*"), mm_strdup(this->command), make1_str("*/"));
2771 opt_cursor: BINARY { $$ = make1_str("binary"); }
2772 | INSENSITIVE { $$ = make1_str("insensitive"); }
2773 | SCROLL { $$ = make1_str("scroll"); }
2774 | INSENSITIVE SCROLL { $$ = make1_str("insensitive scroll"); }
2775 | /*EMPTY*/ { $$ = make1_str(""); }
2778 /*****************************************************************************
2783 *****************************************************************************/
2785 /* The new 'SelectStmt' rule adapted for the optional use of INTERSECT EXCEPT a nd UNION
2786 * accepts the use of '(' and ')' to select an order of set operations.
2787 * The rule returns a SelectStmt Node having the set operations attached to
2788 * unionClause and intersectClause (NIL if no set operations were present)
2791 SelectStmt: select_clause sort_clause for_update_clause opt_select_limit
2793 if (strlen($3) > 0 && ForUpdateNotAllowed != 0)
2794 yyerror("FOR UPDATE is not allowed in this context");
2796 ForUpdateNotAllowed = 0;
2797 $$ = cat4_str($1, $2, $3, $4);
2800 /* This rule parses Select statements including UNION INTERSECT and EXCEPT.
2801 * '(' and ')' can be used to specify the order of the operations
2802 * (UNION EXCEPT INTERSECT). Without the use of '(' and ')' we want the
2803 * operations to be left associative.
2805 * The sort_clause is not handled here!
2807 select_clause: '(' select_clause ')'
2809 $$ = make3_str(make1_str("("), $2, make1_str(")"));
2815 | select_clause EXCEPT select_clause
2817 $$ = cat3_str($1, make1_str("except"), $3);
2818 ForUpdateNotAllowed = 1;
2820 | select_clause UNION opt_union select_clause
2822 $$ = cat4_str($1, make1_str("union"), $3, $4);
2823 ForUpdateNotAllowed = 1;
2825 | select_clause INTERSECT opt_union select_clause
2827 $$ = cat3_str($1, make1_str("intersect"), $3);
2828 ForUpdateNotAllowed = 1;
2832 SubSelect: SELECT opt_unique target_list
2833 result from_clause where_clause
2834 group_clause having_clause
2836 $$ = cat4_str(cat5_str(make1_str("select"), $2, $3, $4, $5), $6, $7, $8);
2837 if (strlen($7) > 0 || strlen($8) > 0)
2838 ForUpdateNotAllowed = 1;
2842 result: INTO OptTemp opt_table relation_name { $$= cat4_str(make1_str("into"), $2, $3, $4); }
2843 | INTO into_list { $$ = make1_str(""); }
2844 | /*EMPTY*/ { $$ = make1_str(""); }
2847 opt_table: TABLE { $$ = make1_str("table"); }
2848 | /*EMPTY*/ { $$ = make1_str(""); }
2851 opt_union: ALL { $$ = make1_str("all"); }
2852 | /*EMPTY*/ { $$ = make1_str(""); }
2855 opt_unique: DISTINCT { $$ = make1_str("distinct"); }
2856 | DISTINCT ON ColId { $$ = cat2_str(make1_str("distinct on"), $3); }
2857 | ALL { $$ = make1_str("all"); }
2858 | /*EMPTY*/ { $$ = make1_str(""); }
2861 sort_clause: ORDER BY sortby_list { $$ = cat2_str(make1_str("order by"), $3); }
2862 | /*EMPTY*/ { $$ = make1_str(""); }
2865 sortby_list: sortby { $$ = $1; }
2866 | sortby_list ',' sortby { $$ = cat3_str($1, make1_str(","), $3); }
2869 sortby: a_expr OptUseOp
2871 $$ = cat2_str($1, $2);
2875 OptUseOp: USING Op { $$ = cat2_str(make1_str("using"), $2); }
2876 | USING '<' { $$ = make1_str("using <"); }
2877 | USING '>' { $$ = make1_str("using >"); }
2878 | ASC { $$ = make1_str("asc"); }
2879 | DESC { $$ = make1_str("desc"); }
2880 | /*EMPTY*/ { $$ = make1_str(""); }
2883 opt_select_limit: LIMIT select_limit_value ',' select_offset_value
2884 { $$ = cat4_str(make1_str("limit"), $2, make1_str(","), $4); }
2885 | LIMIT select_limit_value OFFSET select_offset_value
2886 { $$ = cat4_str(make1_str("limit"), $2, make1_str("offset"), $4); }
2887 | LIMIT select_limit_value
2888 { $$ = cat2_str(make1_str("limit"), $2); }
2889 | OFFSET select_offset_value LIMIT select_limit_value
2890 { $$ = cat4_str(make1_str("offset"), $2, make1_str("limit"), $4); }
2891 | OFFSET select_offset_value
2892 { $$ = cat2_str(make1_str("offset"), $2); }
2894 { $$ = make1_str(""); }
2897 select_limit_value: Iconst { $$ = $1; }
2898 | ALL { $$ = make1_str("all"); }
2899 | PARAM { $$ = make_name(); }
2902 select_offset_value: Iconst { $$ = $1; }
2903 | PARAM { $$ = make_name(); }
2907 * jimmy bell-style recursive queries aren't supported in the
2910 * ...however, recursive addattr and rename supported. make special
2913 opt_inh_star: '*' { $$ = make1_str("*"); }
2914 | /*EMPTY*/ { $$ = make1_str(""); }
2917 relation_name_list: name_list { $$ = $1; };
2921 | name_list ',' name
2922 { $$ = cat3_str($1, make1_str(","), $3); }
2925 group_clause: GROUP BY expr_list { $$ = cat2_str(make1_str("group by"), $3); }
2926 | /*EMPTY*/ { $$ = make1_str(""); }
2929 having_clause: HAVING a_expr
2931 $$ = cat2_str(make1_str("having"), $2);
2933 | /*EMPTY*/ { $$ = make1_str(""); }
2936 for_update_clause: FOR UPDATE update_list
2938 $$ = make1_str("for update");
2942 $$ = make1_str("for read only");
2949 update_list: OF va_list
2951 $$ = cat2_str(make1_str("of"), $2);
2959 /*****************************************************************************
2961 * clauses common to all Optimizable Stmts:
2965 *****************************************************************************/
2967 from_clause: FROM from_expr
2969 $$ = cat2_str(make1_str("from"), $2);
2977 from_expr: '(' join_clause_with_union ')'
2978 { $$ = make3_str(make1_str("("), $2, make1_str(")")); }
2985 table_list: table_list ',' table_expr
2986 { $$ = make3_str($1, make1_str(","), $3); }
2991 table_expr: relation_expr AS ColLabel
2993 $$ = cat3_str($1, make1_str("as"), $3);
2995 | relation_expr ColId
2997 $$ = cat2_str($1, $2);
3005 /* A UNION JOIN is the same as a FULL OUTER JOIN which *omits*
3006 * all result rows which would have matched on an INNER JOIN.
3007 * Let's reject this for now. - thomas 1999-01-08
3009 join_clause_with_union: join_clause
3011 | table_expr UNION JOIN table_expr
3012 { yyerror("UNION JOIN not yet implemented"); }
3015 join_clause: table_expr join_list
3017 $$ = cat2_str($1, $2);
3021 join_list: join_list join_expr
3023 $$ = cat2_str($1, $2);
3031 /* This is everything but the left side of a join.
3032 * Note that a CROSS JOIN is the same as an unqualified
3033 * inner join, so just pass back the right-side table.
3034 * A NATURAL JOIN implicitly matches column names between
3035 * tables, so we'll collect those during the later transformation.
3038 join_expr: join_type JOIN table_expr join_qual
3040 $$ = cat4_str($1, make1_str("join"), $3, $4);
3042 | NATURAL join_type JOIN table_expr
3044 $$ = cat4_str(make1_str("natural"), $2, make1_str("join"), $4);
3046 | CROSS JOIN table_expr
3047 { $$ = cat2_str(make1_str("cross join"), $3); }
3050 /* OUTER is just noise... */
3051 join_type: FULL join_outer
3053 $$ = cat2_str(make1_str("full"), $2);
3054 fprintf(stderr,"FULL OUTER JOIN not yet implemented\n");
3058 $$ = cat2_str(make1_str("left"), $2);
3059 fprintf(stderr,"LEFT OUTER JOIN not yet implemented\n");
3063 $$ = cat2_str(make1_str("right"), $2);
3064 fprintf(stderr,"RIGHT OUTER JOIN not yet implemented\n");
3068 $$ = make1_str("outer");
3069 fprintf(stderr,"OUTER JOIN not yet implemented\n");
3073 $$ = make1_str("inner");
3081 join_outer: OUTER_P { $$ = make1_str("outer"); }
3082 | /*EMPTY*/ { $$ = make1_str(""); /* no qualifiers */ }
3085 /* JOIN qualification clauses
3086 * Possibilities are:
3087 * USING ( column list ) allows only unqualified column names,
3088 * which must match between tables.
3089 * ON expr allows more general qualifications.
3090 * - thomas 1999-01-07
3093 join_qual: USING '(' using_list ')' { $$ = make3_str(make1_str("using ("), $3, make1_str(")")); }
3094 | ON a_expr { $$ = cat2_str(make1_str("on"), $2); }
3097 using_list: using_list ',' using_expr { $$ = make3_str($1, make1_str(","), $3); }
3098 | using_expr { $$ = $1; }
3107 where_clause: WHERE a_expr { $$ = cat2_str(make1_str("where"), $2); }
3108 | /*EMPTY*/ { $$ = make1_str(""); /* no qualifiers */ }
3111 relation_expr: relation_name
3113 /* normal relations */
3116 | relation_name '*' %prec '='
3118 /* inheritance query */
3119 $$ = cat2_str($1, make1_str("*"));
3122 opt_array_bounds: '[' ']' opt_array_bounds
3125 $$.index2 = $3.index1;
3126 $$.str = cat2_str(make1_str("[]"), $3.str);
3128 | '[' Iresult ']' opt_array_bounds
3130 char *txt = mm_alloc(20L);
3132 sprintf (txt, "%d", $2);
3134 $$.index2 = $4.index1;
3135 $$.str = cat4_str(make1_str("["), txt, make1_str("]"), $4.str);
3141 $$.str= make1_str("");
3145 Iresult: Iconst { $$ = atol($1); }
3146 | '(' Iresult ')' { $$ = $2; }
3147 | Iresult '+' Iresult { $$ = $1 + $3; }
3148 | Iresult '-' Iresult { $$ = $1 - $3; }
3149 | Iresult '*' Iresult { $$ = $1 * $3; }
3150 | Iresult '/' Iresult { $$ = $1 / $3; }
3151 | Iresult '%' Iresult { $$ = $1 % $3; }
3155 /*****************************************************************************
3158 * SQL92 introduces a large amount of type-specific syntax.
3159 * Define individual clauses to handle these cases, and use
3160 * the generic case to handle regular type-extensible Postgres syntax.
3161 * - thomas 1997-10-10
3163 *****************************************************************************/
3165 Typename: SimpleTypename opt_array_bounds
3167 $$ = cat2_str($1, $2.str);
3169 | SETOF SimpleTypename
3171 $$ = cat2_str(make1_str("setof"), $2);
3175 SimpleTypename: Generic { $$ = $1; }
3176 | Datetime { $$ = $1; }
3177 | Numeric { $$ = $1; }
3178 | Character { $$ = $1; }
3187 generic: ident { $$ = $1; }
3188 | TYPE_P { $$ = make1_str("type"); }
3189 | SQL_AT { $$ = make1_str("at"); }
3190 | SQL_AUTOCOMMIT { $$ = make1_str("autocommit"); }
3191 | SQL_BOOL { $$ = make1_str("bool"); }
3192 | SQL_BREAK { $$ = make1_str("break"); }
3193 | SQL_CALL { $$ = make1_str("call"); }
3194 | SQL_CONNECT { $$ = make1_str("connect"); }
3195 | SQL_CONNECTION { $$ = make1_str("connection"); }
3196 | SQL_CONTINUE { $$ = make1_str("continue"); }
3197 | SQL_DEALLOCATE { $$ = make1_str("deallocate"); }
3198 | SQL_DISCONNECT { $$ = make1_str("disconnect"); }
3199 | SQL_FOUND { $$ = make1_str("found"); }
3200 | SQL_GO { $$ = make1_str("go"); }
3201 | SQL_GOTO { $$ = make1_str("goto"); }
3202 | SQL_IDENTIFIED { $$ = make1_str("identified"); }
3203 | SQL_IMMEDIATE { $$ = make1_str("immediate"); }
3204 | SQL_INDICATOR { $$ = make1_str("indicator"); }
3205 | SQL_INT { $$ = make1_str("int"); }
3206 | SQL_LONG { $$ = make1_str("long"); }
3207 | SQL_OFF { $$ = make1_str("off"); }
3208 | SQL_OPEN { $$ = make1_str("open"); }
3209 | SQL_PREPARE { $$ = make1_str("prepare"); }
3210 | SQL_RELEASE { $$ = make1_str("release"); }
3211 | SQL_SECTION { $$ = make1_str("section"); }
3212 | SQL_SHORT { $$ = make1_str("short"); }
3213 | SQL_SIGNED { $$ = make1_str("signed"); }
3214 | SQL_SQLERROR { $$ = make1_str("sqlerror"); }
3215 | SQL_SQLPRINT { $$ = make1_str("sqlprint"); }
3216 | SQL_SQLWARNING { $$ = make1_str("sqlwarning"); }
3217 | SQL_STOP { $$ = make1_str("stop"); }
3218 | SQL_STRUCT { $$ = make1_str("struct"); }
3219 | SQL_UNSIGNED { $$ = make1_str("unsigned"); }
3220 | SQL_VAR { $$ = make1_str("var"); }
3221 | SQL_WHENEVER { $$ = make1_str("whenever"); }
3224 /* SQL92 numeric data types
3225 * Check FLOAT() precision limits assuming IEEE floating types.
3226 * Provide real DECIMAL() and NUMERIC() implementations now - Jan 1998-12-30
3227 * - thomas 1997-09-18
3229 Numeric: FLOAT opt_float
3231 $$ = cat2_str(make1_str("float"), $2);
3235 $$ = make1_str("double precision");
3237 | DECIMAL opt_decimal
3239 $$ = cat2_str(make1_str("decimal"), $2);
3241 | NUMERIC opt_numeric
3243 $$ = cat2_str(make1_str("numeric"), $2);
3248 { $$ = make1_str("float"); }
3250 { $$ = make1_str("double precision"); }
3252 { $$ = make1_str("decimal"); }
3254 { $$ = make1_str("numeric"); }
3257 opt_float: '(' Iconst ')'
3260 yyerror("precision for FLOAT must be at least 1");
3261 else if (atol($2) >= 16)
3262 yyerror("precision for FLOAT must be less than 16");
3263 $$ = make3_str(make1_str("("), $2, make1_str(")"));
3271 opt_numeric: '(' Iconst ',' Iconst ')'
3273 if (atol($2) < 1 || atol($2) > NUMERIC_MAX_PRECISION) {
3274 sprintf(errortext, "NUMERIC precision %s must be between 1 and %d", $2, NUMERIC_MAX_PRECISION);
3277 if (atol($4) < 0 || atol($4) > atol($2)) {
3278 sprintf(errortext, "NUMERIC scale %s must be between 0 and precision %s", $4, $2);
3281 $$ = cat3_str(make2_str(make1_str("("), $2), make1_str(","), make2_str($4, make1_str(")")));
3285 if (atol($2) < 1 || atol($2) > NUMERIC_MAX_PRECISION) {
3286 sprintf(errortext, "NUMERIC precision %s must be between 1 and %d", $2, NUMERIC_MAX_PRECISION);
3289 $$ = make3_str(make1_str("("), $2, make1_str(")"));
3297 opt_decimal: '(' Iconst ',' Iconst ')'
3299 if (atol($2) < 1 || atol($2) > NUMERIC_MAX_PRECISION) {
3300 sprintf(errortext, "NUMERIC precision %s must be between 1 and %d", $2, NUMERIC_MAX_PRECISION);
3303 if (atol($4) < 0 || atol($4) > atol($2)) {
3304 sprintf(errortext, "NUMERIC scale %s must be between 0 and precision %s", $4, $2);
3307 $$ = cat3_str(make2_str(make1_str("("), $2), make1_str(","), make2_str($4, make1_str(")")));
3311 if (atol($2) < 1 || atol($2) > NUMERIC_MAX_PRECISION) {
3312 sprintf(errortext, "NUMERIC precision %s must be between 1 and %d", $2, NUMERIC_MAX_PRECISION);
3315 $$ = make3_str(make1_str("("), $2, make1_str(")"));
3323 /* SQL92 character data types
3324 * The following implements CHAR() and VARCHAR().
3327 Character: character '(' Iconst ')'
3329 if (strncasecmp($1, "char", strlen("char")) && strncasecmp($1, "varchar", strlen("varchar")))
3330 yyerror("internal parsing error; unrecognized character type");
3332 sprintf(errortext, "length for '%s' type must be at least 1",$1);
3335 else if (atol($3) > MaxAttrSize) {
3336 sprintf(errortext, "length for type '%s' cannot exceed %ld", $1, MaxAttrSize);
3340 $$ = cat2_str($1, make3_str(make1_str("("), $3, make1_str(")")));
3348 character: CHARACTER opt_varying opt_charset opt_collate
3351 fprintf(stderr, "COLLATE %s not yet implemented",$4);
3353 $$ = cat4_str(make1_str("character"), $2, $3, $4);
3355 | CHAR opt_varying { $$ = cat2_str(make1_str("char"), $2); }
3356 | VARCHAR { $$ = make1_str("varchar"); }
3357 | NATIONAL CHARACTER opt_varying { $$ = cat2_str(make1_str("national character"), $3); }
3358 | NCHAR opt_varying { $$ = cat2_str(make1_str("nchar"), $2); }
3361 opt_varying: VARYING { $$ = make1_str("varying"); }
3362 | /*EMPTY*/ { $$ = make1_str(""); }
3365 opt_charset: CHARACTER SET ColId { $$ = cat2_str(make1_str("character set"), $3); }
3366 | /*EMPTY*/ { $$ = make1_str(""); }
3369 opt_collate: COLLATE ColId { $$ = cat2_str(make1_str("collate"), $2); }
3370 | /*EMPTY*/ { $$ = make1_str(""); }
3377 | TIMESTAMP opt_timezone
3379 $$ = cat2_str(make1_str("timestamp"), $2);
3383 $$ = make1_str("time");
3385 | INTERVAL opt_interval
3387 $$ = cat2_str(make1_str("interval"), $2);
3391 datetime: YEAR_P { $$ = make1_str("year"); }
3392 | MONTH_P { $$ = make1_str("month"); }
3393 | DAY_P { $$ = make1_str("day"); }
3394 | HOUR_P { $$ = make1_str("hour"); }
3395 | MINUTE_P { $$ = make1_str("minute"); }
3396 | SECOND_P { $$ = make1_str("second"); }
3399 opt_timezone: WITH TIME ZONE { $$ = make1_str("with time zone"); }
3400 | /*EMPTY*/ { $$ = make1_str(""); }
3403 opt_interval: datetime { $$ = $1; }
3404 | YEAR_P TO MONTH_P { $$ = make1_str("year to #month"); }
3405 | DAY_P TO HOUR_P { $$ = make1_str("day to hour"); }
3406 | DAY_P TO MINUTE_P { $$ = make1_str("day to minute"); }
3407 | DAY_P TO SECOND_P { $$ = make1_str("day to second"); }
3408 | HOUR_P TO MINUTE_P { $$ = make1_str("hour to minute"); }
3409 | MINUTE_P TO SECOND_P { $$ = make1_str("minute to second"); }
3410 | HOUR_P TO SECOND_P { $$ = make1_str("hour to second"); }
3411 | /*EMPTY*/ { $$ = make1_str(""); }
3415 /*****************************************************************************
3417 * expression grammar, still needs some cleanup
3419 *****************************************************************************/
3421 a_expr_or_null: a_expr
3425 $$ = make1_str("null");
3429 /* Expressions using row descriptors
3430 * Define row_descriptor to allow yacc to break the reduce/reduce conflict
3431 * with singleton expressions.
3432 * Eliminated lots of code by defining row_op and sub_type clauses.
3433 * However, can not consolidate EXPR_LINK case with others subselects
3434 * due to shift/reduce conflict with the non-subselect clause (the parser
3435 * would have to look ahead more than one token to resolve the conflict).
3436 * - thomas 1998-05-09
3438 row_expr: '(' row_descriptor ')' IN '(' SubSelect ')'
3440 $$ = make5_str(make1_str("("), $2, make1_str(") in ("), $6, make1_str(")"));
3442 | '(' row_descriptor ')' NOT IN '(' SubSelect ')'
3444 $$ = make5_str(make1_str("("), $2, make1_str(") not in ("), $7, make1_str(")"));
3446 | '(' row_descriptor ')' row_op sub_type '(' SubSelect ')'
3448 $$ = make4_str(make5_str(make1_str("("), $2, make1_str(")"), $4, $5), make1_str("("), $7, make1_str(")"));
3450 | '(' row_descriptor ')' row_op '(' SubSelect ')'
3452 $$ = make3_str(make5_str(make1_str("("), $2, make1_str(")"), $4, make1_str("(")), $6, make1_str(")"));
3454 | '(' row_descriptor ')' row_op '(' row_descriptor ')'
3456 $$ = cat3_str(make3_str(make1_str("("), $2, make1_str(")")), $4, make3_str(make1_str("("), $6, make1_str(")")));
3460 row_descriptor: row_list ',' a_expr
3462 $$ = cat3_str($1, make1_str(","), $3);
3466 row_op: Op { $$ = $1; }
3477 sub_type: ANY { $$ = make1_str("ANY"); }
3478 | ALL { $$ = make1_str("ALL"); }
3482 row_list: row_list ',' a_expr
3484 $$ = cat3_str($1, make1_str(","), $3);
3492 /* General expressions
3493 * This is the heart of the expression syntax.
3494 * Note that the BETWEEN clause looks similar to a boolean expression
3495 * and so we must define b_expr which is almost the same as a_expr
3496 * but without the boolean expressions.
3497 * All operations/expressions are allowed in a BETWEEN clause
3498 * if surrounded by parens.
3509 | ColId opt_indirection
3511 $$ = cat2_str($1, $2);
3513 | '-' a_expr %prec UMINUS
3514 { $$ = cat2_str(make1_str("-"), $2); }
3516 { $$ = cat2_str(make1_str("%"), $2); }
3518 { $$ = cat2_str(make1_str("^"), $2); }
3520 { $$ = cat2_str($1, make1_str("%")); }
3522 { $$ = cat2_str($1, make1_str("^")); }
3524 { $$ = cat3_str($1, make1_str("+"), $3); }
3526 { $$ = cat3_str($1, make1_str("-"), $3); }
3528 { $$ = cat3_str($1, make1_str("/"), $3); }
3530 { $$ = cat3_str($1, make1_str("%"), $3); }
3532 { $$ = cat3_str($1, make1_str("*"), $3); }
3534 { $$ = cat3_str($1, make1_str("^"), $3); }
3536 { $$ = cat3_str($1, make1_str("<"), $3); }
3538 { $$ = cat3_str($1, make1_str(">"), $3); }
3540 { $$ = cat2_str($1, make1_str("= NULL")); }
3542 { $$ = cat2_str(make1_str("= NULL"), $3); }
3544 { $$ = cat3_str($1, make1_str("="), $3); }
3545 /* not possible in embedded sql | ':' a_expr
3546 { $$ = cat2_str(make1_str(":"), $2); }
3549 { $$ = cat2_str(make1_str(";"), $2); }
3551 { $$ = cat2_str(make1_str("|"), $2); }
3552 | a_expr TYPECAST Typename
3554 $$ = cat3_str($1, make1_str("::"), $3);
3556 | CAST '(' a_expr AS Typename ')'
3558 $$ = cat3_str(make2_str(make1_str("cast("), $3), make1_str("as"), make2_str($5, make1_str(")")));
3560 | '(' a_expr_or_null ')'
3561 { $$ = make3_str(make1_str("("), $2, make1_str(")")); }
3563 { $$ = cat3_str($1, $2, $3); }
3564 | a_expr LIKE a_expr
3565 { $$ = cat3_str($1, make1_str("like"), $3); }
3566 | a_expr NOT LIKE a_expr
3567 { $$ = cat3_str($1, make1_str("not like"), $4); }
3569 { $$ = cat2_str($1, $2); }
3571 { $$ = cat2_str($1, $2); }
3572 | func_name '(' '*' ')'
3574 $$ = cat2_str($1, make1_str("(*)"));
3578 $$ = cat2_str($1, make1_str("()"));
3580 | func_name '(' expr_list ')'
3582 $$ = make4_str($1, make1_str("("), $3, make1_str(")"));
3586 $$ = make1_str("current_date");
3590 $$ = make1_str("current_time");
3592 | CURRENT_TIME '(' Iconst ')'
3595 fprintf(stderr,"CURRENT_TIME(%s) precision not implemented; zero used instead", $3);
3596 $$ = make1_str("current_time");
3600 $$ = make1_str("current_timestamp");
3602 | CURRENT_TIMESTAMP '(' Iconst ')'
3605 fprintf(stderr,"CURRENT_TIMESTAMP(%s) precision not implemented; zero used instead",$3);
3606 $$ = make1_str("current_timestamp");
3610 $$ = make1_str("current_user");
3614 $$ = make1_str("user");
3616 | EXISTS '(' SubSelect ')'
3618 $$ = make3_str(make1_str("exists("), $3, make1_str(")"));
3620 | EXTRACT '(' extract_list ')'
3622 $$ = make3_str(make1_str("extract("), $3, make1_str(")"));
3624 | POSITION '(' position_list ')'
3626 $$ = make3_str(make1_str("position("), $3, make1_str(")"));
3628 | SUBSTRING '(' substr_list ')'
3630 $$ = make3_str(make1_str("substring("), $3, make1_str(")"));
3632 /* various trim expressions are defined in SQL92 - thomas 1997-07-19 */
3633 | TRIM '(' BOTH trim_list ')'
3635 $$ = make3_str(make1_str("trim(both"), $4, make1_str(")"));
3637 | TRIM '(' LEADING trim_list ')'
3639 $$ = make3_str(make1_str("trim(leading"), $4, make1_str(")"));
3641 | TRIM '(' TRAILING trim_list ')'
3643 $$ = make3_str(make1_str("trim(trailing"), $4, make1_str(")"));
3645 | TRIM '(' trim_list ')'
3647 $$ = make3_str(make1_str("trim("), $3, make1_str(")"));
3650 { $$ = cat2_str($1, make1_str("isnull")); }
3652 { $$ = cat2_str($1, make1_str("is null")); }
3654 { $$ = cat2_str($1, make1_str("notnull")); }
3655 | a_expr IS NOT NULL_P
3656 { $$ = cat2_str($1, make1_str("is not null")); }
3657 /* IS TRUE, IS FALSE, etc used to be function calls
3658 * but let's make them expressions to allow the optimizer
3659 * a chance to eliminate them if a_expr is a constant string.
3660 * - thomas 1997-12-22
3664 { $$ = cat2_str($1, make1_str("is true")); }
3666 | a_expr IS NOT FALSE_P
3668 { $$ = cat2_str($1, make1_str("is not false")); }
3672 { $$ = cat2_str($1, make1_str("is false")); }
3674 | a_expr IS NOT TRUE_P
3676 { $$ = cat2_str($1, make1_str("is not true")); }
3678 | a_expr BETWEEN b_expr AND b_expr
3680 $$ = cat5_str($1, make1_str("between"), $3, make1_str("and"), $5);
3682 | a_expr NOT BETWEEN b_expr AND b_expr
3684 $$ = cat5_str($1, make1_str("not between"), $4, make1_str("and"), $6);
3686 | a_expr IN '(' in_expr ')'
3688 $$ = make4_str($1, make1_str(" in ("), $4, make1_str(")"));
3690 | a_expr NOT IN '(' in_expr ')'
3692 $$ = make4_str($1, make1_str(" not in ("), $5, make1_str(")"));
3694 | a_expr Op '(' SubSelect ')'
3696 $$ = cat3_str($1, $2, make3_str(make1_str("("), $4, make1_str(")")));
3698 | a_expr '+' '(' SubSelect ')'
3700 $$ = make4_str($1, make1_str("+("), $4, make1_str(")"));
3702 | a_expr '-' '(' SubSelect ')'
3704 $$ = make4_str($1, make1_str("-("), $4, make1_str(")"));
3706 | a_expr '/' '(' SubSelect ')'
3708 $$ = make4_str($1, make1_str("/("), $4, make1_str(")"));
3710 | a_expr '%' '(' SubSelect ')'
3712 $$ = make4_str($1, make1_str("%("), $4, make1_str(")"));
3714 | a_expr '*' '(' SubSelect ')'
3716 $$ = make4_str($1, make1_str("*("), $4, make1_str(")"));
3718 | a_expr '<' '(' SubSelect ')'
3720 $$ = make4_str($1, make1_str("<("), $4, make1_str(")"));
3722 | a_expr '>' '(' SubSelect ')'
3724 $$ = make4_str($1, make1_str(">("), $4, make1_str(")"));
3726 | a_expr '=' '(' SubSelect ')'
3728 $$ = make4_str($1, make1_str("=("), $4, make1_str(")"));
3730 | a_expr Op ANY '(' SubSelect ')'
3732 $$ = cat3_str($1, $2, make3_str(make1_str("any("), $5, make1_str(")")));
3734 | a_expr '+' ANY '(' SubSelect ')'
3736 $$ = make4_str($1, make1_str("+ any("), $5, make1_str(")"));
3738 | a_expr '-' ANY '(' SubSelect ')'
3740 $$ = make4_str($1, make1_str("- any("), $5, make1_str(")"));
3742 | a_expr '/' ANY '(' SubSelect ')'
3744 $$ = make4_str($1, make1_str("/ any("), $5, make1_str(")"));
3746 | a_expr '%' ANY '(' SubSelect ')'
3748 $$ = make4_str($1, make1_str("% any("), $5, make1_str(")"));
3750 | a_expr '*' ANY '(' SubSelect ')'
3752 $$ = make4_str($1, make1_str("* any("), $5, make1_str(")"));
3754 | a_expr '<' ANY '(' SubSelect ')'
3756 $$ = make4_str($1, make1_str("< any("), $5, make1_str(")"));
3758 | a_expr '>' ANY '(' SubSelect ')'
3760 $$ = make4_str($1, make1_str("> any("), $5, make1_str(")"));
3762 | a_expr '=' ANY '(' SubSelect ')'
3764 $$ = make4_str($1, make1_str("= any("), $5, make1_str(")"));
3766 | a_expr Op ALL '(' SubSelect ')'
3768 $$ = cat3_str($1, $2, make3_str(make1_str("all ("), $5, make1_str(")")));
3770 | a_expr '+' ALL '(' SubSelect ')'
3772 $$ = make4_str($1, make1_str("+ all("), $5, make1_str(")"));
3774 | a_expr '-' ALL '(' SubSelect ')'
3776 $$ = make4_str($1, make1_str("- all("), $5, make1_str(")"));
3778 | a_expr '/' ALL '(' SubSelect ')'
3780 $$ = make4_str($1, make1_str("/ all("), $5, make1_str(")"));
3782 | a_expr '%' ALL '(' SubSelect ')'
3784 $$ = make4_str($1, make1_str("% all("), $5, make1_str(")"));
3786 | a_expr '*' ALL '(' SubSelect ')'
3788 $$ = make4_str($1, make1_str("* all("), $5, make1_str(")"));
3790 | a_expr '<' ALL '(' SubSelect ')'
3792 $$ = make4_str($1, make1_str("< all("), $5, make1_str(")"));
3794 | a_expr '>' ALL '(' SubSelect ')'
3796 $$ = make4_str($1, make1_str("> all("), $5, make1_str(")"));
3798 | a_expr '=' ALL '(' SubSelect ')'
3800 $$ = make4_str($1, make1_str("= all("), $5, make1_str(")"));
3803 { $$ = cat3_str($1, make1_str("and"), $3); }
3805 { $$ = cat3_str($1, make1_str("or"), $3); }
3807 { $$ = cat2_str(make1_str("not"), $2); }
3811 { $$ = make1_str("?"); }
3814 /* Restricted expressions
3815 * b_expr is a subset of the complete expression syntax
3816 * defined by a_expr. b_expr is used in BETWEEN clauses
3817 * to eliminate parser ambiguities stemming from the AND keyword.
3825 | ColId opt_indirection
3827 $$ = cat2_str($1, $2);
3829 | '-' b_expr %prec UMINUS
3830 { $$ = cat2_str(make1_str("-"), $2); }
3832 { $$ = cat2_str(make1_str("%"), $2); }
3834 { $$ = cat2_str(make1_str("^"), $2); }
3836 { $$ = cat2_str($1, make1_str("%")); }
3838 { $$ = cat2_str($1, make1_str("^")); }
3840 { $$ = cat3_str($1, make1_str("+"), $3); }
3842 { $$ = cat3_str($1, make1_str("-"), $3); }
3844 { $$ = cat3_str($1, make1_str("/"), $3); }
3846 { $$ = cat3_str($1, make1_str("%"), $3); }
3848 { $$ = cat3_str($1, make1_str("*"), $3); }
3850 { $$ = cat3_str($1, make1_str("^"), $3); }
3851 /* not possible in embedded sql | ':' b_expr
3852 { $$ = cat2_str(make1_str(":"), $2); }
3855 { $$ = cat2_str(make1_str(";"), $2); }
3857 { $$ = cat2_str(make1_str("|"), $2); }
3858 | b_expr TYPECAST Typename
3860 $$ = cat3_str($1, make1_str("::"), $3);
3862 | CAST '(' b_expr AS Typename ')'
3864 $$ = cat3_str(make2_str(make1_str("cast("), $3), make1_str("as"), make2_str($5, make1_str(")")));
3867 { $$ = make3_str(make1_str("("), $2, make1_str(")")); }
3869 { $$ = cat3_str($1, $2, $3); }
3871 { $$ = cat2_str($1, $2); }
3873 { $$ = cat2_str($1, $2); }
3876 $$ = cat2_str($1, make1_str("()"));
3878 | func_name '(' expr_list ')'
3880 $$ = make4_str($1, make1_str("("), $3, make1_str(")"));
3884 $$ = make1_str("current_date");
3888 $$ = make1_str("current_time");
3890 | CURRENT_TIME '(' Iconst ')'
3893 fprintf(stderr,"CURRENT_TIME(%s) precision not implemented; zero used instead", $3);
3894 $$ = make1_str("current_time");
3898 $$ = make1_str("current_timestamp");
3900 | CURRENT_TIMESTAMP '(' Iconst ')'
3903 fprintf(stderr,"CURRENT_TIMESTAMP(%s) precision not implemented; zero used instead",$3);
3904 $$ = make1_str("current_timestamp");
3908 $$ = make1_str("current_user");
3912 $$ = make1_str("user");
3914 | POSITION '(' position_list ')'
3916 $$ = make3_str(make1_str("position ("), $3, make1_str(")"));
3918 | SUBSTRING '(' substr_list ')'
3920 $$ = make3_str(make1_str("substring ("), $3, make1_str(")"));
3922 /* various trim expressions are defined in SQL92 - thomas 1997-07-19 */
3923 | TRIM '(' BOTH trim_list ')'
3925 $$ = make3_str(make1_str("trim(both"), $4, make1_str(")"));
3927 | TRIM '(' LEADING trim_list ')'
3929 $$ = make3_str(make1_str("trim(leading"), $4, make1_str(")"));
3931 | TRIM '(' TRAILING trim_list ')'
3933 $$ = make3_str(make1_str("trim(trailing"), $4, make1_str(")"));
3935 | TRIM '(' trim_list ')'
3937 $$ = make3_str(make1_str("trim("), $3, make1_str(")"));
3943 opt_indirection: '[' ecpg_expr ']' opt_indirection
3945 $$ = cat4_str(make1_str("["), $2, make1_str("]"), $4);
3947 | '[' ecpg_expr ':' ecpg_expr ']' opt_indirection
3949 $$ = cat2_str(cat5_str(make1_str("["), $2, make1_str(":"), $4, make1_str("]")), $6);
3952 { $$ = make1_str(""); }
3955 expr_list: a_expr_or_null
3957 | expr_list ',' a_expr_or_null
3958 { $$ = cat3_str($1, make1_str(","), $3); }
3959 | expr_list USING a_expr
3960 { $$ = cat3_str($1, make1_str("using"), $3); }
3963 extract_list: extract_arg FROM a_expr
3965 $$ = cat3_str($1, make1_str("from"), $3);
3968 { $$ = make1_str(""); }
3970 { $$ = make1_str("?"); }
3973 extract_arg: datetime { $$ = $1; }
3974 | TIMEZONE_HOUR { $$ = make1_str("timezone_hour"); }
3975 | TIMEZONE_MINUTE { $$ = make1_str("timezone_minute"); }
3978 /* position_list uses b_expr not a_expr to avoid conflict with general IN */
3979 position_list: b_expr IN b_expr
3980 { $$ = cat3_str($1, make1_str("in"), $3); }
3982 { $$ = make1_str(""); }
3985 substr_list: expr_list substr_from substr_for
3987 $$ = cat3_str($1, $2, $3);
3990 { $$ = make1_str(""); }
3993 substr_from: FROM expr_list
3994 { $$ = cat2_str(make1_str("from"), $2); }
4001 substr_for: FOR expr_list
4002 { $$ = cat2_str(make1_str("for"), $2); }
4004 { $$ = make1_str(""); }
4007 trim_list: a_expr FROM expr_list
4008 { $$ = cat3_str($1, make1_str("from"), $3); }
4010 { $$ = cat2_str(make1_str("from"), $2); }
4023 in_expr_nodes: a_expr
4025 | in_expr_nodes ',' a_expr
4026 { $$ = cat3_str($1, make1_str(","), $3);}
4030 * Define SQL92-style case clause.
4031 * Allow all four forms described in the standard:
4032 * - Full specification
4033 * CASE WHEN a = b THEN c ... ELSE d END
4034 * - Implicit argument
4035 * CASE a WHEN b THEN c ... ELSE d END
4036 * - Conditional NULL
4038 * same as CASE WHEN x = y THEN NULL ELSE x END
4039 * - Conditional substitution from list, use first non-null argument
4041 * same as CASE WHEN a IS NOT NULL THEN a WHEN b IS NOT NULL THEN b ... END
4042 * - thomas 1998-11-09
4044 case_expr: CASE case_arg when_clause_list case_default END_TRANS
4045 { $$ = cat5_str(make1_str("case"), $2, $3, $4, make1_str("end")); }
4046 | NULLIF '(' a_expr ',' a_expr ')'
4048 $$ = cat5_str(make1_str("nullif("), $3, make1_str(","), $5, make1_str(")"));
4050 fprintf(stderr, "NULLIF() not yet fully implemented");
4052 | COALESCE '(' expr_list ')'
4054 $$ = cat3_str(make1_str("coalesce("), $3, make1_str(")"));
4058 when_clause_list: when_clause_list when_clause
4059 { $$ = cat2_str($1, $2); }
4064 when_clause: WHEN a_expr THEN a_expr_or_null
4066 $$ = cat4_str(make1_str("when"), $2, make1_str("then"), $4);
4070 case_default: ELSE a_expr_or_null { $$ = cat2_str(make1_str("else"), $2); }
4071 | /*EMPTY*/ { $$ = make1_str(""); }
4078 { $$ = make1_str(""); }
4081 attr: relation_name '.' attrs opt_indirection
4083 $$ = make4_str($1, make1_str("."), $3, $4);
4085 | ParamNo '.' attrs opt_indirection
4087 $$ = make4_str($1, make1_str("."), $3, $4);
4093 | attrs '.' attr_name
4094 { $$ = make3_str($1, make1_str("."), $3); }
4096 { $$ = make2_str($1, make1_str(".*")); }
4100 /*****************************************************************************
4104 *****************************************************************************/
4106 /* Target lists as found in SELECT ... and INSERT VALUES ( ... ) */
4107 target_list: target_list ',' target_el
4108 { $$ = cat3_str($1, make1_str(","), $3); }
4113 /* AS is not optional because shift/red conflict with unary ops */
4114 target_el: a_expr_or_null AS ColLabel
4116 $$ = cat3_str($1, make1_str("as"), $3);
4122 | relation_name '.' '*'
4124 $$ = make2_str($1, make1_str(".*"));
4128 $$ = make1_str("*");
4132 /* Target list as found in UPDATE table SET ... */
4133 update_target_list: update_target_list ',' update_target_el
4134 { $$ = cat3_str($1, make1_str(","),$3); }
4137 | '*' { $$ = make1_str("*"); }
4140 update_target_el: ColId opt_indirection '=' a_expr_or_null
4142 $$ = cat4_str($1, $2, make1_str("="), $4);
4146 /*****************************************************************************
4148 * Names and constants
4150 *****************************************************************************/
4152 relation_name: SpecialRuleRelation
4158 /* disallow refs to variable system tables */
4159 if (strcmp(LogRelationName, $1) == 0
4160 || strcmp(VariableRelationName, $1) == 0) {
4161 sprintf(errortext, make1_str("%s cannot be accessed by users"),$1);
4169 database_name: ColId { $$ = $1; };
4170 access_method: ident { $$ = $1; };
4171 attr_name: ColId { $$ = $1; };
4172 class: ident { $$ = $1; };
4173 index_name: ColId { $$ = $1; };
4176 * Include date/time keywords as SQL92 extension.
4177 * Include TYPE as a SQL92 unreserved keyword. - thomas 1997-10-05
4179 name: ColId { $$ = $1; };
4180 func_name: ColId { $$ = $1; };
4182 file_name: Sconst { $$ = $1; };
4183 /* NOT USED recipe_name: ident { $$ = $1; };*/
4186 * Include TRUE/FALSE for SQL3 support. - thomas 1997-10-24
4200 /* this rule formerly used Typename, but that causes reduce conf licts
4201 * with subscripted column names ...
4203 | SimpleTypename Sconst
4205 $$ = cat2_str($1, $2);
4211 $$ = make1_str("true");
4215 $$ = make1_str("false");
4219 ParamNo: PARAM opt_indirection
4221 $$ = cat2_str(make_name(), $2);
4225 Iconst: ICONST { $$ = make_name();};
4226 Fconst: FCONST { $$ = make_name();};
4228 $$ = (char *)mm_alloc(strlen($1) + 3);
4231 $$[strlen($1)+2]='\0';
4232 $$[strlen($1)+1]='\'';
4235 UserId: ident { $$ = $1;};
4237 /* Column and type identifier
4238 * Does not include explicit datetime types
4239 * since these must be decoupled in Typename syntax.
4240 * Use ColId for most identifiers. - thomas 1997-10-21
4249 /* Column identifier
4250 * Include date/time keywords as SQL92 extension.
4251 * Include TYPE as a SQL92 unreserved keyword. - thomas 1997-10-05
4252 * Add other keywords. Note that as the syntax expands,
4253 * some of these keywords will have to be removed from this
4254 * list due to shift/reduce conflicts in yacc. If so, move
4255 * down to the ColLabel entity. - thomas 1997-11-06
4257 ColId: ident { $$ = $1; }
4258 | datetime { $$ = $1; }
4259 | ABSOLUTE { $$ = make1_str("absolute"); }
4260 | ACCESS { $$ = make1_str("access"); }
4261 | ACTION { $$ = make1_str("action"); }
4262 | AFTER { $$ = make1_str("after"); }
4263 | AGGREGATE { $$ = make1_str("aggregate"); }
4264 | BACKWARD { $$ = make1_str("backward"); }
4265 | BEFORE { $$ = make1_str("before"); }
4266 | CACHE { $$ = make1_str("cache"); }
4267 | COMMITTED { $$ = make1_str("committed"); }
4268 | CREATEDB { $$ = make1_str("createdb"); }
4269 | CREATEUSER { $$ = make1_str("createuser"); }
4270 | CYCLE { $$ = make1_str("cycle"); }
4271 | DATABASE { $$ = make1_str("database"); }
4272 | DELIMITERS { $$ = make1_str("delimiters"); }
4273 | DOUBLE { $$ = make1_str("double"); }
4274 | EACH { $$ = make1_str("each"); }
4275 | ENCODING { $$ = make1_str("encoding"); }
4276 | EXCLUSIVE { $$ = make1_str("exclusive"); }
4277 | FORWARD { $$ = make1_str("forward"); }
4278 | FUNCTION { $$ = make1_str("function"); }
4279 | HANDLER { $$ = make1_str("handler"); }
4280 | INCREMENT { $$ = make1_str("increment"); }
4281 | INDEX { $$ = make1_str("index"); }
4282 | INHERITS { $$ = make1_str("inherits"); }
4283 | INSENSITIVE { $$ = make1_str("insensitive"); }
4284 | INSTEAD { $$ = make1_str("instead"); }
4285 | ISNULL { $$ = make1_str("isnull"); }
4286 | KEY { $$ = make1_str("key"); }
4287 | LANGUAGE { $$ = make1_str("language"); }
4288 | LANCOMPILER { $$ = make1_str("lancompiler"); }
4289 | LOCATION { $$ = make1_str("location"); }
4290 | MATCH { $$ = make1_str("match"); }
4291 | MAXVALUE { $$ = make1_str("maxvalue"); }
4292 | MINVALUE { $$ = make1_str("minvalue"); }
4293 | MODE { $$ = make1_str("mode"); }
4294 | NEXT { $$ = make1_str("next"); }
4295 | NOCREATEDB { $$ = make1_str("nocreatedb"); }
4296 | NOCREATEUSER { $$ = make1_str("nocreateuser"); }
4297 | NOTHING { $$ = make1_str("nothing"); }
4298 | NOTNULL { $$ = make1_str("notnull"); }
4299 | OF { $$ = make1_str("of"); }
4300 | OIDS { $$ = make1_str("oids"); }
4301 | ONLY { $$ = make1_str("only"); }
4302 | OPERATOR { $$ = make1_str("operator"); }
4303 | OPTION { $$ = make1_str("option"); }
4304 | PASSWORD { $$ = make1_str("password"); }
4305 | PRIOR { $$ = make1_str("prior"); }
4306 | PRIVILEGES { $$ = make1_str("privileges"); }
4307 | PROCEDURAL { $$ = make1_str("procedural"); }
4308 | READ { $$ = make1_str("read"); }
4309 /* NOT USED | RECIPE { $$ = make1_str("recipe"); } */
4310 | RELATIVE { $$ = make1_str("relative"); }
4311 | RENAME { $$ = make1_str("rename"); }
4312 | RETURNS { $$ = make1_str("returns"); }
4313 | ROW { $$ = make1_str("row"); }
4314 | RULE { $$ = make1_str("rule"); }
4315 | SCROLL { $$ = make1_str("scroll"); }
4316 | SEQUENCE { $$ = make1_str("sequence"); }
4317 | SERIAL { $$ = make1_str("serial"); }
4318 | SERIALIZABLE { $$ = make1_str("serializable"); }
4319 | SHARE { $$ = make1_str("share"); }
4320 | START { $$ = make1_str("start"); }
4321 | STATEMENT { $$ = make1_str("statement"); }
4322 | STDIN { $$ = make1_str("stdin"); }
4323 | STDOUT { $$ = make1_str("stdout"); }
4324 | TIME { $$ = make1_str("time"); }
4325 | TIMESTAMP { $$ = make1_str("timestamp"); }
4326 | TIMEZONE_HOUR { $$ = make1_str("timezone_hour"); }
4327 | TIMEZONE_MINUTE { $$ = make1_str("timezone_minute"); }
4328 | TRIGGER { $$ = make1_str("trigger"); }
4329 | TRUSTED { $$ = make1_str("trusted"); }
4330 | TYPE_P { $$ = make1_str("type"); }
4331 | VALID { $$ = make1_str("valid"); }
4332 | VERSION { $$ = make1_str("version"); }
4333 | ZONE { $$ = make1_str("zone"); }
4334 | SQL_AT { $$ = make1_str("at"); }
4335 | SQL_BOOL { $$ = make1_str("bool"); }
4336 | SQL_BREAK { $$ = make1_str("break"); }
4337 | SQL_CALL { $$ = make1_str("call"); }
4338 | SQL_CONNECT { $$ = make1_str("connect"); }
4339 | SQL_CONTINUE { $$ = make1_str("continue"); }
4340 | SQL_DEALLOCATE { $$ = make1_str("deallocate"); }
4341 | SQL_DISCONNECT { $$ = make1_str("disconnect"); }
4342 | SQL_FOUND { $$ = make1_str("found"); }
4343 | SQL_GO { $$ = make1_str("go"); }
4344 | SQL_GOTO { $$ = make1_str("goto"); }
4345 | SQL_IDENTIFIED { $$ = make1_str("identified"); }
4346 | SQL_IMMEDIATE { $$ = make1_str("immediate"); }
4347 | SQL_INDICATOR { $$ = make1_str("indicator"); }
4348 | SQL_INT { $$ = make1_str("int"); }
4349 | SQL_LONG { $$ = make1_str("long"); }
4350 | SQL_OFF { $$ = make1_str("off"); }
4351 | SQL_OPEN { $$ = make1_str("open"); }
4352 | SQL_PREPARE { $$ = make1_str("prepare"); }
4353 | SQL_RELEASE { $$ = make1_str("release"); }
4354 | SQL_SECTION { $$ = make1_str("section"); }
4355 | SQL_SHORT { $$ = make1_str("short"); }
4356 | SQL_SIGNED { $$ = make1_str("signed"); }
4357 | SQL_SQLERROR { $$ = make1_str("sqlerror"); }
4358 | SQL_SQLPRINT { $$ = make1_str("sqlprint"); }
4359 | SQL_SQLWARNING { $$ = make1_str("sqlwarning"); }
4360 | SQL_STOP { $$ = make1_str("stop"); }
4361 | SQL_STRUCT { $$ = make1_str("struct"); }
4362 | SQL_UNSIGNED { $$ = make1_str("unsigned"); }
4363 | SQL_VAR { $$ = make1_str("var"); }
4364 | SQL_WHENEVER { $$ = make1_str("whenever"); }
4367 * Allowed labels in "AS" clauses.
4368 * Include TRUE/FALSE SQL3 reserved words for Postgres backward
4369 * compatibility. Cannot allow this for column names since the
4370 * syntax would not distinguish between the constant value and
4371 * a column name. - thomas 1997-10-24
4372 * Add other keywords to this list. Note that they appear here
4373 * rather than in ColId if there was a shift/reduce conflict
4374 * when used as a full identifier. - thomas 1997-11-06
4376 ColLabel: ColId { $$ = $1; }
4377 | ABORT_TRANS { $$ = make1_str("abort"); }
4378 | ANALYZE { $$ = make1_str("analyze"); }
4379 | BINARY { $$ = make1_str("binary"); }
4380 | CASE { $$ = make1_str("case"); }
4381 | CLUSTER { $$ = make1_str("cluster"); }
4382 | COALESCE { $$ = make1_str("coalesce"); }
4383 | CONSTRAINT { $$ = make1_str("constraint"); }
4384 | COPY { $$ = make1_str("copy"); }
4385 | CURRENT { $$ = make1_str("current"); }
4386 | DO { $$ = make1_str("do"); }
4387 | ELSE { $$ = make1_str("else"); }
4388 | END_TRANS { $$ = make1_str("end"); }
4389 | EXPLAIN { $$ = make1_str("explain"); }
4390 | EXTEND { $$ = make1_str("extend"); }
4391 | FALSE_P { $$ = make1_str("false"); }
4392 | FOREIGN { $$ = make1_str("foreign"); }
4393 | GROUP { $$ = make1_str("group"); }
4394 | LISTEN { $$ = make1_str("listen"); }
4395 | LOAD { $$ = make1_str("load"); }
4396 | LOCK_P { $$ = make1_str("lock"); }
4397 | MOVE { $$ = make1_str("move"); }
4398 | NEW { $$ = make1_str("new"); }
4399 | NONE { $$ = make1_str("none"); }
4400 | NULLIF { $$ = make1_str("nullif"); }
4401 | ORDER { $$ = make1_str("order"); }
4402 | POSITION { $$ = make1_str("position"); }
4403 | PRECISION { $$ = make1_str("precision"); }
4404 | RESET { $$ = make1_str("reset"); }
4405 | SETOF { $$ = make1_str("setof"); }
4406 | SHOW { $$ = make1_str("show"); }
4407 | TABLE { $$ = make1_str("table"); }
4408 | THEN { $$ = make1_str("then"); }
4409 | TRANSACTION { $$ = make1_str("transaction"); }
4410 | TRUE_P { $$ = make1_str("true"); }
4411 | VACUUM { $$ = make1_str("vacuum"); }
4412 | VERBOSE { $$ = make1_str("verbose"); }
4413 | WHEN { $$ = make1_str("when"); }
4416 SpecialRuleRelation: CURRENT
4419 $$ = make1_str("current");
4421 yyerror("CURRENT used in non-rule query");
4426 $$ = make1_str("new");
4428 yyerror("NEW used in non-rule query");
4433 * and now special embedded SQL stuff
4437 * the exec sql connect statement: connect to the given database
4439 ECPGConnect: SQL_CONNECT TO connection_target opt_connection_name opt_user
4441 $$ = make5_str($3, make1_str(","), $5, make1_str(","), $4);
4443 | SQL_CONNECT TO DEFAULT
4445 $$ = make1_str("NULL,NULL,NULL,\"DEFAULT\"");
4447 /* also allow ORACLE syntax */
4448 | SQL_CONNECT ora_user
4450 $$ = make3_str(make1_str("NULL,"), $2, make1_str(",NULL"));
4453 connection_target: database_name opt_server opt_port
4455 /* old style: dbname[@server][:port] */
4456 if (strlen($2) > 0 && *($2) != '@')
4458 sprintf(errortext, "parse error at or near '%s'", $2);
4462 $$ = make5_str(make1_str("\""), $1, $2, $3, make1_str("\""));
4464 | db_prefix server opt_port '/' database_name opt_options
4466 /* new style: <tcp|unix>:postgresql://server[:port][/dbname] */
4467 if (strncmp($2, "://", 3) != 0)
4469 sprintf(errortext, "parse error at or near '%s'", $2);
4473 if (strncmp($1, "unix", 4) == 0 && strncmp($2 + 3, "localhost", 9) != 0)
4475 sprintf(errortext, "unix domain sockets only work on 'localhost' but not on '%9.9s'", $2);
4479 if (strncmp($1, "unix", 4) != 0 && strncmp($1, "tcp", 3) != 0)
4481 sprintf(errortext, "only protocols 'tcp' and 'unix' are supported");
4485 $$ = make4_str(make5_str(make1_str("\""), $1, $2, $3, make1_str("/")), $5, $6, make1_str("\""));
4495 $$[strlen($$) - 1] = '\"';
4499 db_prefix: ident cvariable
4501 if (strcmp($2, "postgresql") != 0 && strcmp($2, "postgres") != 0)
4503 sprintf(errortext, "parse error at or near '%s'", $2);
4507 if (strcmp($1, "tcp") != 0 && strcmp($1, "unix") != 0)
4509 sprintf(errortext, "Illegal connection type %s", $1);
4513 $$ = make3_str($1, make1_str(":"), $2);
4516 server: Op server_name
4518 if (strcmp($1, "@") != 0 && strcmp($1, "://") != 0)
4520 sprintf(errortext, "parse error at or near '%s'", $1);
4524 $$ = make2_str($1, $2);
4527 opt_server: server { $$ = $1; }
4528 | /* empty */ { $$ = make1_str(""); }
4530 server_name: ColId { $$ = $1; }
4531 | ColId '.' server_name { $$ = make3_str($1, make1_str("."), $3); }
4533 opt_port: ':' Iconst { $$ = make2_str(make1_str(":"), $2); }
4534 | /* empty */ { $$ = make1_str(""); }
4536 opt_connection_name: AS connection_target { $$ = $2; }
4537 | /* empty */ { $$ = make1_str("NULL"); }
4539 opt_user: USER ora_user { $$ = $2; }
4540 | /* empty */ { $$ = make1_str("NULL,NULL"); }
4544 $$ = make2_str($1, make1_str(",NULL"));
4546 | user_name '/' user_name
4548 $$ = make3_str($1, make1_str(","), $3);
4550 | user_name SQL_IDENTIFIED BY user_name
4552 $$ = make3_str($1, make1_str(","), $4);
4554 | user_name USING user_name
4556 $$ = make3_str($1, make1_str(","), $3);
4559 user_name: UserId { if ($1[0] == '\"')
4562 $$ = make3_str(make1_str("\""), $1, make1_str("\""));
4564 | char_variable { $$ = $1; }
4565 | SCONST { $$ = make3_str(make1_str("\""), $1, make1_str("\"")); }
4567 char_variable: cvariable
4568 { /* check if we have a char variable */
4569 struct variable *p = find_variable($1);
4570 enum ECPGttype typ = p->type->typ;
4572 /* if array see what's inside */
4573 if (typ == ECPGt_array)
4574 typ = p->type->u.element->typ;
4579 case ECPGt_unsigned_char:
4583 $$ = make2_str($1, make1_str(".arr"));
4586 yyerror("invalid datatype");
4591 opt_options: Op ColId
4593 if (strlen($1) == 0)
4594 yyerror("parse error");
4596 if (strcmp($1, "?") != 0)
4598 sprintf(errortext, "parse error at or near %s", $1);
4602 $$ = make2_str(make1_str("?"), $2);
4604 | /* empty */ { $$ = make1_str(""); }
4607 * Declare a prepared cursor. The syntax is different from the standard
4608 * declare statement, so we create a new rule.
4610 ECPGCursorStmt: DECLARE name opt_cursor CURSOR FOR ident
4612 struct cursor *ptr, *this;
4613 struct variable *thisquery = (struct variable *)mm_alloc(sizeof(struct variable));
4615 for (ptr = cur; ptr != NULL; ptr = ptr->next)
4617 if (strcmp($2, ptr->name) == 0)
4619 /* re-definition is a bug */
4620 sprintf(errortext, "cursor %s already defined", $2);
4625 this = (struct cursor *) mm_alloc(sizeof(struct cursor));
4627 /* initial definition */
4630 this->connection = connection;
4631 this->command = cat4_str(make1_str("declare"), mm_strdup($2), $3, make1_str("cursor for ?"));
4632 this->argsresult = NULL;
4634 thisquery->type = &ecpg_query;
4635 thisquery->brace_level = 0;
4636 thisquery->next = NULL;
4637 thisquery->name = (char *) mm_alloc(sizeof("ECPGprepared_statement(\"\")") + strlen($6));
4638 sprintf(thisquery->name, "ECPGprepared_statement(\"%s\")", $6);
4640 this->argsinsert = NULL;
4641 add_variable(&(this->argsinsert), thisquery, &no_indicator);
4645 $$ = cat3_str(make1_str("/*"), mm_strdup(this->command), make1_str("*/"));
4650 * the exec sql deallocate prepare command to deallocate a previously
4651 * prepared statement
4653 ECPGDeallocate: SQL_DEALLOCATE SQL_PREPARE ident { $$ = make3_str(make1_str("ECPGdeallocate(__LINE__, \""), $3, make1_str("\");")); }
4656 * variable declaration inside the exec sql declare block
4658 ECPGDeclaration: sql_startdeclare
4660 fputs("/* exec sql begin declare section */", yyout);
4661 output_line_number();
4663 variable_declarations sql_enddeclare
4665 fprintf(yyout, "%s/* exec sql end declare section */", $3);
4667 output_line_number();
4670 sql_startdeclare : ecpgstart BEGIN_TRANS DECLARE SQL_SECTION ';' {}
4672 sql_enddeclare: ecpgstart END_TRANS DECLARE SQL_SECTION ';' {}
4674 variable_declarations: /* empty */
4678 | declaration variable_declarations
4680 $$ = cat2_str($1, $2);
4683 declaration: storage_clause
4685 actual_storage[struct_level] = mm_strdup($1);
4689 actual_type[struct_level].type_enum = $3.type_enum;
4690 actual_type[struct_level].type_dimension = $3.type_dimension;
4691 actual_type[struct_level].type_index = $3.type_index;
4695 $$ = cat4_str($1, $3.type_str, $5, make1_str(";\n"));
4698 storage_clause : S_EXTERN { $$ = make1_str("extern"); }
4699 | S_STATIC { $$ = make1_str("static"); }
4700 | S_SIGNED { $$ = make1_str("signed"); }
4701 | S_CONST { $$ = make1_str("const"); }
4702 | S_REGISTER { $$ = make1_str("register"); }
4703 | S_AUTO { $$ = make1_str("auto"); }
4704 | /* empty */ { $$ = make1_str(""); }
4709 $$.type_str = mm_strdup(ECPGtype_name($1));
4710 $$.type_dimension = -1;
4715 $$.type_enum = ECPGt_varchar;
4716 $$.type_str = make1_str("");
4717 $$.type_dimension = -1;
4722 $$.type_enum = ECPGt_struct;
4724 $$.type_dimension = -1;
4729 $$.type_enum = ECPGt_union;
4731 $$.type_dimension = -1;
4737 $$.type_enum = ECPGt_int;
4739 $$.type_dimension = -1;
4744 /* this is for typedef'ed types */
4745 struct typedefs *this = get_typedef($1);
4747 $$.type_str = (this->type->type_enum == ECPGt_varchar) ? make1_str("") : mm_strdup(this->name);
4748 $$.type_enum = this->type->type_enum;
4749 $$.type_dimension = this->type->type_dimension;
4750 $$.type_index = this->type->type_index;
4751 struct_member_list[struct_level] = ECPGstruct_member_dup(this->struct_member_list);
4754 enum_type: s_enum '{' c_line '}'
4756 $$ = cat4_str($1, make1_str("{"), $3, make1_str("}"));
4759 s_enum: S_ENUM opt_symbol { $$ = cat2_str(make1_str("enum"), $2); }
4761 struct_type: s_struct '{' variable_declarations '}'
4763 ECPGfree_struct_member(struct_member_list[struct_level]);
4764 free(actual_storage[struct_level--]);
4765 $$ = cat4_str($1, make1_str("{"), $3, make1_str("}"));
4768 union_type: s_union '{' variable_declarations '}'
4770 ECPGfree_struct_member(struct_member_list[struct_level]);
4771 free(actual_storage[struct_level--]);
4772 $$ = cat4_str($1, make1_str("{"), $3, make1_str("}"));
4775 s_struct : S_STRUCT opt_symbol
4777 struct_member_list[struct_level++] = NULL;
4778 if (struct_level >= STRUCT_DEPTH)
4779 yyerror("Too many levels in nested structure definition");
4780 $$ = cat2_str(make1_str("struct"), $2);
4783 s_union : S_UNION opt_symbol
4785 struct_member_list[struct_level++] = NULL;
4786 if (struct_level >= STRUCT_DEPTH)
4787 yyerror("Too many levels in nested structure definition");
4788 $$ = cat2_str(make1_str("union"), $2);
4791 opt_symbol: /* empty */ { $$ = make1_str(""); }
4792 | symbol { $$ = $1; }
4794 simple_type: S_SHORT { $$ = ECPGt_short; }
4795 | S_UNSIGNED S_SHORT { $$ = ECPGt_unsigned_short; }
4796 | S_INT { $$ = ECPGt_int; }
4797 | S_UNSIGNED S_INT { $$ = ECPGt_unsigned_int; }
4798 | S_LONG { $$ = ECPGt_long; }
4799 | S_UNSIGNED S_LONG { $$ = ECPGt_unsigned_long; }
4800 | S_FLOAT { $$ = ECPGt_float; }
4801 | S_DOUBLE { $$ = ECPGt_double; }
4802 | S_BOOL { $$ = ECPGt_bool; };
4803 | S_CHAR { $$ = ECPGt_char; }
4804 | S_UNSIGNED S_CHAR { $$ = ECPGt_unsigned_char; }
4806 varchar_type: S_VARCHAR { $$ = ECPGt_varchar; }
4808 variable_list: variable
4812 | variable_list ',' variable
4814 $$ = cat3_str($1, make1_str(","), $3);
4817 variable: opt_pointer symbol opt_array_bounds opt_initializer
4819 struct ECPGtype * type;
4820 int dimension = $3.index1; /* dimension of array */
4821 int length = $3.index2; /* lenght of string */
4822 char dim[14L], ascii_len[12];
4824 adjust_array(actual_type[struct_level].type_enum, &dimension, &length, actual_type[struct_level].type_dimension, actual_type[struct_level].type_index, strlen($1));
4826 switch (actual_type[struct_level].type_enum)
4831 type = ECPGmake_struct_type(struct_member_list[struct_level], actual_type[struct_level].type_enum);
4833 type = ECPGmake_array_type(ECPGmake_struct_type(struct_member_list[struct_level], actual_type[struct_level].type_enum), dimension);
4835 $$ = make4_str($1, mm_strdup($2), $3.str, $4);
4838 if (dimension == -1)
4839 type = ECPGmake_simple_type(actual_type[struct_level].type_enum, length);
4841 type = ECPGmake_array_type(ECPGmake_simple_type(actual_type[struct_level].type_enum, length), dimension);
4851 sprintf(dim, "[%d]", dimension);
4854 sprintf(ascii_len, "%d", length);
4857 yyerror ("pointer to varchar are not implemented");
4860 $$ = make4_str(make5_str(mm_strdup(actual_storage[struct_level]), make1_str(" struct varchar_"), mm_strdup($2), make1_str(" { int len; char arr["), mm_strdup(ascii_len)), make1_str("]; } *"), mm_strdup($2), $4);
4862 $$ = make5_str(make5_str(mm_strdup(actual_storage[struct_level]), make1_str(" struct varchar_"), mm_strdup($2), make1_str(" { int len; char arr["), mm_strdup(ascii_len)), make1_str("]; } "), mm_strdup($2), mm_strdup(dim), $4);
4866 case ECPGt_unsigned_char:
4867 if (dimension == -1)
4868 type = ECPGmake_simple_type(actual_type[struct_level].type_enum, length);
4870 type = ECPGmake_array_type(ECPGmake_simple_type(actual_type[struct_level].type_enum, length), dimension);
4872 $$ = make4_str($1, mm_strdup($2), $3.str, $4);
4876 type = ECPGmake_simple_type(actual_type[struct_level].type_enum, 1);
4878 type = ECPGmake_array_type(ECPGmake_simple_type(actual_type[struct_level].type_enum, 1), dimension);
4880 $$ = make4_str($1, mm_strdup($2), $3.str, $4);
4884 if (struct_level == 0)
4885 new_variable($2, type);
4887 ECPGmake_struct_member($2, type, &(struct_member_list[struct_level - 1]));
4892 opt_initializer: /* empty */ { $$ = make1_str(""); }
4893 | '=' vartext { $$ = make2_str(make1_str("="), $2); }
4895 opt_pointer: /* empty */ { $$ = make1_str(""); }
4896 | '*' { $$ = make1_str("*"); }
4899 * As long as the prepare statement is not supported by the backend, we will
4900 * try to simulate it here so we get dynamic SQL
4902 ECPGDeclare: DECLARE STATEMENT ident
4904 /* this is only supported for compatibility */
4905 $$ = cat3_str(make1_str("/* declare statement"), $3, make1_str("*/"));
4908 * the exec sql disconnect statement: disconnect from the given database
4910 ECPGDisconnect: SQL_DISCONNECT dis_name { $$ = $2; }
4912 dis_name: connection_object { $$ = $1; }
4913 | CURRENT { $$ = make1_str("CURRENT"); }
4914 | ALL { $$ = make1_str("ALL"); }
4915 | /* empty */ { $$ = make1_str("CURRENT"); }
4917 connection_object: connection_target { $$ = $1; }
4918 | DEFAULT { $$ = make1_str("DEFAULT"); }
4921 * execute a given string as sql command
4923 ECPGExecute : EXECUTE SQL_IMMEDIATE execstring
4925 struct variable *thisquery = (struct variable *)mm_alloc(sizeof(struct variable));
4927 thisquery->type = &ecpg_query;
4928 thisquery->brace_level = 0;
4929 thisquery->next = NULL;
4930 thisquery->name = $3;
4932 add_variable(&argsinsert, thisquery, &no_indicator);
4934 $$ = make1_str("?");
4938 struct variable *thisquery = (struct variable *)mm_alloc(sizeof(struct variable));
4940 thisquery->type = &ecpg_query;
4941 thisquery->brace_level = 0;
4942 thisquery->next = NULL;
4943 thisquery->name = (char *) mm_alloc(sizeof("ECPGprepared_statement(\"\")") + strlen($2));
4944 sprintf(thisquery->name, "ECPGprepared_statement(\"%s\")", $2);
4946 add_variable(&argsinsert, thisquery, &no_indicator);
4949 $$ = make1_str("?");
4952 execstring: char_variable |
4953 CSTRING { $$ = make3_str(make1_str("\""), $1, make1_str("\"")); };
4956 * the exec sql free command to deallocate a previously
4957 * prepared statement
4959 ECPGFree: SQL_FREE ident { $$ = $2; }
4962 * open is an open cursor, at the moment this has to be removed
4964 ECPGOpen: SQL_OPEN name opt_using {
4968 opt_using: /* empty */ { $$ = make1_str(""); }
4969 | USING variablelist {
4970 /* yyerror ("open cursor with variables not implemented yet"); */
4974 variablelist: cinputvariable | cinputvariable ',' variablelist
4977 * As long as the prepare statement is not supported by the backend, we will
4978 * try to simulate it here so we get dynamic SQL
4980 ECPGPrepare: SQL_PREPARE ident FROM execstring
4982 $$ = make4_str(make1_str("\""), $2, make1_str("\", "), $4);
4986 * for compatibility with ORACLE we will also allow the keyword RELEASE
4987 * after a transaction statement to disconnect from the database.
4990 ECPGRelease: TransactionStmt SQL_RELEASE
4992 if (strncmp($1, "begin", 5) == 0)
4993 yyerror("RELEASE does not make sense when beginning a transaction");
4995 fprintf(yyout, "ECPGtrans(__LINE__, %s, \"%s\");",
4996 connection ? connection : "NULL", $1);
4998 fprintf(yyout, "ECPGdisconnect(__LINE__, \"\");");
5004 * set/reset the automatic transaction mode, this needs a differnet handling
5005 * as the other set commands
5007 ECPGSetAutocommit: SET SQL_AUTOCOMMIT to_equal on_off
5012 on_off: ON { $$ = make1_str("on"); }
5013 | SQL_OFF { $$ = make1_str("off"); }
5018 * set the actual connection, this needs a differnet handling as the other
5021 ECPGSetConnection: SET SQL_CONNECTION to_equal connection_object
5027 * define a new type for embedded SQL
5029 ECPGTypedef: TYPE_P symbol IS ctype opt_type_array_bounds opt_reference
5031 /* add entry to list */
5032 struct typedefs *ptr, *this;
5033 int dimension = $5.index1;
5034 int length = $5.index2;
5036 for (ptr = types; ptr != NULL; ptr = ptr->next)
5038 if (strcmp($2, ptr->name) == 0)
5040 /* re-definition is a bug */
5041 sprintf(errortext, "type %s already defined", $2);
5046 adjust_array($4.type_enum, &dimension, &length, $4.type_dimension, $4.type_index, strlen($6));
5048 this = (struct typedefs *) mm_alloc(sizeof(struct typedefs));
5050 /* initial definition */
5053 this->type = (struct this_type *) mm_alloc(sizeof(struct this_type));
5054 this->type->type_enum = $4.type_enum;
5055 this->type->type_str = mm_strdup($2);
5056 this->type->type_dimension = dimension; /* dimension of array */
5057 this->type->type_index = length; /* lenght of string */
5058 this->struct_member_list = struct_member_list[struct_level];
5060 if ($4.type_enum != ECPGt_varchar &&
5061 $4.type_enum != ECPGt_char &&
5062 $4.type_enum != ECPGt_unsigned_char &&
5063 this->type->type_index >= 0)
5064 yyerror("No multi-dimensional array support for simple data types");
5068 $$ = cat5_str(cat3_str(make1_str("/* exec sql type"), mm_strdup($2), make1_str("is")), mm_strdup($4.type_str), mm_strdup($5.str), $6, make1_str("*/"));
5071 opt_type_array_bounds: '[' ']' opt_type_array_bounds
5074 $$.index2 = $3.index1;
5075 $$.str = cat2_str(make1_str("[]"), $3.str);
5077 | '(' ')' opt_type_array_bounds
5080 $$.index2 = $3.index1;
5081 $$.str = cat2_str(make1_str("[]"), $3.str);
5083 | '[' Iresult ']' opt_type_array_bounds
5085 char *txt = mm_alloc(20L);
5087 sprintf (txt, "%d", $2);
5089 $$.index2 = $4.index1;
5090 $$.str = cat4_str(make1_str("["), txt, make1_str("]"), $4.str);
5092 | '(' Iresult ')' opt_type_array_bounds
5094 char *txt = mm_alloc(20L);
5096 sprintf (txt, "%d", $2);
5098 $$.index2 = $4.index1;
5099 $$.str = cat4_str(make1_str("["), txt, make1_str("]"), $4.str);
5105 $$.str= make1_str("");
5109 opt_reference: SQL_REFERENCE { $$ = make1_str("reference"); }
5110 | /* empty */ { $$ = make1_str(""); }
5114 $$.type_str = make1_str("char");
5115 $$.type_enum = ECPGt_char;
5117 $$.type_dimension = -1;
5121 $$.type_str = make1_str("varchar");
5122 $$.type_enum = ECPGt_varchar;
5124 $$.type_dimension = -1;
5128 $$.type_str = make1_str("float");
5129 $$.type_enum = ECPGt_float;
5131 $$.type_dimension = -1;
5135 $$.type_str = make1_str("double");
5136 $$.type_enum = ECPGt_double;
5138 $$.type_dimension = -1;
5140 | opt_signed SQL_INT
5142 $$.type_str = make1_str("int");
5143 $$.type_enum = ECPGt_int;
5145 $$.type_dimension = -1;
5149 $$.type_str = make1_str("int");
5150 $$.type_enum = ECPGt_int;
5152 $$.type_dimension = -1;
5154 | opt_signed SQL_SHORT
5156 $$.type_str = make1_str("short");
5157 $$.type_enum = ECPGt_short;
5159 $$.type_dimension = -1;
5161 | opt_signed SQL_LONG
5163 $$.type_str = make1_str("long");
5164 $$.type_enum = ECPGt_long;
5166 $$.type_dimension = -1;
5170 $$.type_str = make1_str("bool");
5171 $$.type_enum = ECPGt_bool;
5173 $$.type_dimension = -1;
5175 | SQL_UNSIGNED SQL_INT
5177 $$.type_str = make1_str("unsigned int");
5178 $$.type_enum = ECPGt_unsigned_int;
5180 $$.type_dimension = -1;
5182 | SQL_UNSIGNED SQL_SHORT
5184 $$.type_str = make1_str("unsigned short");
5185 $$.type_enum = ECPGt_unsigned_short;
5187 $$.type_dimension = -1;
5189 | SQL_UNSIGNED SQL_LONG
5191 $$.type_str = make1_str("unsigned long");
5192 $$.type_enum = ECPGt_unsigned_long;
5194 $$.type_dimension = -1;
5198 struct_member_list[struct_level++] = NULL;
5199 if (struct_level >= STRUCT_DEPTH)
5200 yyerror("Too many levels in nested structure definition");
5201 } '{' sql_variable_declarations '}'
5203 ECPGfree_struct_member(struct_member_list[struct_level--]);
5204 $$.type_str = cat3_str(make1_str("struct {"), $4, make1_str("}"));
5205 $$.type_enum = ECPGt_struct;
5207 $$.type_dimension = -1;
5211 struct_member_list[struct_level++] = NULL;
5212 if (struct_level >= STRUCT_DEPTH)
5213 yyerror("Too many levels in nested structure definition");
5214 } '{' sql_variable_declarations '}'
5216 ECPGfree_struct_member(struct_member_list[struct_level--]);
5217 $$.type_str = cat3_str(make1_str("union {"), $4, make1_str("}"));
5218 $$.type_enum = ECPGt_union;
5220 $$.type_dimension = -1;
5224 struct typedefs *this = get_typedef($1);
5226 $$.type_str = mm_strdup($1);
5227 $$.type_enum = this->type->type_enum;
5228 $$.type_dimension = this->type->type_dimension;
5229 $$.type_index = this->type->type_index;
5230 struct_member_list[struct_level] = this->struct_member_list;
5233 opt_signed: SQL_SIGNED | /* empty */
5235 sql_variable_declarations: /* empty */
5239 | sql_declaration sql_variable_declarations
5241 $$ = cat2_str($1, $2);
5245 sql_declaration: ctype
5247 actual_type[struct_level].type_enum = $1.type_enum;
5248 actual_type[struct_level].type_dimension = $1.type_dimension;
5249 actual_type[struct_level].type_index = $1.type_index;
5251 sql_variable_list ';'
5253 $$ = cat3_str($1.type_str, $3, make1_str(";"));
5256 sql_variable_list: sql_variable
5260 | sql_variable_list ',' sql_variable
5262 $$ = make3_str($1, make1_str(","), $3);
5265 sql_variable: opt_pointer symbol opt_array_bounds
5267 int dimension = $3.index1;
5268 int length = $3.index2;
5269 struct ECPGtype * type;
5272 adjust_array(actual_type[struct_level].type_enum, &dimension, &length, actual_type[struct_level].type_dimension, actual_type[struct_level].type_index, strlen($1));
5274 switch (actual_type[struct_level].type_enum)
5279 type = ECPGmake_struct_type(struct_member_list[struct_level], actual_type[struct_level].type_enum);
5281 type = ECPGmake_array_type(ECPGmake_struct_type(struct_member_list[struct_level], actual_type[struct_level].type_enum), dimension);
5285 if (dimension == -1)
5286 type = ECPGmake_simple_type(actual_type[struct_level].type_enum, length);
5288 type = ECPGmake_array_type(ECPGmake_simple_type(actual_type[struct_level].type_enum, length), dimension);
5300 sprintf(dim, "[%d]", dimension);
5306 case ECPGt_unsigned_char:
5307 if (dimension == -1)
5308 type = ECPGmake_simple_type(actual_type[struct_level].type_enum, length);
5310 type = ECPGmake_array_type(ECPGmake_simple_type(actual_type[struct_level].type_enum, length), dimension);
5315 yyerror("No multi-dimensional array support for simple data types");
5318 type = ECPGmake_simple_type(actual_type[struct_level].type_enum, 1);
5320 type = ECPGmake_array_type(ECPGmake_simple_type(actual_type[struct_level].type_enum, 1), dimension);
5325 if (struct_level == 0)
5326 new_variable($2, type);
5328 ECPGmake_struct_member($2, type, &(struct_member_list[struct_level - 1]));
5330 $$ = cat3_str($1, $2, $3.str);
5334 * define the type of one variable for embedded SQL
5336 ECPGVar: SQL_VAR symbol IS ctype opt_type_array_bounds opt_reference
5338 struct variable *p = find_variable($2);
5339 int dimension = $5.index1;
5340 int length = $5.index2;
5341 struct ECPGtype * type;
5343 adjust_array($4.type_enum, &dimension, &length, $4.type_dimension, $4.type_index, strlen($6));
5345 switch ($4.type_enum)
5350 type = ECPGmake_struct_type(struct_member_list[struct_level], $4.type_enum);
5352 type = ECPGmake_array_type(ECPGmake_struct_type(struct_member_list[struct_level], $4.type_enum), dimension);
5355 if (dimension == -1)
5356 type = ECPGmake_simple_type($4.type_enum, length);
5358 type = ECPGmake_array_type(ECPGmake_simple_type($4.type_enum, length), dimension);
5362 case ECPGt_unsigned_char:
5363 if (dimension == -1)
5364 type = ECPGmake_simple_type($4.type_enum, length);
5366 type = ECPGmake_array_type(ECPGmake_simple_type($4.type_enum, length), dimension);
5371 yyerror("No multi-dimensional array support for simple data types");
5374 type = ECPGmake_simple_type($4.type_enum, 1);
5376 type = ECPGmake_array_type(ECPGmake_simple_type($4.type_enum, 1), dimension);
5381 ECPGfree_type(p->type);
5384 $$ = cat5_str(cat3_str(make1_str("/* exec sql var"), mm_strdup($2), make1_str("is")), mm_strdup($4.type_str), mm_strdup($5.str), $6, make1_str("*/"));
5388 * whenever statement: decide what to do in case of error/no data found
5389 * according to SQL standards we lack: SQLSTATE, CONSTRAINT and SQLEXCEPTION
5391 ECPGWhenever: SQL_WHENEVER SQL_SQLERROR action {
5392 when_error.code = $<action>3.code;
5393 when_error.command = $<action>3.command;
5394 $$ = cat3_str(make1_str("/* exec sql whenever sqlerror "), $3.str, make1_str("; */\n"));
5396 | SQL_WHENEVER NOT SQL_FOUND action {
5397 when_nf.code = $<action>4.code;
5398 when_nf.command = $<action>4.command;
5399 $$ = cat3_str(make1_str("/* exec sql whenever not found "), $4.str, make1_str("; */\n"));
5401 | SQL_WHENEVER SQL_SQLWARNING action {
5402 when_warn.code = $<action>3.code;
5403 when_warn.command = $<action>3.command;
5404 $$ = cat3_str(make1_str("/* exec sql whenever sql_warning "), $3.str, make1_str("; */\n"));
5407 action : SQL_CONTINUE {
5408 $<action>$.code = W_NOTHING;
5409 $<action>$.command = NULL;
5410 $<action>$.str = make1_str("continue");
5413 $<action>$.code = W_SQLPRINT;
5414 $<action>$.command = NULL;
5415 $<action>$.str = make1_str("sqlprint");
5418 $<action>$.code = W_STOP;
5419 $<action>$.command = NULL;
5420 $<action>$.str = make1_str("stop");
5423 $<action>$.code = W_GOTO;
5424 $<action>$.command = strdup($2);
5425 $<action>$.str = cat2_str(make1_str("goto "), $2);
5428 $<action>$.code = W_GOTO;
5429 $<action>$.command = strdup($3);
5430 $<action>$.str = cat2_str(make1_str("goto "), $3);
5432 | DO name '(' dotext ')' {
5433 $<action>$.code = W_DO;
5434 $<action>$.command = make4_str($2, make1_str("("), $4, make1_str(")"));
5435 $<action>$.str = cat2_str(make1_str("do"), mm_strdup($<action>$.command));
5438 $<action>$.code = W_BREAK;
5439 $<action>$.command = NULL;
5440 $<action>$.str = make1_str("break");
5442 | SQL_CALL name '(' dotext ')' {
5443 $<action>$.code = W_DO;
5444 $<action>$.command = make4_str($2, make1_str("("), $4, make1_str(")"));
5445 $<action>$.str = cat2_str(make1_str("call"), mm_strdup($<action>$.command));
5448 /* some other stuff for ecpg */
5457 | ColId opt_indirection
5459 $$ = cat2_str($1, $2);
5461 | '-' ecpg_expr %prec UMINUS
5462 { $$ = cat2_str(make1_str("-"), $2); }
5464 { $$ = cat2_str(make1_str("%"), $2); }
5466 { $$ = cat2_str(make1_str("^"), $2); }
5468 { $$ = cat2_str($1, make1_str("%")); }
5470 { $$ = cat2_str($1, make1_str("^")); }
5471 | a_expr '+' ecpg_expr
5472 { $$ = cat3_str($1, make1_str("+"), $3); }
5473 | a_expr '-' ecpg_expr
5474 { $$ = cat3_str($1, make1_str("-"), $3); }
5475 | a_expr '/' ecpg_expr
5476 { $$ = cat3_str($1, make1_str("/"), $3); }
5477 | a_expr '%' ecpg_expr
5478 { $$ = cat3_str($1, make1_str("%"), $3); }
5479 | a_expr '*' ecpg_expr
5480 { $$ = cat3_str($1, make1_str("*"), $3); }
5481 | a_expr '^' ecpg_expr
5482 { $$ = cat3_str($1, make1_str("^"), $3); }
5483 | a_expr '<' ecpg_expr
5484 { $$ = cat3_str($1, make1_str("<"), $3); }
5485 | a_expr '>' ecpg_expr
5486 { $$ = cat3_str($1, make1_str(">"), $3); }
5488 { $$ = cat2_str($1, make1_str("= NULL")); }
5490 { $$ = cat2_str(make1_str("= NULL"), $3); }
5491 | a_expr '=' ecpg_expr
5492 { $$ = cat3_str($1, make1_str("="), $3); }
5494 { $$ = cat2_str(make1_str(":"), $2); }*/
5496 { $$ = cat2_str(make1_str(";"), $2); }
5498 { $$ = cat2_str(make1_str("|"), $2); }
5499 | a_expr TYPECAST Typename
5501 $$ = cat3_str($1, make1_str("::"), $3);
5503 | CAST '(' a_expr AS Typename ')'
5505 $$ = cat3_str(make2_str(make1_str("cast("), $3), make1_str("as"), make2_str($5, make1_str(")")));
5507 | '(' a_expr_or_null ')'
5508 { $$ = make3_str(make1_str("("), $2, make1_str(")")); }
5509 | a_expr Op ecpg_expr
5510 { $$ = cat3_str($1, $2, $3); }
5511 | a_expr LIKE ecpg_expr
5512 { $$ = cat3_str($1, make1_str("like"), $3); }
5513 | a_expr NOT LIKE ecpg_expr
5514 { $$ = cat3_str($1, make1_str("not like"), $4); }
5516 { $$ = cat2_str($1, $2); }
5518 { $$ = cat2_str($1, $2); }
5519 | func_name '(' '*' ')'
5521 $$ = cat2_str($1, make1_str("(*)"));
5525 $$ = cat2_str($1, make1_str("()"));
5527 | func_name '(' expr_list ')'
5529 $$ = make4_str($1, make1_str("("), $3, make1_str(")"));
5533 $$ = make1_str("current_date");
5537 $$ = make1_str("current_time");
5539 | CURRENT_TIME '(' Iconst ')'
5542 fprintf(stderr,"CURRENT_TIME(%s) precision not implemented; zero used instead", $3);
5543 $$ = make1_str("current_time");
5547 $$ = make1_str("current_timestamp");
5549 | CURRENT_TIMESTAMP '(' Iconst ')'
5552 fprintf(stderr,"CURRENT_TIMESTAMP(%s) precision not implemented; zero used instead",$3);
5553 $$ = make1_str("current_timestamp");
5557 $$ = make1_str("current_user");
5561 $$ = make1_str("user");
5563 | EXISTS '(' SubSelect ')'
5565 $$ = make3_str(make1_str("exists("), $3, make1_str(")"));
5567 | EXTRACT '(' extract_list ')'
5569 $$ = make3_str(make1_str("extract("), $3, make1_str(")"));
5571 | POSITION '(' position_list ')'
5573 $$ = make3_str(make1_str("position("), $3, make1_str(")"));
5575 | SUBSTRING '(' substr_list ')'
5577 $$ = make3_str(make1_str("substring("), $3, make1_str(")"));
5579 /* various trim expressions are defined in SQL92 - thomas 1997-07-19 */
5580 | TRIM '(' BOTH trim_list ')'
5582 $$ = make3_str(make1_str("trim(both"), $4, make1_str(")"));
5584 | TRIM '(' LEADING trim_list ')'
5586 $$ = make3_str(make1_str("trim(leading"), $4, make1_str(")"));
5588 | TRIM '(' TRAILING trim_list ')'
5590 $$ = make3_str(make1_str("trim(trailing"), $4, make1_str(")"));
5592 | TRIM '(' trim_list ')'
5594 $$ = make3_str(make1_str("trim("), $3, make1_str(")"));
5597 { $$ = cat2_str($1, make1_str("isnull")); }
5599 { $$ = cat2_str($1, make1_str("is null")); }
5601 { $$ = cat2_str($1, make1_str("notnull")); }
5602 | a_expr IS NOT NULL_P
5603 { $$ = cat2_str($1, make1_str("is not null")); }
5604 /* IS TRUE, IS FALSE, etc used to be function calls
5605 * but let's make them expressions to allow the optimizer
5606 * a chance to eliminate them if a_expr is a constant string.
5607 * - thomas 1997-12-22
5611 { $$ = cat2_str($1, make1_str("is true")); }
5613 | a_expr IS NOT FALSE_P
5615 { $$ = cat2_str($1, make1_str("is not false")); }
5619 { $$ = cat2_str($1, make1_str("is false")); }
5621 | a_expr IS NOT TRUE_P
5623 { $$ = cat2_str($1, make1_str("is not true")); }
5625 | a_expr BETWEEN b_expr AND b_expr
5627 $$ = cat5_str($1, make1_str("between"), $3, make1_str("and"), $5);
5629 | a_expr NOT BETWEEN b_expr AND b_expr
5631 $$ = cat5_str($1, make1_str("not between"), $4, make1_str("and"), $6);
5633 | a_expr IN '(' in_expr ')'
5635 $$ = make4_str($1, make1_str(" in ("), $4, make1_str(")"));
5637 | a_expr NOT IN '(' in_expr ')'
5639 $$ = make4_str($1, make1_str(" not in ("), $5, make1_str(")"));
5641 | a_expr Op '(' SubSelect ')'
5643 $$ = cat3_str($1, $2, make3_str(make1_str("("), $4, make1_str(")")));
5645 | a_expr '+' '(' SubSelect ')'
5647 $$ = make4_str($1, make1_str("+("), $4, make1_str(")"));
5649 | a_expr '-' '(' SubSelect ')'
5651 $$ = make4_str($1, make1_str("-("), $4, make1_str(")"));
5653 | a_expr '/' '(' SubSelect ')'
5655 $$ = make4_str($1, make1_str("/("), $4, make1_str(")"));
5657 | a_expr '%' '(' SubSelect ')'
5659 $$ = make4_str($1, make1_str("%("), $4, make1_str(")"));
5661 | a_expr '*' '(' SubSelect ')'
5663 $$ = make4_str($1, make1_str("*("), $4, make1_str(")"));
5665 | a_expr '<' '(' SubSelect ')'
5667 $$ = make4_str($1, make1_str("<("), $4, make1_str(")"));
5669 | a_expr '>' '(' SubSelect ')'
5671 $$ = make4_str($1, make1_str(">("), $4, make1_str(")"));
5673 | a_expr '=' '(' SubSelect ')'
5675 $$ = make4_str($1, make1_str("=("), $4, make1_str(")"));
5677 | a_expr Op ANY '(' SubSelect ')'
5679 $$ = cat3_str($1, $2, make3_str(make1_str("any ("), $5, make1_str(")")));
5681 | a_expr '+' ANY '(' SubSelect ')'
5683 $$ = make4_str($1, make1_str("+ any("), $5, make1_str(")"));
5685 | a_expr '-' ANY '(' SubSelect ')'
5687 $$ = make4_str($1, make1_str("- any("), $5, make1_str(")"));
5689 | a_expr '/' ANY '(' SubSelect ')'
5691 $$ = make4_str($1, make1_str("/ any("), $5, make1_str(")"));
5693 | a_expr '%' ANY '(' SubSelect ')'
5695 $$ = make4_str($1, make1_str("% any("), $5, make1_str(")"));
5697 | a_expr '*' ANY '(' SubSelect ')'
5699 $$ = make4_str($1, make1_str("* any("), $5, make1_str(")"));
5701 | a_expr '<' ANY '(' SubSelect ')'
5703 $$ = make4_str($1, make1_str("< any("), $5, make1_str(")"));
5705 | a_expr '>' ANY '(' SubSelect ')'
5707 $$ = make4_str($1, make1_str("> any("), $5, make1_str(")"));
5709 | a_expr '=' ANY '(' SubSelect ')'
5711 $$ = make4_str($1, make1_str("= any("), $5, make1_str(")"));
5713 | a_expr Op ALL '(' SubSelect ')'
5715 $$ = cat3_str($1, $2, make3_str(make1_str("all ("), $5, make1_str(")")));
5717 | a_expr '+' ALL '(' SubSelect ')'
5719 $$ = make4_str($1, make1_str("+ all("), $5, make1_str(")"));
5721 | a_expr '-' ALL '(' SubSelect ')'
5723 $$ = make4_str($1, make1_str("- all("), $5, make1_str(")"));
5725 | a_expr '/' ALL '(' SubSelect ')'
5727 $$ = make4_str($1, make1_str("/ all("), $5, make1_str(")"));
5729 | a_expr '%' ALL '(' SubSelect ')'
5731 $$ = make4_str($1, make1_str("% all("), $5, make1_str(")"));
5733 | a_expr '*' ALL '(' SubSelect ')'
5735 $$ = make4_str($1, make1_str("* all("), $5, make1_str(")"));
5737 | a_expr '<' ALL '(' SubSelect ')'
5739 $$ = make4_str($1, make1_str("< all("), $5, make1_str(")"));
5741 | a_expr '>' ALL '(' SubSelect ')'
5743 $$ = make4_str($1, make1_str("> all("), $5, make1_str(")"));
5745 | a_expr '=' ALL '(' SubSelect ')'
5747 $$ = make4_str($1, make1_str("=all("), $5, make1_str(")"));
5749 | a_expr AND ecpg_expr
5750 { $$ = cat3_str($1, make1_str("and"), $3); }
5751 | a_expr OR ecpg_expr
5752 { $$ = cat3_str($1, make1_str("or"), $3); }
5754 { $$ = cat2_str(make1_str("not"), $2); }
5761 into_list : coutputvariable | into_list ',' coutputvariable;
5763 ecpgstart: SQL_START { reset_variables();}
5765 dotext: /* empty */ { $$ = make1_str(""); }
5766 | dotext do_anything { $$ = make2_str($1, $2); }
5768 vartext: var_anything { $$ = $1; }
5769 | vartext var_anything { $$ = make2_str($1, $2); }
5771 coutputvariable : cvariable indicator {
5772 add_variable(&argsresult, find_variable($1), ($2 == NULL) ? &no_indicator : find_variable($2));
5775 cinputvariable : cvariable indicator {
5776 add_variable(&argsinsert, find_variable($1), ($2 == NULL) ? &no_indicator : find_variable($2));
5779 civariableonly : cvariable {
5780 add_variable(&argsinsert, find_variable($1), &no_indicator);
5781 $$ = make1_str("?");
5784 cvariable: CVARIABLE { $$ = $1; }
5786 indicator: /* empty */ { $$ = NULL; }
5787 | cvariable { check_indicator((find_variable($1))->type); $$ = $1; }
5788 | SQL_INDICATOR cvariable { check_indicator((find_variable($2))->type); $$ = $2; }
5789 | SQL_INDICATOR name { check_indicator((find_variable($2))->type); $$ = $2; }
5791 ident: IDENT { $$ = $1; }
5792 | CSTRING { $$ = $1; }
5797 symbol: IDENT { $$ = $1; }
5799 cpp_line: CPP_LINE { $$ = $1; }
5801 c_line: c_anything { $$ = $1; }
5804 $$ = make2_str($1, $2);
5807 c_thing: c_anything | ';' { $$ = make1_str(";"); }
5809 c_anything: IDENT { $$ = $1; }
5810 | CSTRING { $$ = make3_str(make1_str("\""), $1, make1_str("\"")); }
5811 | Iconst { $$ = $1; }
5812 | Fconst { $$ = $1; }
5813 | '*' { $$ = make1_str("*"); }
5814 | '+' { $$ = make1_str("+"); }
5815 | '-' { $$ = make1_str("-"); }
5816 | '/' { $$ = make1_str("/"); }
5817 | '%' { $$ = make1_str("%"); }
5818 | S_AUTO { $$ = make1_str("auto"); }
5819 | S_BOOL { $$ = make1_str("bool"); }
5820 | S_CHAR { $$ = make1_str("char"); }
5821 | S_CONST { $$ = make1_str("const"); }
5822 | S_DOUBLE { $$ = make1_str("double"); }
5823 | S_ENUM { $$ = make1_str("enum"); }
5824 | S_EXTERN { $$ = make1_str("extern"); }
5825 | S_FLOAT { $$ = make1_str("float"); }
5826 | S_INT { $$ = make1_str("int"); }
5827 | S_LONG { $$ = make1_str("long"); }
5828 | S_REGISTER { $$ = make1_str("register"); }
5829 | S_SHORT { $$ = make1_str("short"); }
5830 | S_SIGNED { $$ = make1_str("signed"); }
5831 | S_STATIC { $$ = make1_str("static"); }
5832 | S_STRUCT { $$ = make1_str("struct"); }
5833 | S_UNION { $$ = make1_str("union"); }
5834 | S_UNSIGNED { $$ = make1_str("unsigned"); }
5835 | S_VARCHAR { $$ = make1_str("varchar"); }
5836 | S_ANYTHING { $$ = make_name(); }
5837 | '[' { $$ = make1_str("["); }
5838 | ']' { $$ = make1_str("]"); }
5839 | '(' { $$ = make1_str("("); }
5840 | ')' { $$ = make1_str(")"); }
5841 | '=' { $$ = make1_str("="); }
5842 | ',' { $$ = make1_str(","); }
5844 do_anything: IDENT { $$ = $1; }
5845 | CSTRING { $$ = make3_str(make1_str("\""), $1, make1_str("\""));}
5846 | Iconst { $$ = $1; }
5847 | Fconst { $$ = $1; }
5848 | ',' { $$ = make1_str(","); }
5850 var_anything: IDENT { $$ = $1; }
5851 | CSTRING { $$ = make3_str(make1_str("\""), $1, make1_str("\"")); }
5852 | Iconst { $$ = $1; }
5853 | Fconst { $$ = $1; }
5854 | '{' c_line '}' { $$ = make3_str(make1_str("{"), $2, make1_str("}")); }
5858 $$ = make1_str("{");
5862 remove_variables(braces_open--);
5863 $$ = make1_str("}");
5868 void yyerror(char * error)
5870 fprintf(stderr, "%s:%d: %s\n", input_filename, yylineno, error);