1 /* Copyright comment */
6 #include "catalog/catname.h"
7 #include "utils/numeric.h"
12 #include "mb/pg_wchar.h"
15 #define STRUCT_DEPTH 128
18 * Variables containing simple states.
22 static char *connection = NULL;
23 static int QueryIsRule = 0, ForUpdateNotAllowed = 0;
24 static struct this_type actual_type[STRUCT_DEPTH];
25 static char *actual_storage[STRUCT_DEPTH];
27 /* temporarily store struct members while creating the data structure */
28 struct ECPGstruct_member *struct_member_list[STRUCT_DEPTH] = { NULL };
30 struct ECPGtype ecpg_no_indicator = {ECPGt_NO_INDICATOR, 0L, {NULL}};
31 struct variable no_indicator = {"no_indicator", &ecpg_no_indicator, 0, NULL};
33 struct ECPGtype ecpg_query = {ECPGt_char_variable, 0L, {NULL}};
36 * Handle the filename and line numbering.
38 char * input_filename = NULL;
44 fprintf(yyout, "\n#line %d \"%s\"\n", yylineno, input_filename);
48 * store the whenever action here
50 static struct when when_error, when_nf, when_warn;
53 print_action(struct when *w)
57 case W_SQLPRINT: fprintf(yyout, "sqlprint();");
59 case W_GOTO: fprintf(yyout, "goto %s;", w->command);
61 case W_DO: fprintf(yyout, "%s;", w->command);
63 case W_STOP: fprintf(yyout, "exit (1);");
65 case W_BREAK: fprintf(yyout, "break;");
67 default: fprintf(yyout, "{/* %d not implemented yet */}", w->code);
73 whenever_action(int mode)
75 if (mode == 1 && when_nf.code != W_NOTHING)
78 fprintf(yyout, "\nif (sqlca.sqlcode == ECPG_NOT_FOUND) ");
79 print_action(&when_nf);
81 if (when_warn.code != W_NOTHING)
84 fprintf(yyout, "\nif (sqlca.sqlwarn[0] == 'W') ");
85 print_action(&when_warn);
87 if (when_error.code != W_NOTHING)
90 fprintf(yyout, "\nif (sqlca.sqlcode < 0) ");
91 print_action(&when_error);
97 * Handling of variables.
101 * brace level counter
105 static struct variable * allvariables = NULL;
107 static struct variable *
108 new_variable(const char * name, struct ECPGtype * type)
110 struct variable * p = (struct variable*) mm_alloc(sizeof(struct variable));
112 p->name = mm_strdup(name);
114 p->brace_level = braces_open;
116 p->next = allvariables;
122 static struct variable * find_variable(char * name);
124 static struct variable *
125 find_struct_member(char *name, char *str, struct ECPGstruct_member *members)
127 char *next = strchr(++str, '.'), c = '\0';
135 for (; members; members = members->next)
137 if (strcmp(members->name, str) == 0)
142 switch (members->typ->typ)
145 return(new_variable(name, ECPGmake_array_type(members->typ->u.element, members->typ->size)));
148 return(new_variable(name, ECPGmake_struct_type(members->typ->u.members, members->typ->typ)));
150 return(new_variable(name, ECPGmake_simple_type(members->typ->typ, members->typ->size)));
159 return(find_struct_member(name, next, members->typ->u.element->u.members));
161 else return(find_struct_member(name, next, members->typ->u.members));
169 static struct variable *
170 find_struct(char * name, char *next)
175 /* first get the mother structure entry */
177 p = find_variable(name);
181 if (p->type->typ != ECPGt_struct && p->type->typ != ECPGt_union)
183 sprintf(errortext, "variable %s is not a pointer", name);
187 if (p->type->u.element->typ != ECPGt_struct && p->type->u.element->typ != ECPGt_union)
189 sprintf(errortext, "variable %s is not a pointer to a structure or a union", name);
193 /* restore the name, we will need it later on */
197 return find_struct_member(name, next, p->type->u.element->u.members);
201 if (p->type->typ != ECPGt_struct && p->type->typ != ECPGt_union)
203 sprintf(errortext, "variable %s is neither a structure nor a union", name);
207 /* restore the name, we will need it later on */
210 return find_struct_member(name, next, p->type->u.members);
214 static struct variable *
215 find_simple(char * name)
219 for (p = allvariables; p; p = p->next)
221 if (strcmp(p->name, name) == 0)
228 /* Note that this function will end the program in case of an unknown */
230 static struct variable *
231 find_variable(char * name)
236 if ((next = strchr(name, '.')) != NULL)
237 p = find_struct(name, next);
238 else if ((next = strstr(name, "->")) != NULL)
239 p = find_struct(name, next);
241 p = find_simple(name);
245 sprintf(errortext, "The variable %s is not declared", name);
253 remove_variables(int brace_level)
255 struct variable * p, *prev;
257 for (p = prev = allvariables; p; p = p ? p->next : NULL)
259 if (p->brace_level >= brace_level)
262 if (p == allvariables)
263 prev = allvariables = p->next;
265 prev->next = p->next;
267 ECPGfree_type(p->type);
279 * Here are the variables that need to be handled on every request.
280 * These are of two kinds: input and output.
281 * I will make two lists for them.
284 struct arguments * argsinsert = NULL;
285 struct arguments * argsresult = NULL;
288 reset_variables(void)
295 /* Add a variable to a request. */
297 add_variable(struct arguments ** list, struct variable * var, struct variable * ind)
299 struct arguments * p = (struct arguments *)mm_alloc(sizeof(struct arguments));
307 /* Dump out a list of all the variable on this list.
308 This is a recursive function that works from the end of the list and
309 deletes the list as we go on.
312 dump_variables(struct arguments * list, int mode)
319 /* The list is build up from the beginning so lets first dump the
323 dump_variables(list->next, mode);
325 /* Then the current element and its indicator */
326 ECPGdump_a_type(yyout, list->variable->name, list->variable->type,
327 (list->indicator->type->typ != ECPGt_NO_INDICATOR) ? list->indicator->name : NULL,
328 (list->indicator->type->typ != ECPGt_NO_INDICATOR) ? list->indicator->type : NULL, NULL, NULL);
330 /* Then release the list element. */
336 check_indicator(struct ECPGtype *var)
338 /* make sure this is a valid indicator variable */
341 struct ECPGstruct_member *p;
346 case ECPGt_unsigned_short:
347 case ECPGt_unsigned_int:
348 case ECPGt_unsigned_long:
353 for (p = var->u.members; p; p = p->next)
354 check_indicator(p->typ);
358 check_indicator(var->u.element);
361 yyerror ("indicator variable must be integer type");
367 make1_str(const char *str)
369 char * res_str = (char *)mm_alloc(strlen(str) + 1);
371 strcpy(res_str, str);
376 make2_str(char *str1, char *str2)
378 char * res_str = (char *)mm_alloc(strlen(str1) + strlen(str2) + 1);
380 strcpy(res_str, str1);
381 strcat(res_str, str2);
388 cat2_str(char *str1, char *str2)
390 char * res_str = (char *)mm_alloc(strlen(str1) + strlen(str2) + 2);
392 strcpy(res_str, str1);
393 strcat(res_str, " ");
394 strcat(res_str, str2);
401 make3_str(char *str1, char *str2, char * str3)
403 char * res_str = (char *)mm_alloc(strlen(str1) + strlen(str2) + strlen(str3) + 1);
405 strcpy(res_str, str1);
406 strcat(res_str, str2);
407 strcat(res_str, str3);
415 cat3_str(char *str1, char *str2, char * str3)
417 char * res_str = (char *)mm_alloc(strlen(str1) + strlen(str2) + strlen(str3) + 3);
419 strcpy(res_str, str1);
420 strcat(res_str, " ");
421 strcat(res_str, str2);
422 strcat(res_str, " ");
423 strcat(res_str, str3);
431 make4_str(char *str1, char *str2, char *str3, char *str4)
433 char * res_str = (char *)mm_alloc(strlen(str1) + strlen(str2) + strlen(str3) + strlen(str4) + 1);
435 strcpy(res_str, str1);
436 strcat(res_str, str2);
437 strcat(res_str, str3);
438 strcat(res_str, str4);
447 cat4_str(char *str1, char *str2, char *str3, char *str4)
449 char * res_str = (char *)mm_alloc(strlen(str1) + strlen(str2) + strlen(str3) + strlen(str4) + 4);
451 strcpy(res_str, str1);
452 strcat(res_str, " ");
453 strcat(res_str, str2);
454 strcat(res_str, " ");
455 strcat(res_str, str3);
456 strcat(res_str, " ");
457 strcat(res_str, str4);
466 make5_str(char *str1, char *str2, char *str3, char *str4, char *str5)
468 char * res_str = (char *)mm_alloc(strlen(str1) + strlen(str2) + strlen(str3) + strlen(str4) + strlen(str5) + 1);
470 strcpy(res_str, str1);
471 strcat(res_str, str2);
472 strcat(res_str, str3);
473 strcat(res_str, str4);
474 strcat(res_str, str5);
484 cat5_str(char *str1, char *str2, char *str3, char *str4, char *str5)
486 char * res_str = (char *)mm_alloc(strlen(str1) + strlen(str2) + strlen(str3) + strlen(str4) + strlen(str5) + 5);
488 strcpy(res_str, str1);
489 strcat(res_str, " ");
490 strcat(res_str, str2);
491 strcat(res_str, " ");
492 strcat(res_str, str3);
493 strcat(res_str, " ");
494 strcat(res_str, str4);
495 strcat(res_str, " ");
496 strcat(res_str, str5);
508 char * name = (char *)mm_alloc(yyleng + 1);
510 strncpy(name, yytext, yyleng);
516 output_statement(char * stmt, int mode)
518 int i, j=strlen(stmt);
520 fprintf(yyout, "ECPGdo(__LINE__, %s, \"", connection ? connection : "NULL");
522 /* do this char by char as we have to filter '\"' */
523 for (i = 0;i < j; i++)
525 fputc(stmt[i], yyout);
526 fputs("\", ", yyout);
528 /* dump variables to C file*/
529 dump_variables(argsinsert, 1);
530 fputs("ECPGt_EOIT, ", yyout);
531 dump_variables(argsresult, 1);
532 fputs("ECPGt_EORT);", yyout);
533 whenever_action(mode);
535 if (connection != NULL)
539 static struct typedefs *
540 get_typedef(char *name)
542 struct typedefs *this;
544 for (this = types; this && strcmp(this->name, name); this = this->next);
547 sprintf(errortext, "invalid datatype '%s'", name);
555 adjust_array(enum ECPGttype type_enum, int *dimension, int *length, int type_dimension, int type_index, bool pointer)
560 yyerror("No multi-dimensional array support");
562 *length = type_index;
565 if (type_dimension >= 0)
567 if (*dimension >= 0 && *length >= 0)
568 yyerror("No multi-dimensional array support");
571 *length = *dimension;
573 *dimension = type_dimension;
576 if (*length >= 0 && *dimension >= 0 && pointer)
577 yyerror("No multi-dimensional array support");
583 /* pointer has to get dimension 0 */
586 *length = *dimension;
591 yyerror("No multi-dimensional array support for structures");
595 /* pointer has to get dimension 0 */
599 /* one index is the string length */
602 *length = *dimension;
608 case ECPGt_unsigned_char:
609 /* pointer has to get length 0 */
613 /* one index is the string length */
616 *length = (*dimension < 0) ? 1 : *dimension;
622 /* a pointer has dimension = 0 */
624 *length = *dimension;
629 yyerror("No multi-dimensional array support for simple data types");
644 struct this_type type;
645 enum ECPGttype type_enum;
648 /* special embedded SQL token */
649 %token SQL_AT SQL_BOOL SQL_BREAK
650 %token SQL_CALL SQL_CONNECT SQL_CONNECTION SQL_CONTINUE
651 %token SQL_DEALLOCATE SQL_DISCONNECT SQL_ENUM
652 %token SQL_FOUND SQL_FREE SQL_GO SQL_GOTO
653 %token SQL_IDENTIFIED SQL_IMMEDIATE SQL_INDICATOR SQL_INT SQL_LONG
654 %token SQL_OPEN SQL_PREPARE SQL_RELEASE SQL_REFERENCE
655 %token SQL_SECTION SQL_SEMI SQL_SHORT SQL_SIGNED SQL_SQLERROR SQL_SQLPRINT
656 %token SQL_SQLWARNING SQL_START SQL_STOP SQL_STRUCT SQL_UNSIGNED
657 %token SQL_VAR SQL_WHENEVER
660 %token S_ANYTHING S_AUTO S_BOOL S_CHAR S_CONST S_DOUBLE S_ENUM S_EXTERN
661 %token S_FLOAT S_INT S
662 %token S_LONG S_REGISTER S_SHORT S_SIGNED S_STATIC S_STRUCT
663 %token S_UNION S_UNSIGNED S_VARCHAR
665 /* I need this and don't know where it is defined inside the backend */
668 /* Keywords (in SQL92 reserved words) */
669 %token ABSOLUTE, ACTION, ADD, ALL, ALTER, AND, ANY, AS, ASC,
670 BEGIN_TRANS, BETWEEN, BOTH, BY,
671 CASCADE, CASE, CAST, CHAR, CHARACTER, CHECK, CLOSE,
672 COALESCE, COLLATE, COLUMN, COMMIT,
673 CONSTRAINT, CREATE, CROSS, CURRENT, CURRENT_DATE, CURRENT_TIME,
674 CURRENT_TIMESTAMP, CURRENT_USER, CURSOR,
675 DAY_P, DECIMAL, DECLARE, DEFAULT, DELETE, DESC, DISTINCT, DOUBLE, DROP,
676 ELSE, END_TRANS, EXCEPT, EXECUTE, EXISTS, EXTRACT,
677 FALSE_P, FETCH, FLOAT, FOR, FOREIGN, FROM, FULL,
678 GRANT, GROUP, HAVING, HOUR_P,
679 IN, INNER_P, INSENSITIVE, INSERT, INTERSECT, INTERVAL, INTO, IS,
680 ISOLATION, JOIN, KEY, LANGUAGE, LEADING, LEFT, LEVEL, LIKE, LOCAL,
681 MATCH, MINUTE_P, MONTH_P, NAMES,
682 NATIONAL, NATURAL, NCHAR, NEXT, NO, NOT, NULLIF, NULL_P, NUMERIC,
683 OF, ON, ONLY, OPTION, OR, ORDER, OUTER_P,
684 PARTIAL, POSITION, PRECISION, PRIMARY, PRIOR, PRIVILEGES, PROCEDURE, PUBLIC,
685 READ, REFERENCES, RELATIVE, REVOKE, RIGHT, ROLLBACK,
686 SCROLL, SECOND_P, SELECT, SET, SUBSTRING,
687 TABLE, TEMP, THEN, TIME, TIMESTAMP, TIMEZONE_HOUR, TIMEZONE_MINUTE,
688 TO, TRAILING, TRANSACTION, TRIM, TRUE_P,
689 UNION, UNIQUE, UPDATE, USER, USING,
690 VALUES, VARCHAR, VARYING, VIEW,
691 WHEN, WHERE, WITH, WORK, YEAR_P, ZONE
693 /* Keywords (in SQL3 reserved words) */
696 /* Keywords (in SQL92 non-reserved words) */
699 /* Keywords for Postgres support (not in SQL92 reserved words)
701 * The CREATEDB and CREATEUSER tokens should go away
702 * when some sort of pg_privileges relation is introduced.
703 * - Todd A. Brandys 1998-01-01?
705 %token ABORT_TRANS, AFTER, AGGREGATE, ANALYZE, BACKWARD, BEFORE, BINARY,
706 CACHE, CLUSTER, COPY, CREATEDB, CREATEUSER, CYCLE,
707 DATABASE, DELIMITERS, DO, EACH, ENCODING, EXPLAIN, EXTEND,
708 FORWARD, FUNCTION, HANDLER,
709 INCREMENT, INDEX, INHERITS, INSTEAD, ISNULL,
710 LANCOMPILER, LIMIT, LISTEN, UNLISTEN, LOAD, LOCATION, LOCK_P, MAXVALUE, MINVALUE, MOVE,
711 NEW, NOCREATEDB, NOCREATEUSER, NONE, NOTHING, NOTIFY, NOTNULL,
712 OFFSET, OIDS, OPERATOR, PASSWORD, PROCEDURAL,
713 RECIPE, RENAME, RESET, RETURNS, ROW, RULE,
714 SERIAL, SEQUENCE, SETOF, SHOW, START, STATEMENT, STDIN, STDOUT, TRUSTED,
715 UNLISTEN, UNTIL, VACUUM, VALID, VERBOSE, VERSION
717 /* Special keywords, not in the query language - see the "lex" file */
718 %token <str> IDENT SCONST Op CSTRING CVARIABLE CPP_LINE
719 %token <ival> ICONST PARAM
722 /* these are not real. they are here so that they get generated as #define's*/
734 %nonassoc Op /* multi-character ops and user-defined operators */
740 %left '|' /* this is the relation union op, not logical or */
741 /* Unary Operators */
743 %left ';' /* end of statement or natural log */
748 %left UNION INTERSECT EXCEPT
750 %type <str> Iconst Fconst Sconst TransactionStmt CreateStmt UserId
751 %type <str> CreateAsElement OptCreateAs CreateAsList CreateAsStmt
752 %type <str> OptInherit key_reference key_action
753 %type <str> key_match constraint_expr ColLabel SpecialRuleRelation
754 %type <str> ColId default_expr ColQualifier columnDef ColQualList
755 %type <str> ColConstraint ColConstraintElem default_list NumericOnly FloatOnly
756 %type <str> OptTableElementList OptTableElement TableConstraint
757 %type <str> ConstraintElem key_actions constraint_list ColPrimaryKey
758 %type <str> res_target_list res_target_el res_target_list2
759 %type <str> res_target_el2 opt_id relation_name database_name
760 %type <str> access_method attr_name class index_name name func_name
761 %type <str> file_name recipe_name AexprConst ParamNo TypeId
762 %type <str> in_expr_nodes not_in_expr_nodes a_expr b_expr
763 %type <str> opt_indirection expr_list extract_list extract_arg
764 %type <str> position_list position_expr substr_list substr_from
765 %type <str> trim_list in_expr substr_for not_in_expr attr attrs
766 %type <str> Typename Array Generic Numeric generic opt_float opt_numeric
767 %type <str> opt_decimal Character character opt_varying opt_charset
768 %type <str> opt_collate Datetime datetime opt_timezone opt_interval
769 %type <str> numeric a_expr_or_null row_expr row_descriptor row_list
770 %type <str> SelectStmt SubSelect result OptTemp
771 %type <str> opt_table opt_union opt_unique sort_clause sortby_list
772 %type <str> sortby OptUseOp opt_inh_star relation_name_list name_list
773 %type <str> group_clause having_clause from_clause c_list
774 %type <str> table_list join_outer where_clause relation_expr row_op sub_type
775 %type <str> opt_column_list insert_rest InsertStmt OptimizableStmt
776 %type <str> columnList DeleteStmt LockStmt UpdateStmt CursorStmt
777 %type <str> NotifyStmt columnElem copy_dirn c_expr UnlistenStmt
778 %type <str> copy_delimiter ListenStmt CopyStmt copy_file_name opt_binary
779 %type <str> opt_with_copy FetchStmt opt_direction fetch_how_many opt_portal_name
780 %type <str> ClosePortalStmt DestroyStmt VacuumStmt opt_verbose
781 %type <str> opt_analyze opt_va_list va_list ExplainStmt index_params
782 %type <str> index_list func_index index_elem opt_type opt_class access_method_clause
783 %type <str> index_opt_unique IndexStmt set_opt func_return def_rest
784 %type <str> func_args_list func_args opt_with ProcedureStmt def_arg
785 %type <str> def_elem def_list definition def_name def_type DefineStmt
786 %type <str> opt_instead event event_object RuleActionList,
787 %type <str> RuleActionBlock RuleActionMulti join_list
788 %type <str> RuleStmt opt_column opt_name oper_argtypes
789 %type <str> MathOp RemoveFuncStmt aggr_argtype for_update_clause
790 %type <str> RemoveAggrStmt remove_type RemoveStmt ExtendStmt RecipeStmt
791 %type <str> RemoveOperStmt RenameStmt all_Op user_valid_clause
792 %type <str> VariableSetStmt var_value zone_value VariableShowStmt
793 %type <str> VariableResetStmt AddAttrStmt alter_clause DropUserStmt
794 %type <str> user_passwd_clause user_createdb_clause opt_trans
795 %type <str> user_createuser_clause user_group_list user_group_clause
796 %type <str> CreateUserStmt AlterUserStmt CreateSeqStmt OptSeqList
797 %type <str> OptSeqElem TriggerForSpec TriggerForOpt TriggerForType
798 %type <str> DropTrigStmt TriggerOneEvent TriggerEvents RuleActionStmt
799 %type <str> TriggerActionTime CreateTrigStmt DropPLangStmt PLangTrusted
800 %type <str> CreatePLangStmt IntegerOnly TriggerFuncArgs TriggerFuncArg
801 %type <str> ViewStmt LoadStmt CreatedbStmt opt_database1 opt_database2 location
802 %type <str> DestroydbStmt ClusterStmt grantee RevokeStmt encoding
803 %type <str> GrantStmt privileges operation_commalist operation
804 %type <str> cursor_clause opt_cursor opt_readonly opt_of opt_lmode
805 %type <str> case_expr when_clause_list case_default case_arg when_clause
806 %type <str> select_clause opt_select_limit select_limit_value,
807 %type <str> select_offset_value table_list using_expr join_expr
808 %type <str> using_list from_expr table_expr join_clause join_type
809 %type <str> join_qual update_list join_clause join_clause_with_union
811 %type <str> ECPGWhenever ECPGConnect connection_target ECPGOpen opt_using
812 %type <str> indicator ECPGExecute ecpg_expr dotext ECPGPrepare
813 %type <str> storage_clause opt_initializer vartext c_anything blockstart
814 %type <str> blockend variable_list variable var_anything do_anything
815 %type <str> opt_pointer cvariable ECPGDisconnect dis_name
816 %type <str> stmt symbol opt_symbol ECPGRelease execstring server_name
817 %type <str> connection_object opt_server opt_port c_thing opt_reference
818 %type <str> user_name opt_user char_variable ora_user ident
819 %type <str> db_prefix server opt_options opt_connection_name
820 %type <str> ECPGSetConnection c_line cpp_line s_enum ECPGTypedef
821 %type <str> enum_type civariableonly ECPGCursorStmt ECPGDeallocate
822 %type <str> ECPGFree ECPGDeclare ECPGVar sql_variable_declarations
823 %type <str> sql_declaration sql_variable_list sql_variable opt_at
824 %type <str> struct_type s_struct declaration variable_declarations
825 %type <str> s_struct s_union union_type
827 %type <type_enum> simple_type varchar_type
829 %type <type> type ctype
831 %type <action> action
833 %type <index> opt_array_bounds nest_array_bounds opt_type_array_bounds
834 %type <index> nest_type_array_bounds
839 statements: /* empty */
840 | statements statement
842 statement: ecpgstart opt_at stmt SQL_SEMI { connection = NULL; }
843 | ecpgstart stmt SQL_SEMI
845 | c_thing { fprintf(yyout, "%s", $1); free($1); }
846 | cpp_line { fprintf(yyout, "%s", $1); free($1); }
847 | blockstart { fputs($1, yyout); free($1); }
848 | blockend { fputs($1, yyout); free($1); }
850 opt_at: SQL_AT connection_target { connection = $2; }
852 stmt: AddAttrStmt { output_statement($1, 0); }
853 | AlterUserStmt { output_statement($1, 0); }
854 | ClosePortalStmt { output_statement($1, 0); }
855 | CopyStmt { output_statement($1, 0); }
856 | CreateStmt { output_statement($1, 0); }
857 | CreateAsStmt { output_statement($1, 0); }
858 | CreateSeqStmt { output_statement($1, 0); }
859 | CreatePLangStmt { output_statement($1, 0); }
860 | CreateTrigStmt { output_statement($1, 0); }
861 | CreateUserStmt { output_statement($1, 0); }
862 | ClusterStmt { output_statement($1, 0); }
863 | DefineStmt { output_statement($1, 0); }
864 | DestroyStmt { output_statement($1, 0); }
865 | DropPLangStmt { output_statement($1, 0); }
866 | DropTrigStmt { output_statement($1, 0); }
867 | DropUserStmt { output_statement($1, 0); }
868 | ExtendStmt { output_statement($1, 0); }
869 | ExplainStmt { output_statement($1, 0); }
870 | FetchStmt { output_statement($1, 1); }
871 | GrantStmt { output_statement($1, 0); }
872 | IndexStmt { output_statement($1, 0); }
873 | ListenStmt { output_statement($1, 0); }
874 | UnlistenStmt { output_statement($1, 0); }
875 | LockStmt { output_statement($1, 0); }
876 | ProcedureStmt { output_statement($1, 0); }
877 | RecipeStmt { output_statement($1, 0); }
878 | RemoveAggrStmt { output_statement($1, 0); }
879 | RemoveOperStmt { output_statement($1, 0); }
880 | RemoveFuncStmt { output_statement($1, 0); }
881 | RemoveStmt { output_statement($1, 0); }
882 | RenameStmt { output_statement($1, 0); }
883 | RevokeStmt { output_statement($1, 0); }
885 if (strncmp($1, "/* " , sizeof("/* ")-1) == 0)
891 output_statement($1, 1);
893 | RuleStmt { output_statement($1, 0); }
895 fprintf(yyout, "ECPGtrans(__LINE__, %s, \"%s\");", connection ? connection : "NULL", $1);
899 | ViewStmt { output_statement($1, 0); }
900 | LoadStmt { output_statement($1, 0); }
901 | CreatedbStmt { output_statement($1, 0); }
902 | DestroydbStmt { output_statement($1, 0); }
903 | VacuumStmt { output_statement($1, 0); }
904 | VariableSetStmt { output_statement($1, 0); }
905 | VariableShowStmt { output_statement($1, 0); }
906 | VariableResetStmt { output_statement($1, 0); }
909 yyerror("no at option for connect statement.\n");
911 fprintf(yyout, "no_auto_trans = %d;\n", no_auto_trans);
912 fprintf(yyout, "ECPGconnect(__LINE__, %s);", $1);
922 yyerror("no at option for connect statement.\n");
934 yyerror("no at option for disconnect statement.\n");
936 fprintf(yyout, "ECPGdisconnect(__LINE__, \"%s\");", $1);
941 output_statement($1, 0);
944 fprintf(yyout, "ECPGdeallocate(__LINE__, %s, \"%s\");", connection ? connection : "NULL", $1);
951 for (ptr = cur; ptr != NULL; ptr=ptr->next)
953 if (strcmp(ptr->name, $1) == 0)
959 sprintf(errortext, "trying to open undeclared cursor %s\n", $1);
963 fprintf(yyout, "ECPGdo(__LINE__, %s, \"%s\",", ptr->connection ? ptr->connection : "NULL", ptr->command);
964 /* dump variables to C file*/
965 dump_variables(ptr->argsinsert, 0);
966 dump_variables(argsinsert, 0);
967 fputs("ECPGt_EOIT, ", yyout);
968 dump_variables(ptr->argsresult, 0);
969 fputs("ECPGt_EORT);", yyout);
975 yyerror("no at option for set connection statement.\n");
977 fprintf(yyout, "ECPGprepare(__LINE__, %s);", $1);
981 | ECPGRelease { /* output already done */ }
982 | ECPGSetConnection {
984 yyerror("no at option for set connection statement.\n");
986 fprintf(yyout, "ECPGsetconn(__LINE__, %s);", $1);
992 yyerror("no at option for typedef statement.\n");
999 yyerror("no at option for var statement.\n");
1006 yyerror("no at option for whenever statement.\n");
1009 output_line_number();
1016 * We start with a lot of stuff that's very similar to the backend's parsing
1019 /*****************************************************************************
1021 * Create a new Postgres DBMS user
1024 *****************************************************************************/
1026 CreateUserStmt: CREATE USER UserId user_passwd_clause user_createdb_clause
1027 user_createuser_clause user_group_clause user_valid_clause
1029 $$ = cat3_str(cat5_str(make1_str("create user"), $3, $4, $5, $6), $7, $8);
1033 /*****************************************************************************
1035 * Alter a postresql DBMS user
1038 *****************************************************************************/
1040 AlterUserStmt: ALTER 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("alter user"), $3, $4, $5, $6), $7, $8);
1047 /*****************************************************************************
1049 * Drop a postresql DBMS user
1052 *****************************************************************************/
1054 DropUserStmt: DROP USER UserId
1056 $$ = cat2_str(make1_str("drop user"), $3);
1060 user_passwd_clause: WITH PASSWORD UserId { $$ = cat2_str(make1_str("with password") , $3); }
1061 | /*EMPTY*/ { $$ = make1_str(""); }
1064 user_createdb_clause: CREATEDB
1066 $$ = make1_str("createdb");
1070 $$ = make1_str("nocreatedb");
1072 | /*EMPTY*/ { $$ = make1_str(""); }
1075 user_createuser_clause: CREATEUSER
1077 $$ = make1_str("createuser");
1081 $$ = make1_str("nocreateuser");
1083 | /*EMPTY*/ { $$ = NULL; }
1086 user_group_list: user_group_list ',' UserId
1088 $$ = cat3_str($1, make1_str(","), $3);
1096 user_group_clause: IN GROUP user_group_list { $$ = cat2_str(make1_str("in group"), $3); }
1097 | /*EMPTY*/ { $$ = make1_str(""); }
1100 user_valid_clause: VALID UNTIL Sconst { $$ = cat2_str(make1_str("valid until"), $3); }
1101 | /*EMPTY*/ { $$ = make1_str(""); }
1104 /*****************************************************************************
1106 * Set PG internal variable
1107 * SET name TO 'var_value'
1108 * Include SQL92 syntax (thomas 1997-10-22):
1109 * SET TIME ZONE 'var_value'
1111 *****************************************************************************/
1113 VariableSetStmt: SET ColId TO var_value
1115 $$ = cat4_str(make1_str("set"), $2, make1_str("to"), $4);
1117 | SET ColId '=' var_value
1119 $$ = cat4_str(make1_str("set"), $2, make1_str("="), $4);
1121 | SET TIME ZONE zone_value
1123 $$ = cat2_str(make1_str("set time zone"), $4);
1125 | SET TRANSACTION ISOLATION LEVEL READ ColId
1127 if (strcasecmp($6, "COMMITTED"))
1129 sprintf(errortext, "syntax error at or near \"%s\"", $6);
1133 $$ = cat2_str(make1_str("set transaction isolation level read"), $6);
1135 | SET TRANSACTION ISOLATION LEVEL ColId
1137 if (strcasecmp($5, "SERIALIZABLE"))
1139 sprintf(errortext, "syntax error at or near \"%s\"", $5);
1143 $$ = cat2_str(make1_str("set transaction isolation level read"), $5);
1145 | SET NAMES encoding
1148 $$ = cat2_str(make1_str("set names"), $3);
1150 yyerror("SET NAMES is not supported");
1155 var_value: Sconst { $$ = $1; }
1156 | DEFAULT { $$ = make1_str("default"); }
1159 zone_value: Sconst { $$ = $1; }
1160 | DEFAULT { $$ = make1_str("default"); }
1161 | LOCAL { $$ = make1_str("local"); }
1164 VariableShowStmt: SHOW ColId
1166 $$ = cat2_str(make1_str("show"), $2);
1170 $$ = make1_str("show time zone");
1172 | SHOW TRANSACTION ISOLATION LEVEL
1174 $$ = make1_str("show transaction isolation level");
1178 VariableResetStmt: RESET ColId
1180 $$ = cat2_str(make1_str("reset"), $2);
1184 $$ = make1_str("reset time zone");
1186 | RESET TRANSACTION ISOLATION LEVEL
1188 $$ = make1_str("reset transaction isolation level");
1193 /*****************************************************************************
1196 * addattr ( attr1 = type1 .. attrn = typen ) to <relname> [*]
1198 *****************************************************************************/
1200 AddAttrStmt: ALTER TABLE relation_name opt_inh_star alter_clause
1202 $$ = cat4_str(make1_str("alter table"), $3, $4, $5);
1206 alter_clause: ADD opt_column columnDef
1208 $$ = cat3_str(make1_str("add"), $2, $3);
1210 | ADD '(' OptTableElementList ')'
1212 $$ = make3_str(make1_str("add("), $3, make1_str(")"));
1214 | DROP opt_column ColId
1215 { yyerror("ALTER TABLE/DROP COLUMN not yet implemented"); }
1216 | ALTER opt_column ColId SET DEFAULT default_expr
1217 { yyerror("ALTER TABLE/ALTER COLUMN/SET DEFAULT not yet implemented"); }
1218 | ALTER opt_column ColId DROP DEFAULT
1219 { yyerror("ALTER TABLE/ALTER COLUMN/DROP DEFAULT not yet implemented"); }
1220 | ADD ConstraintElem
1221 { yyerror("ALTER TABLE/ADD CONSTRAINT not yet implemented"); }
1224 /*****************************************************************************
1229 *****************************************************************************/
1231 ClosePortalStmt: CLOSE opt_id
1233 $$ = cat2_str(make1_str("close"), $2);
1238 /*****************************************************************************
1241 * COPY [BINARY] <relname> FROM/TO
1242 * [USING DELIMITERS <delimiter>]
1244 *****************************************************************************/
1246 CopyStmt: COPY opt_binary relation_name opt_with_copy copy_dirn copy_file_name copy_delimiter
1248 $$ = cat3_str(cat5_str(make1_str("copy"), $2, $3, $4, $5), $6, $7);
1253 { $$ = make1_str("to"); }
1255 { $$ = make1_str("from"); }
1259 * copy_file_name NULL indicates stdio is used. Whether stdin or stdout is
1260 * used depends on the direction. (It really doesn't make sense to copy from
1261 * stdout. We silently correct the "typo". - AY 9/94
1263 copy_file_name: Sconst { $$ = $1; }
1264 | STDIN { $$ = make1_str("stdin"); }
1265 | STDOUT { $$ = make1_str("stdout"); }
1268 opt_binary: BINARY { $$ = make1_str("binary"); }
1269 | /*EMPTY*/ { $$ = make1_str(""); }
1272 opt_with_copy: WITH OIDS { $$ = make1_str("with oids"); }
1273 | /*EMPTY*/ { $$ = make1_str(""); }
1277 * the default copy delimiter is tab but the user can configure it
1279 copy_delimiter: USING DELIMITERS Sconst { $$ = cat2_str(make1_str("using delimiters"), $3); }
1280 | /*EMPTY*/ { $$ = make1_str(""); }
1285 /*****************************************************************************
1290 *****************************************************************************/
1292 CreateStmt: CREATE OptTemp TABLE relation_name '(' OptTableElementList ')'
1295 $$ = cat3_str(cat4_str(make1_str("create"), $2, make1_str("table"), $4), make3_str(make1_str("("), $6, make1_str(")")), $8);
1299 OptTemp: TEMP { $$ = make1_str("temp"); }
1300 | /* EMPTY */ { $$ = make1_str(""); }
1303 OptTableElementList: OptTableElementList ',' OptTableElement
1305 $$ = cat3_str($1, make1_str(","), $3);
1311 | /*EMPTY*/ { $$ = make1_str(""); }
1314 OptTableElement: columnDef { $$ = $1; }
1315 | TableConstraint { $$ = $1; }
1318 columnDef: ColId Typename ColQualifier
1320 $$ = cat3_str($1, $2, $3);
1322 | ColId SERIAL ColPrimaryKey
1324 $$ = make3_str($1, make1_str(" serial "), $3);
1328 ColQualifier: ColQualList { $$ = $1; }
1329 | /*EMPTY*/ { $$ = make1_str(""); }
1332 ColQualList: ColQualList ColConstraint { $$ = cat2_str($1,$2); }
1333 | ColConstraint { $$ = $1; }
1336 ColPrimaryKey: PRIMARY KEY
1338 $$ = make1_str("primary key");
1347 CONSTRAINT name ColConstraintElem
1349 $$ = cat3_str(make1_str("constraint"), $2, $3);
1355 /* DEFAULT NULL is already the default for Postgres.
1356 * Bue define it here and carry it forward into the system
1357 * to make it explicit.
1358 * - thomas 1998-09-13
1359 * WITH NULL and NULL are not SQL92-standard syntax elements,
1360 * so leave them out. Use DEFAULT NULL to explicitly indicate
1361 * that a column may have that value. WITH NULL leads to
1362 * shift/reduce conflicts with WITH TIME ZONE anyway.
1363 * - thomas 1999-01-08
1365 ColConstraintElem: CHECK '(' constraint_expr ')'
1367 $$ = make3_str(make1_str("check("), $3, make1_str(")"));
1371 $$ = make1_str("default null");
1373 | DEFAULT default_expr
1375 $$ = cat2_str(make1_str("default"), $2);
1379 $$ = make1_str("not null");
1383 $$ = make1_str("unique");
1387 $$ = make1_str("primary key");
1389 | REFERENCES ColId opt_column_list key_match key_actions
1391 fprintf(stderr, "CREATE TABLE/FOREIGN KEY clause ignored; not yet implemented");
1396 default_list: default_list ',' default_expr
1398 $$ = cat3_str($1, make1_str(","), $3);
1406 /* The Postgres default column value is NULL.
1407 * Rather than carrying DEFAULT NULL forward as a clause,
1408 * let's just have it be a no-op.
1410 { $$ = make1_str("null"); }
1411 * - thomas 1998-09-13
1414 default_expr: AexprConst
1416 | '-' default_expr %prec UMINUS
1417 { $$ = cat2_str(make1_str("-"), $2); }
1418 | default_expr '+' default_expr
1419 { $$ = cat3_str($1, make1_str("+"), $3); }
1420 | default_expr '-' default_expr
1421 { $$ = cat3_str($1, make1_str("-"), $3); }
1422 | default_expr '/' default_expr
1423 { $$ = cat3_str($1, make1_str("/"), $3); }
1424 | default_expr '*' default_expr
1425 { $$ = cat3_str($1, make1_str("*"), $3); }
1426 | default_expr '=' default_expr
1427 { yyerror("boolean expressions not supported in DEFAULT"); }
1428 | default_expr '<' default_expr
1429 { yyerror("boolean expressions not supported in DEFAULT"); }
1430 | default_expr '>' default_expr
1431 { yyerror("boolean expressions not supported in DEFAULT"); }
1432 /* not possible in embedded sql
1434 { $$ = cat2_str(make1_str(":"), $2); }
1437 { $$ = cat2_str(make1_str(";"), $2); }
1439 { $$ = cat2_str(make1_str("|"), $2); }
1440 | default_expr TYPECAST Typename
1441 { $$ = cat3_str($1, make1_str("::"), $3); }
1442 | CAST '(' default_expr AS Typename ')'
1444 $$ = cat3_str(make2_str(make1_str("cast("), $3) , make1_str("as"), make2_str($5, make1_str(")")));
1446 | '(' default_expr ')'
1447 { $$ = make3_str(make1_str("("), $2, make1_str(")")); }
1449 { $$ = cat2_str($1, make1_str("()")); }
1450 | func_name '(' default_list ')'
1451 { $$ = cat2_str($1, make3_str(make1_str("("), $3, make1_str(")"))); }
1452 | default_expr Op default_expr
1454 if (!strcmp("<=", $2) || !strcmp(">=", $2))
1455 yyerror("boolean expressions not supported in DEFAULT");
1456 $$ = cat3_str($1, $2, $3);
1459 { $$ = cat2_str($1, $2); }
1461 { $$ = cat2_str($1, $2); }
1462 /* XXX - thomas 1997-10-07 v6.2 function-specific code to be changed */
1464 { $$ = make1_str("current_date"); }
1466 { $$ = make1_str("current_time"); }
1467 | CURRENT_TIME '(' Iconst ')'
1470 fprintf(stderr, "CURRENT_TIME(%s) precision not implemented; zero used instead",$3);
1471 $$ = "current_time";
1474 { $$ = make1_str("current_timestamp"); }
1475 | CURRENT_TIMESTAMP '(' Iconst ')'
1478 fprintf(stderr, "CURRENT_TIMESTAMP(%s) precision not implemented; zero used instead",$3);
1479 $$ = "current_timestamp";
1482 { $$ = make1_str("current_user"); }
1484 { $$ = make1_str("user"); }
1487 /* ConstraintElem specifies constraint syntax which is not embedded into
1488 * a column definition. ColConstraintElem specifies the embedded form.
1489 * - thomas 1997-12-03
1491 TableConstraint: CONSTRAINT name ConstraintElem
1493 $$ = cat3_str(make1_str("constraint"), $2, $3);
1499 ConstraintElem: CHECK '(' constraint_expr ')'
1501 $$ = make3_str(make1_str("check("), $3, make1_str(")"));
1503 | UNIQUE '(' columnList ')'
1505 $$ = make3_str(make1_str("unique("), $3, make1_str(")"));
1507 | PRIMARY KEY '(' columnList ')'
1509 $$ = make3_str(make1_str("primary key("), $4, make1_str(")"));
1511 | FOREIGN KEY '(' columnList ')' REFERENCES ColId opt_column_list key_match key_actions
1513 fprintf(stderr, "CREATE TABLE/FOREIGN KEY clause ignored; not yet implemented");
1518 constraint_list: constraint_list ',' constraint_expr
1520 $$ = cat3_str($1, make1_str(","), $3);
1528 constraint_expr: AexprConst
1531 { $$ = make1_str("null"); }
1536 | '-' constraint_expr %prec UMINUS
1537 { $$ = cat2_str(make1_str("-"), $2); }
1538 | constraint_expr '+' constraint_expr
1539 { $$ = cat3_str($1, make1_str("+"), $3); }
1540 | constraint_expr '-' constraint_expr
1541 { $$ = cat3_str($1, make1_str("-"), $3); }
1542 | constraint_expr '/' constraint_expr
1543 { $$ = cat3_str($1, make1_str("/"), $3); }
1544 | constraint_expr '*' constraint_expr
1545 { $$ = cat3_str($1, make1_str("*"), $3); }
1546 | constraint_expr '=' constraint_expr
1547 { $$ = cat3_str($1, make1_str("="), $3); }
1548 | constraint_expr '<' constraint_expr
1549 { $$ = cat3_str($1, make1_str("<"), $3); }
1550 | constraint_expr '>' constraint_expr
1551 { $$ = cat3_str($1, make1_str(">"), $3); }
1552 /* this one doesn't work with embedded sql anyway
1553 | ':' constraint_expr
1554 { $$ = cat2_str(make1_str(":"), $2); }
1556 | ';' constraint_expr
1557 { $$ = cat2_str(make1_str(";"), $2); }
1558 | '|' constraint_expr
1559 { $$ = cat2_str(make1_str("|"), $2); }
1560 | constraint_expr TYPECAST Typename
1562 $$ = cat3_str($1, make1_str("::"), $3);
1564 | CAST '(' constraint_expr AS Typename ')'
1566 $$ = cat3_str(make2_str(make1_str("cast("), $3), make1_str("as"), make2_str($5, make1_str(")")));
1568 | '(' constraint_expr ')'
1569 { $$ = make3_str(make1_str("("), $2, make1_str(")")); }
1572 { $$ = cat2_str($1, make1_str("()")); }
1574 | func_name '(' constraint_list ')'
1576 $$ = cat2_str($1, make3_str(make1_str("("), $3, make1_str(")")));
1578 | constraint_expr Op constraint_expr
1579 { $$ = cat3_str($1, $2, $3); }
1580 | constraint_expr LIKE constraint_expr
1581 { $$ = cat3_str($1, make1_str("like"), $3); }
1582 | constraint_expr NOT LIKE constraint_expr
1583 { $$ = cat3_str($1, make1_str("not like"), $4); }
1584 | constraint_expr AND constraint_expr
1585 { $$ = cat3_str($1, make1_str("and"), $3); }
1586 | constraint_expr OR constraint_expr
1587 { $$ = cat3_str($1, make1_str("or"), $3); }
1588 | NOT constraint_expr
1589 { $$ = cat2_str(make1_str("not"), $2); }
1590 | Op constraint_expr
1591 { $$ = cat2_str($1, $2); }
1592 | constraint_expr Op
1593 { $$ = cat2_str($1, $2); }
1594 | constraint_expr ISNULL
1595 { $$ = cat2_str($1, make1_str("isnull")); }
1596 | constraint_expr IS NULL_P
1597 { $$ = cat2_str($1, make1_str("is null")); }
1598 | constraint_expr NOTNULL
1599 { $$ = cat2_str($1, make1_str("notnull")); }
1600 | constraint_expr IS NOT NULL_P
1601 { $$ = cat2_str($1, make1_str("is not null")); }
1602 | constraint_expr IS TRUE_P
1603 { $$ = cat2_str($1, make1_str("is true")); }
1604 | constraint_expr IS FALSE_P
1605 { $$ = cat2_str($1, make1_str("is false")); }
1606 | constraint_expr IS NOT TRUE_P
1607 { $$ = cat2_str($1, make1_str("is not true")); }
1608 | constraint_expr IS NOT FALSE_P
1609 { $$ = cat2_str($1, make1_str("is not false")); }
1610 | constraint_expr IN '(' c_list ')'
1611 { $$ = cat4_str($1, make1_str("in ("), $4, make1_str(")")); }
1612 | constraint_expr NOT IN '(' c_list ')'
1613 { $$ = cat4_str($1, make1_str("not in ("), $5, make1_str(")")); }
1614 | constraint_expr BETWEEN c_expr AND c_expr
1615 { $$ = cat5_str($1, make1_str("between"), $3, make1_str("and"), $5); }
1616 | constraint_expr NOT BETWEEN c_expr AND c_expr
1617 { $$ = cat5_str($1, make1_str("not between"), $4, make1_str("and"), $6); }
1619 c_list: c_list ',' c_expr
1621 $$ = make3_str($1, make1_str(", "), $3);
1633 key_match: MATCH FULL { $$ = make1_str("match full"); }
1634 | MATCH PARTIAL { $$ = make1_str("match partial"); }
1635 | /*EMPTY*/ { $$ = make1_str(""); }
1638 key_actions: key_action key_action { $$ = cat2_str($1, $2); }
1639 | key_action { $$ = $1; }
1640 | /*EMPTY*/ { $$ = make1_str(""); }
1643 key_action: ON DELETE key_reference { $$ = cat2_str(make1_str("on delete"), $3); }
1644 | ON UPDATE key_reference { $$ = cat2_str(make1_str("on update"), $3); }
1647 key_reference: NO ACTION { $$ = make1_str("no action"); }
1648 | CASCADE { $$ = make1_str("cascade"); }
1649 | SET DEFAULT { $$ = make1_str("set default"); }
1650 | SET NULL_P { $$ = make1_str("set null"); }
1653 OptInherit: INHERITS '(' relation_name_list ')' { $$ = make3_str(make1_str("inherits ("), $3, make1_str(")")); }
1654 | /*EMPTY*/ { $$ = make1_str(""); }
1657 CreateAsStmt: CREATE OptTemp TABLE relation_name OptCreateAs AS SubSelect
1659 $$ = cat5_str(cat3_str(make1_str("create"), $2, make1_str("table")), $4, $5, make1_str("as"), $7);
1663 OptCreateAs: '(' CreateAsList ')' { $$ = make3_str(make1_str("("), $2, make1_str(")")); }
1664 | /*EMPTY*/ { $$ = make1_str(""); }
1667 CreateAsList: CreateAsList ',' CreateAsElement { $$ = cat3_str($1, make1_str(","), $3); }
1668 | CreateAsElement { $$ = $1; }
1671 CreateAsElement: ColId { $$ = $1; }
1674 /*****************************************************************************
1677 * CREATE SEQUENCE seqname
1679 *****************************************************************************/
1681 CreateSeqStmt: CREATE SEQUENCE relation_name OptSeqList
1683 $$ = cat3_str(make1_str("create sequence"), $3, $4);
1687 OptSeqList: OptSeqList OptSeqElem
1688 { $$ = cat2_str($1, $2); }
1689 | { $$ = make1_str(""); }
1692 OptSeqElem: CACHE IntegerOnly
1694 $$ = cat2_str(make1_str("cache"), $2);
1698 $$ = make1_str("cycle");
1700 | INCREMENT IntegerOnly
1702 $$ = cat2_str(make1_str("increment"), $2);
1704 | MAXVALUE IntegerOnly
1706 $$ = cat2_str(make1_str("maxvalue"), $2);
1708 | MINVALUE IntegerOnly
1710 $$ = cat2_str(make1_str("minvalue"), $2);
1714 $$ = cat2_str(make1_str("start"), $2);
1718 NumericOnly: FloatOnly { $$ = $1; }
1719 | IntegerOnly { $$ = $1; }
1727 $$ = cat2_str(make1_str("-"), $2);
1738 $$ = cat2_str(make1_str("-"), $2);
1742 /*****************************************************************************
1745 * CREATE PROCEDURAL LANGUAGE ...
1746 * DROP PROCEDURAL LANGUAGE ...
1748 *****************************************************************************/
1750 CreatePLangStmt: CREATE PLangTrusted PROCEDURAL LANGUAGE Sconst
1751 HANDLER def_name LANCOMPILER Sconst
1753 $$ = cat4_str(cat5_str(make1_str("create"), $2, make1_str("precedural language"), $5, make1_str("handler")), $7, make1_str("langcompiler"), $9);
1757 PLangTrusted: TRUSTED { $$ = make1_str("trusted"); }
1758 | { $$ = make1_str(""); }
1760 DropPLangStmt: DROP PROCEDURAL LANGUAGE Sconst
1762 $$ = cat2_str(make1_str("drop procedural language"), $4);
1766 /*****************************************************************************
1769 * CREATE TRIGGER ...
1772 *****************************************************************************/
1774 CreateTrigStmt: CREATE TRIGGER name TriggerActionTime TriggerEvents ON
1775 relation_name TriggerForSpec EXECUTE PROCEDURE
1776 name '(' TriggerFuncArgs ')'
1778 $$ = 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(")")));
1782 TriggerActionTime: BEFORE { $$ = make1_str("before"); }
1783 | AFTER { $$ = make1_str("after"); }
1786 TriggerEvents: TriggerOneEvent
1790 | TriggerOneEvent OR TriggerOneEvent
1792 $$ = cat3_str($1, make1_str("or"), $3);
1794 | TriggerOneEvent OR TriggerOneEvent OR TriggerOneEvent
1796 $$ = cat5_str($1, make1_str("or"), $3, make1_str("or"), $5);
1800 TriggerOneEvent: INSERT { $$ = make1_str("insert"); }
1801 | DELETE { $$ = make1_str("delete"); }
1802 | UPDATE { $$ = make1_str("update"); }
1805 TriggerForSpec: FOR TriggerForOpt TriggerForType
1807 $$ = cat3_str(make1_str("for"), $2, $3);
1811 TriggerForOpt: EACH { $$ = make1_str("each"); }
1812 | /*EMPTY*/ { $$ = make1_str(""); }
1815 TriggerForType: ROW { $$ = make1_str("row"); }
1816 | STATEMENT { $$ = make1_str("statement"); }
1819 TriggerFuncArgs: TriggerFuncArg
1821 | TriggerFuncArgs ',' TriggerFuncArg
1822 { $$ = cat3_str($1, make1_str(","), $3); }
1824 { $$ = make1_str(""); }
1827 TriggerFuncArg: Iconst
1835 | Sconst { $$ = $1; }
1836 | ident { $$ = $1; }
1839 DropTrigStmt: DROP TRIGGER name ON relation_name
1841 $$ = cat4_str(make1_str("drop trigger"), $3, make1_str("on"), $5);
1845 /*****************************************************************************
1848 * define (type,operator,aggregate)
1850 *****************************************************************************/
1852 DefineStmt: CREATE def_type def_rest
1854 $$ = cat3_str(make1_str("create"), $2, $3);
1858 def_rest: def_name definition
1860 $$ = cat2_str($1, $2);
1864 def_type: OPERATOR { $$ = make1_str("operator"); }
1865 | TYPE_P { $$ = make1_str("type"); }
1866 | AGGREGATE { $$ = make1_str("aggregate"); }
1869 def_name: PROCEDURE { $$ = make1_str("procedure"); }
1870 | JOIN { $$ = make1_str("join"); }
1871 | ColId { $$ = $1; }
1872 | MathOp { $$ = $1; }
1876 definition: '(' def_list ')' { $$ = make3_str(make1_str("("), $2, make1_str(")")); }
1879 def_list: def_elem { $$ = $1; }
1880 | def_list ',' def_elem { $$ = cat3_str($1, make1_str(","), $3); }
1883 def_elem: def_name '=' def_arg {
1884 $$ = cat3_str($1, make1_str("="), $3);
1890 | DEFAULT '=' def_arg
1892 $$ = cat2_str(make1_str("default ="), $3);
1896 def_arg: ColId { $$ = $1; }
1897 | all_Op { $$ = $1; }
1898 | NumericOnly { $$ = $1; }
1899 | Sconst { $$ = $1; }
1902 $$ = cat2_str(make1_str("setof"), $2);
1906 /*****************************************************************************
1909 * destroy <relname1> [, <relname2> .. <relnameN> ]
1911 *****************************************************************************/
1913 DestroyStmt: DROP TABLE relation_name_list
1915 $$ = cat2_str(make1_str("drop table"), $3);
1917 | DROP SEQUENCE relation_name_list
1919 $$ = cat2_str(make1_str("drop sequence"), $3);
1925 /*****************************************************************************
1928 * fetch/move [forward | backward] [ # | all ] [ in <portalname> ]
1929 * fetch [ forward | backward | absolute | relative ]
1930 * [ # | all | next | prior ] [ [ in | from ] <portalname> ]
1932 *****************************************************************************/
1934 FetchStmt: FETCH opt_direction fetch_how_many opt_portal_name INTO into_list
1936 if (strncmp($2, "relative", strlen("relative")) == 0 && atol($3) == 0L)
1937 yyerror("FETCH/RELATIVE at current position is not supported");
1939 $$ = cat4_str(make1_str("fetch"), $2, $3, $4);
1941 | MOVE opt_direction fetch_how_many opt_portal_name
1943 $$ = cat4_str(make1_str("fetch"), $2, $3, $4);
1947 opt_direction: FORWARD { $$ = make1_str("forward"); }
1948 | BACKWARD { $$ = make1_str("backward"); }
1949 | RELATIVE { $$ = make1_str("relative"); }
1952 fprintf(stderr, "FETCH/ABSOLUTE not supported, using RELATIVE");
1953 $$ = make1_str("absolute");
1955 | /*EMPTY*/ { $$ = make1_str(""); /* default */ }
1958 fetch_how_many: Iconst { $$ = $1; }
1959 | '-' Iconst { $$ = make2_str(make1_str("-"), $2); }
1960 | ALL { $$ = make1_str("all"); }
1961 | NEXT { $$ = make1_str("next"); }
1962 | PRIOR { $$ = make1_str("prior"); }
1963 | /*EMPTY*/ { $$ = make1_str(""); /*default*/ }
1966 opt_portal_name: IN name { $$ = cat2_str(make1_str("in"), $2); }
1967 | FROM name { $$ = cat2_str(make1_str("from"), $2); }
1968 /* | name { $$ = cat2_str(make1_str("in"), $1); */
1969 | /*EMPTY*/ { $$ = make1_str(""); }
1973 /*****************************************************************************
1976 * GRANT [privileges] ON [relation_name_list] TO [GROUP] grantee
1978 *****************************************************************************/
1980 GrantStmt: GRANT privileges ON relation_name_list TO grantee opt_with_grant
1982 $$ = cat2_str(cat5_str(make1_str("grant"), $2, make1_str("on"), $4, make1_str("to")), $6);
1986 privileges: ALL PRIVILEGES
1988 $$ = make1_str("all privileges");
1992 $$ = make1_str("all");
1994 | operation_commalist
2000 operation_commalist: operation
2004 | operation_commalist ',' operation
2006 $$ = cat3_str($1, make1_str(","), $3);
2012 $$ = make1_str("select");
2016 $$ = make1_str("insert");
2020 $$ = make1_str("update");
2024 $$ = make1_str("delete");
2028 $$ = make1_str("rule");
2034 $$ = make1_str("public");
2038 $$ = cat2_str(make1_str("group"), $2);
2046 opt_with_grant: WITH GRANT OPTION
2048 yyerror("WITH GRANT OPTION is not supported. Only relation owners can set privileges");
2054 /*****************************************************************************
2057 * REVOKE [privileges] ON [relation_name] FROM [user]
2059 *****************************************************************************/
2061 RevokeStmt: REVOKE privileges ON relation_name_list FROM grantee
2063 $$ = cat2_str(cat5_str(make1_str("revoke"), $2, make1_str("on"), $4, make1_str("from")), $6);
2069 /*****************************************************************************
2072 * create index <indexname> on <relname>
2073 * using <access> "(" (<col> with <op>)+ ")" [with
2076 * [where <qual>] is not supported anymore
2077 *****************************************************************************/
2079 IndexStmt: CREATE index_opt_unique INDEX index_name ON relation_name
2080 access_method_clause '(' index_params ')' opt_with
2082 /* should check that access_method is valid,
2083 etc ... but doesn't */
2084 $$ = 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);
2088 index_opt_unique: UNIQUE { $$ = make1_str("unique"); }
2089 | /*EMPTY*/ { $$ = make1_str(""); }
2092 access_method_clause: USING access_method { $$ = cat2_str(make1_str("using"), $2); }
2093 | /*EMPTY*/ { $$ = make1_str(""); }
2096 index_params: index_list { $$ = $1; }
2097 | func_index { $$ = $1; }
2100 index_list: index_list ',' index_elem { $$ = cat3_str($1, make1_str(","), $3); }
2101 | index_elem { $$ = $1; }
2104 func_index: func_name '(' name_list ')' opt_type opt_class
2106 $$ = cat4_str($1, make3_str(make1_str("("), $3, ")"), $5, $6);
2110 index_elem: attr_name opt_type opt_class
2112 $$ = cat3_str($1, $2, $3);
2116 opt_type: ':' Typename { $$ = cat2_str(make1_str(":"), $2); }
2117 | FOR Typename { $$ = cat2_str(make1_str("for"), $2); }
2118 | /*EMPTY*/ { $$ = make1_str(""); }
2121 /* opt_class "WITH class" conflicts with preceeding opt_type
2122 * for Typename of "TIMESTAMP WITH TIME ZONE"
2123 * So, remove "WITH class" from the syntax. OK??
2124 * - thomas 1997-10-12
2125 * | WITH class { $$ = $2; }
2127 opt_class: class { $$ = $1; }
2128 | USING class { $$ = cat2_str(make1_str("using"), $2); }
2129 | /*EMPTY*/ { $$ = make1_str(""); }
2132 /*****************************************************************************
2135 * extend index <indexname> [where <qual>]
2137 *****************************************************************************/
2139 ExtendStmt: EXTEND INDEX index_name where_clause
2141 $$ = cat3_str(make1_str("extend index"), $3, $4);
2146 /*****************************************************************************
2149 * execute recipe <recipeName>
2151 *****************************************************************************/
2153 RecipeStmt: EXECUTE RECIPE recipe_name
2155 $$ = cat2_str(make1_str("execute recipe"), $3);
2159 /*****************************************************************************
2162 * define function <fname>
2163 * (language = <lang>, returntype = <typename>
2164 * [, arch_pct = <percentage | pre-defined>]
2165 * [, disk_pct = <percentage | pre-defined>]
2166 * [, byte_pct = <percentage | pre-defined>]
2167 * [, perbyte_cpu = <int | pre-defined>]
2168 * [, percall_cpu = <int | pre-defined>]
2170 * [arg is (<type-1> { , <type-n>})]
2171 * as <filename or code in language as appropriate>
2173 *****************************************************************************/
2175 ProcedureStmt: CREATE FUNCTION func_name func_args
2176 RETURNS func_return opt_with AS Sconst LANGUAGE Sconst
2178 $$ = 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);
2181 opt_with: WITH definition { $$ = cat2_str(make1_str("with"), $2); }
2182 | /*EMPTY*/ { $$ = make1_str(""); }
2185 func_args: '(' func_args_list ')' { $$ = make3_str(make1_str("("), $2, make1_str(")")); }
2186 | '(' ')' { $$ = make1_str("()"); }
2189 func_args_list: TypeId { $$ = $1; }
2190 | func_args_list ',' TypeId
2191 { $$ = cat3_str($1, make1_str(","), $3); }
2194 func_return: set_opt TypeId
2196 $$ = cat2_str($1, $2);
2200 set_opt: SETOF { $$ = make1_str("setof"); }
2201 | /*EMPTY*/ { $$ = make1_str(""); }
2205 /*****************************************************************************
2209 * remove function <funcname>
2210 * (REMOVE FUNCTION "funcname" (arg1, arg2, ...))
2211 * remove aggregate <aggname>
2212 * (REMOVE AGGREGATE "aggname" "aggtype")
2213 * remove operator <opname>
2214 * (REMOVE OPERATOR "opname" (leftoperand_typ rightoperand_typ))
2215 * remove type <typename>
2216 * (REMOVE TYPE "typename")
2217 * remove rule <rulename>
2218 * (REMOVE RULE "rulename")
2220 *****************************************************************************/
2222 RemoveStmt: DROP remove_type name
2224 $$ = cat3_str(make1_str("drop"), $2, $3);
2228 remove_type: TYPE_P { $$ = make1_str("type"); }
2229 | INDEX { $$ = make1_str("index"); }
2230 | RULE { $$ = make1_str("rule"); }
2231 | VIEW { $$ = make1_str("view"); }
2235 RemoveAggrStmt: DROP AGGREGATE name aggr_argtype
2237 $$ = cat3_str(make1_str("drop aggregate"), $3, $4);
2241 aggr_argtype: name { $$ = $1; }
2242 | '*' { $$ = make1_str("*"); }
2246 RemoveFuncStmt: DROP FUNCTION func_name func_args
2248 $$ = cat3_str(make1_str("drop function"), $3, $4);
2253 RemoveOperStmt: DROP OPERATOR all_Op '(' oper_argtypes ')'
2255 $$ = cat3_str(make1_str("drop operator"), $3, make3_str(make1_str("("), $5, make1_str(")")));
2259 all_Op: Op | MathOp;
2261 MathOp: '+' { $$ = make1_str("+"); }
2262 | '-' { $$ = make1_str("-"); }
2263 | '*' { $$ = make1_str("*"); }
2264 | '/' { $$ = make1_str("/"); }
2265 | '<' { $$ = make1_str("<"); }
2266 | '>' { $$ = make1_str(">"); }
2267 | '=' { $$ = make1_str("="); }
2272 yyerror("parser: argument type missing (use NONE for unary operators)");
2275 { $$ = cat3_str($1, make1_str(","), $3); }
2276 | NONE ',' name /* left unary */
2277 { $$ = cat2_str(make1_str("none,"), $3); }
2278 | name ',' NONE /* right unary */
2279 { $$ = cat2_str($1, make1_str(", none")); }
2283 /*****************************************************************************
2286 * rename <attrname1> in <relname> [*] to <attrname2>
2287 * rename <relname1> to <relname2>
2289 *****************************************************************************/
2291 RenameStmt: ALTER TABLE relation_name opt_inh_star
2292 RENAME opt_column opt_name TO name
2294 $$ = cat4_str(cat5_str(make1_str("alter table"), $3, $4, make1_str("rename"), $6), $7, make1_str("to"), $9);
2298 opt_name: name { $$ = $1; }
2299 | /*EMPTY*/ { $$ = make1_str(""); }
2302 opt_column: COLUMN { $$ = make1_str("colmunn"); }
2303 | /*EMPTY*/ { $$ = make1_str(""); }
2307 /*****************************************************************************
2309 * QUERY: Define Rewrite Rule , Define Tuple Rule
2310 * Define Rule <old rules >
2312 * only rewrite rule is supported -- ay 9/94
2314 *****************************************************************************/
2316 RuleStmt: CREATE RULE name AS
2318 ON event TO event_object where_clause
2319 DO opt_instead RuleActionList
2321 $$ = 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);
2325 RuleActionList: NOTHING { $$ = make1_str("nothing"); }
2326 | SelectStmt { $$ = $1; }
2327 | RuleActionStmt { $$ = $1; }
2328 | '[' RuleActionBlock ']' { $$ = cat3_str(make1_str("["), $2, make1_str("]")); }
2329 | '(' RuleActionBlock ')' { $$ = cat3_str(make1_str("("), $2, make1_str(")")); }
2332 RuleActionBlock: RuleActionMulti { $$ = $1; }
2333 | RuleActionStmt { $$ = $1; }
2336 RuleActionMulti: RuleActionMulti RuleActionStmt
2337 { $$ = cat2_str($1, $2); }
2338 | RuleActionMulti RuleActionStmt ';'
2339 { $$ = cat3_str($1, $2, make1_str(";")); }
2340 | RuleActionStmt ';'
2341 { $$ = cat2_str($1, make1_str(";")); }
2344 RuleActionStmt: InsertStmt
2350 event_object: relation_name '.' attr_name
2352 $$ = make3_str($1, make1_str("."), $3);
2360 /* change me to select, update, etc. some day */
2361 event: SELECT { $$ = make1_str("select"); }
2362 | UPDATE { $$ = make1_str("update"); }
2363 | DELETE { $$ = make1_str("delete"); }
2364 | INSERT { $$ = make1_str("insert"); }
2367 opt_instead: INSTEAD { $$ = make1_str("instead"); }
2368 | /*EMPTY*/ { $$ = make1_str(""); }
2372 /*****************************************************************************
2375 * NOTIFY <relation_name> can appear both in rule bodies and
2376 * as a query-level command
2378 *****************************************************************************/
2380 NotifyStmt: NOTIFY relation_name
2382 $$ = cat2_str(make1_str("notify"), $2);
2386 ListenStmt: LISTEN relation_name
2388 $$ = cat2_str(make1_str("listen"), $2);
2392 UnlistenStmt: UNLISTEN relation_name
2394 $$ = cat2_str(make1_str("unlisten"), $2);
2398 $$ = make1_str("unlisten *");
2402 /*****************************************************************************
2413 *****************************************************************************/
2414 TransactionStmt: ABORT_TRANS opt_trans { $$ = make1_str("rollback"); }
2415 | BEGIN_TRANS opt_trans { $$ = make1_str("begin transaction"); }
2416 | COMMIT opt_trans { $$ = make1_str("commit"); }
2417 | END_TRANS opt_trans { $$ = make1_str("commit"); }
2418 | ROLLBACK opt_trans { $$ = make1_str("rollback"); }
2420 opt_trans: WORK { $$ = ""; }
2421 | TRANSACTION { $$ = ""; }
2422 | /*EMPTY*/ { $$ = ""; }
2425 /*****************************************************************************
2428 * define view <viewname> '('target-list ')' [where <quals> ]
2430 *****************************************************************************/
2432 ViewStmt: CREATE VIEW name AS SelectStmt
2434 $$ = cat4_str(make1_str("create view"), $3, make1_str("as"), $5);
2439 /*****************************************************************************
2442 * load make1_str("filename")
2444 *****************************************************************************/
2446 LoadStmt: LOAD file_name
2448 $$ = cat2_str(make1_str("load"), $2);
2453 /*****************************************************************************
2458 *****************************************************************************/
2460 CreatedbStmt: CREATE DATABASE database_name WITH opt_database1 opt_database2
2462 if (strlen($5) == 0 || strlen($6) == 0)
2463 yyerror("CREATE DATABASE WITH requires at least an option");
2465 if (strlen($6) != 0)
2466 yyerror("WITH ENCODING is not supported");
2468 $$ = cat5_str(make1_str("create database"), $3, make1_str("with"), $5, $6);
2470 | CREATE DATABASE database_name
2472 $$ = cat2_str(make1_str("create database"), $3);
2476 opt_database1: LOCATION '=' location { $$ = cat2_str(make1_str("location ="), $3); }
2477 | /*EMPTY*/ { $$ = make1_str(""); }
2480 opt_database2: ENCODING '=' encoding { $$ = cat2_str(make1_str("encoding ="), $3); }
2481 | /*EMPTY*/ { $$ = NULL; }
2484 location: Sconst { $$ = $1; }
2485 | DEFAULT { $$ = make1_str("default"); }
2486 | /*EMPTY*/ { $$ = make1_str(""); }
2489 encoding: Sconst { $$ = $1; }
2490 | DEFAULT { $$ = make1_str("default"); }
2491 | /*EMPTY*/ { $$ = make1_str(""); }
2494 /*****************************************************************************
2499 *****************************************************************************/
2501 DestroydbStmt: DROP DATABASE database_name
2503 $$ = cat2_str(make1_str("drop database"), $3);
2508 /*****************************************************************************
2511 * cluster <index_name> on <relation_name>
2513 *****************************************************************************/
2515 ClusterStmt: CLUSTER index_name ON relation_name
2517 $$ = cat4_str(make1_str("cluster"), $2, make1_str("on"), $4);
2522 /*****************************************************************************
2527 *****************************************************************************/
2529 VacuumStmt: VACUUM opt_verbose opt_analyze
2531 $$ = cat3_str(make1_str("vacuum"), $2, $3);
2533 | VACUUM opt_verbose opt_analyze relation_name opt_va_list
2535 if ( strlen($5) > 0 && strlen($4) == 0 )
2536 yyerror("parser: syntax error at or near \"(\"");
2537 $$ = cat5_str(make1_str("vacuum"), $2, $3, $4, $5);
2541 opt_verbose: VERBOSE { $$ = make1_str("verbose"); }
2542 | /*EMPTY*/ { $$ = make1_str(""); }
2545 opt_analyze: ANALYZE { $$ = make1_str("analyse"); }
2546 | /*EMPTY*/ { $$ = make1_str(""); }
2549 opt_va_list: '(' va_list ')' { $$ = make3_str(make1_str("("), $2, make1_str(")")); }
2550 | /*EMPTY*/ { $$ = make1_str(""); }
2556 { $$=cat3_str($1, make1_str(","), $3); }
2560 /*****************************************************************************
2565 *****************************************************************************/
2567 ExplainStmt: EXPLAIN opt_verbose OptimizableStmt
2569 $$ = cat3_str(make1_str("explain"), $2, $3);
2574 /*****************************************************************************
2576 * Optimizable Stmts: *
2578 * one of the five queries processed by the planner *
2580 * [ultimately] produces query-trees as specified *
2581 * in the query-spec document in ~postgres/ref *
2583 *****************************************************************************/
2585 OptimizableStmt: SelectStmt
2594 /*****************************************************************************
2599 *****************************************************************************/
2602 /* This rule used 'opt_column_list' between 'relation_name' and 'insert_rest'
2603 * originally. When the second rule of 'insert_rest' was changed to use
2604 * the new 'SelectStmt' rule (for INTERSECT and EXCEPT) it produced a shift/red uce
2605 * conflict. So I just changed the rules 'InsertStmt' and 'insert_rest' to accept
2606 * the same statements without any shift/reduce conflicts */
2607 InsertStmt: INSERT INTO relation_name insert_rest
2609 $$ = cat3_str(make1_str("insert into"), $3, $4);
2613 insert_rest: VALUES '(' res_target_list2 ')'
2615 $$ = make3_str(make1_str("values("), $3, make1_str(")"));
2619 $$ = make1_str("default values");
2625 | '(' columnList ')' VALUES '(' res_target_list2 ')'
2627 $$ = make5_str(make1_str("("), $2, make1_str(") values ("), $6, make1_str(")"));
2629 | '(' columnList ')' SelectStmt
2631 $$ = make4_str(make1_str("("), $2, make1_str(")"), $4);
2635 opt_column_list: '(' columnList ')' { $$ = make3_str(make1_str("("), $2, make1_str(")")); }
2636 | /*EMPTY*/ { $$ = make1_str(""); }
2640 columnList ',' columnElem
2641 { $$ = cat3_str($1, make1_str(","), $3); }
2646 columnElem: ColId opt_indirection
2648 $$ = cat2_str($1, $2);
2653 /*****************************************************************************
2658 *****************************************************************************/
2660 DeleteStmt: DELETE FROM relation_name
2663 $$ = cat3_str(make1_str("delete from"), $3, $4);
2667 LockStmt: LOCK_P opt_table relation_name
2669 $$ = cat3_str(make1_str("lock"), $2, $3);
2671 | LOCK_P opt_table relation_name IN opt_lmode ROW IDENT IDENT
2673 if (strcasecmp($8, "MODE"))
2675 sprintf(errortext, "syntax error at or near \"%s\"", $8);
2680 if (strcasecmp($5, "SHARE"))
2682 sprintf(errortext, "syntax error at or near \"%s\"", $5);
2685 if (strcasecmp($7, "EXCLUSIVE"))
2687 sprintf(errortext, "syntax error at or near \"%s\"", $7);
2693 if (strcasecmp($7, "SHARE") && strcasecmp($7, "EXCLUSIVE"))
2695 sprintf(errortext, "syntax error at or near \"%s\"", $7);
2700 $$=cat4_str(cat5_str(make1_str("lock"), $2, $3, make1_str("in"), $5), make1_str("row"), $7, $8);
2702 | LOCK_P opt_table relation_name IN IDENT IDENT IDENT
2704 if (strcasecmp($7, "MODE"))
2706 sprintf(errortext, "syntax error at or near \"%s\"", $7);
2709 if (strcasecmp($5, "ACCESS"))
2711 sprintf(errortext, "syntax error at or near \"%s\"", $5);
2714 if (strcasecmp($6, "SHARE") && strcasecmp($6, "EXCLUSIVE"))
2716 sprintf(errortext, "syntax error at or near \"%s\"", $6);
2720 $$=cat3_str(cat5_str(make1_str("lock"), $2, $3, make1_str("in"), $5), $6, $7);
2722 | LOCK_P opt_table relation_name IN IDENT IDENT
2724 if (strcasecmp($6, "MODE"))
2726 sprintf(errortext, "syntax error at or near \"%s\"", $6);
2729 if (strcasecmp($5, "SHARE") && strcasecmp($5, "EXCLUSIVE"))
2731 sprintf(errortext, "syntax error at or near \"%s\"", $5);
2735 $$=cat2_str(cat5_str(make1_str("lock"), $2, $3, make1_str("in"), $5), $6);
2739 opt_lmode: IDENT { $$ = $1; }
2740 | /*EMPTY*/ { $$ = make1_str(""); }
2746 /*****************************************************************************
2749 * UpdateStmt (UPDATE)
2751 *****************************************************************************/
2753 UpdateStmt: UPDATE relation_name
2758 $$ = cat2_str(cat5_str(make1_str("update"), $2, make1_str("set"), $4, $5), $6);
2763 /*****************************************************************************
2768 *****************************************************************************/
2769 CursorStmt: DECLARE name opt_cursor CURSOR FOR SelectStmt cursor_clause
2771 struct cursor *ptr, *this;
2773 for (ptr = cur; ptr != NULL; ptr = ptr->next)
2775 if (strcmp($2, ptr->name) == 0)
2777 /* re-definition is a bug */
2778 sprintf(errortext, "cursor %s already defined", $2);
2783 this = (struct cursor *) mm_alloc(sizeof(struct cursor));
2785 /* initial definition */
2788 this->connection = connection;
2789 this->command = cat2_str(cat5_str(make1_str("declare"), mm_strdup($2), $3, make1_str("cursor for"), $6), $7);
2790 this->argsinsert = argsinsert;
2791 this->argsresult = argsresult;
2792 argsinsert = argsresult = NULL;
2796 $$ = cat3_str(make1_str("/*"), mm_strdup(this->command), make1_str("*/"));
2800 opt_cursor: BINARY { $$ = make1_str("binary"); }
2801 | INSENSITIVE { $$ = make1_str("insensitive"); }
2802 | SCROLL { $$ = make1_str("scroll"); }
2803 | INSENSITIVE SCROLL { $$ = make1_str("insensitive scroll"); }
2804 | /*EMPTY*/ { $$ = make1_str(""); }
2807 cursor_clause: FOR opt_readonly { $$ = cat2_str(make1_str("for"), $2); }
2808 | /*EMPTY*/ { $$ = make1_str(""); }
2812 opt_readonly: READ ONLY { $$ = make1_str("read only"); }
2815 yyerror("DECLARE/UPDATE not supported; Cursors must be READ ONLY.");
2819 opt_of: OF columnList { $$ = make2_str(make1_str("of"), $2); }
2821 /*****************************************************************************
2826 *****************************************************************************/
2829 /* The new 'SelectStmt' rule adapted for the optional use of INTERSECT EXCEPT a nd UNION
2830 * accepts the use of '(' and ')' to select an order of set operations.
2831 * The rule returns a SelectStmt Node having the set operations attached to
2832 * unionClause and intersectClause (NIL if no set operations were present)
2835 SelectStmt: select_clause sort_clause for_update_clause opt_select_limit
2837 if (strlen($3) > 0 && ForUpdateNotAllowed != 0)
2838 yyerror("SELECT FOR UPDATE is not allowed in this context");
2840 ForUpdateNotAllowed = 0;
2841 $$ = cat4_str($1, $2, $3, $4);
2845 /* This rule parses Select statements including UNION INTERSECT and EXCEPT.
2846 * '(' and ')' can be used to specify the order of the operations
2847 * (UNION EXCEPT INTERSECT). Without the use of '(' and ')' we want the
2848 * operations to be left associative.
2850 * The sort_clause is not handled here!
2852 select_clause: '(' select_clause ')'
2854 $$ = make3_str(make1_str("("), $2, make1_str(")"));
2860 | select_clause EXCEPT select_clause
2862 $$ = cat3_str($1, make1_str("except"), $3);
2863 ForUpdateNotAllowed = 1;
2865 | select_clause UNION opt_union select_clause
2867 $$ = cat3_str($1, make1_str("union"), $3);
2868 ForUpdateNotAllowed = 1;
2870 | select_clause INTERSECT opt_union select_clause
2872 $$ = cat3_str($1, make1_str("intersect"), $3);
2873 ForUpdateNotAllowed = 1;
2878 SubSelect: SELECT opt_unique res_target_list2
2879 result from_clause where_clause
2880 group_clause having_clause
2882 $$ = cat4_str(cat5_str(make1_str("select"), $2, $3, $4, $5), $6, $7, $8);
2883 if (strlen($7) > 0 || strlen($8) > 0)
2884 ForUpdateNotAllowed = 1;
2888 result: INTO OptTemp opt_table relation_name { $$= cat4_str(make1_str("into"), $2, $3, $4); }
2889 | INTO into_list { $$ = make1_str(""); }
2890 | /*EMPTY*/ { $$ = make1_str(""); }
2893 opt_table: TABLE { $$ = make1_str("table"); }
2894 | /*EMPTY*/ { $$ = make1_str(""); }
2897 opt_union: ALL { $$ = make1_str("all"); }
2898 | /*EMPTY*/ { $$ = make1_str(""); }
2901 opt_unique: DISTINCT { $$ = make1_str("distinct"); }
2902 | DISTINCT ON ColId { $$ = cat2_str(make1_str("distinct on"), $3); }
2903 | ALL { $$ = make1_str("all"); }
2904 | /*EMPTY*/ { $$ = make1_str(""); }
2907 sort_clause: ORDER BY sortby_list { $$ = cat2_str(make1_str("order by"), $3); }
2908 | /*EMPTY*/ { $$ = make1_str(""); }
2911 sortby_list: sortby { $$ = $1; }
2912 | sortby_list ',' sortby { $$ = cat3_str($1, make1_str(","), $3); }
2915 sortby: a_expr OptUseOp
2917 $$ = cat2_str($1, $2);
2921 OptUseOp: USING Op { $$ = cat2_str(make1_str("using"), $2); }
2922 | USING '<' { $$ = make1_str("using <"); }
2923 | USING '>' { $$ = make1_str("using >"); }
2924 | ASC { $$ = make1_str("asc"); }
2925 | DESC { $$ = make1_str("desc"); }
2926 | /*EMPTY*/ { $$ = make1_str(""); }
2929 opt_select_limit: LIMIT select_limit_value ',' select_offset_value
2930 { $$ = cat4_str(make1_str("limit"), $2, make1_str(","), $4); }
2931 | LIMIT select_limit_value OFFSET select_offset_value
2932 { $$ = cat4_str(make1_str("limit"), $2, make1_str("offset"), $4); }
2933 | LIMIT select_limit_value
2934 { $$ = cat2_str(make1_str("limit"), $2); }
2935 | OFFSET select_offset_value LIMIT select_limit_value
2936 { $$ = cat4_str(make1_str("offset"), $2, make1_str("limit"), $4); }
2937 | OFFSET select_offset_value
2938 { $$ = cat2_str(make1_str("offset"), $2); }
2940 { $$ = make1_str(""); }
2943 select_limit_value: Iconst { $$ = $1; }
2944 | ALL { $$ = make1_str("all"); }
2945 | PARAM { $$ = make_name(); }
2948 select_offset_value: Iconst { $$ = $1; }
2949 | PARAM { $$ = make_name(); }
2953 * jimmy bell-style recursive queries aren't supported in the
2956 * ...however, recursive addattr and rename supported. make special
2959 opt_inh_star: '*' { $$ = make1_str("*"); }
2960 | /*EMPTY*/ { $$ = make1_str(""); }
2963 relation_name_list: name_list { $$ = $1; };
2967 | name_list ',' name
2968 { $$ = cat3_str($1, make1_str(","), $3); }
2971 group_clause: GROUP BY expr_list { $$ = cat2_str(make1_str("groub by"), $3); }
2972 | /*EMPTY*/ { $$ = make1_str(""); }
2975 having_clause: HAVING a_expr
2977 $$ = cat2_str(make1_str("having"), $2);
2979 | /*EMPTY*/ { $$ = make1_str(""); }
2982 for_update_clause: FOR UPDATE update_list
2984 $$ = make1_str("for update");
2991 update_list: OF va_list
2993 $$ = cat2_str(make1_str("of"), $2);
3001 /*****************************************************************************
3003 * clauses common to all Optimizable Stmts:
3007 *****************************************************************************/
3009 from_clause: FROM from_expr
3011 $$ = cat2_str(make1_str("from"), $2);
3019 from_expr: '(' join_clause_with_union ')'
3020 { $$ = make3_str(make1_str("("), $2, make1_str(")")); }
3027 table_list: table_list ',' table_expr
3028 { $$ = make3_str($1, make1_str(","), $3); }
3033 table_expr: relation_expr AS ColLabel
3035 $$ = cat3_str($1, make1_str("as"), $3);
3037 | relation_expr ColId
3039 $$ = cat2_str($1, $2);
3047 /* A UNION JOIN is the same as a FULL OUTER JOIN which *omits*
3048 * all result rows which would have matched on an INNER JOIN.
3049 * Let's reject this for now. - thomas 1999-01-08
3051 join_clause_with_union: join_clause
3053 | table_expr UNION JOIN table_expr
3054 { yyerror("UNION JOIN not yet implemented"); }
3057 join_clause: table_expr join_list
3059 $$ = cat2_str($1, $2);
3063 join_list: join_list join_expr
3065 $$ = cat2_str($1, $2);
3073 /* This is everything but the left side of a join.
3074 * Note that a CROSS JOIN is the same as an unqualified
3075 * inner join, so just pass back the right-side table.
3076 * A NATURAL JOIN implicitly matches column names between
3077 * tables, so we'll collect those during the later transformation.
3080 join_expr: join_type JOIN table_expr join_qual
3082 $$ = cat4_str($1, make1_str("join"), $3, $4);
3084 | NATURAL join_type JOIN table_expr
3086 $$ = cat4_str(make1_str("natural"), $2, make1_str("join"), $4);
3088 | CROSS JOIN table_expr
3089 { $$ = cat2_str(make1_str("cross join"), $3); }
3092 /* OUTER is just noise... */
3093 join_type: FULL join_outer
3095 $$ = cat2_str(make1_str("full"), $2);
3096 fprintf(stderr,"FULL OUTER JOIN not yet implemented\n");
3100 $$ = cat2_str(make1_str("left"), $2);
3101 fprintf(stderr,"LEFT OUTER JOIN not yet implemented\n");
3105 $$ = cat2_str(make1_str("right"), $2);
3106 fprintf(stderr,"RIGHT OUTER JOIN not yet implemented\n");
3110 $$ = make1_str("outer");
3111 fprintf(stderr,"OUTER JOIN not yet implemented\n");
3115 $$ = make1_str("inner");
3123 join_outer: OUTER_P { $$ = make1_str("outer"); }
3124 | /*EMPTY*/ { $$ = make1_str(""); /* no qualifiers */ }
3127 /* JOIN qualification clauses
3128 * Possibilities are:
3129 * USING ( column list ) allows only unqualified column names,
3130 * which must match between tables.
3131 * ON expr allows more general qualifications.
3132 * - thomas 1999-01-07
3135 join_qual: USING '(' using_list ')' { $$ = make3_str(make1_str("using ("), $3, make1_str(")")); }
3136 | ON a_expr { $$ = cat2_str(make1_str("on"), $2); }
3139 using_list: using_list ',' using_expr { $$ = make3_str($1, make1_str(","), $3); }
3140 | using_expr { $$ = $1; }
3149 where_clause: WHERE a_expr { $$ = cat2_str(make1_str("where"), $2); }
3150 | /*EMPTY*/ { $$ = make1_str(""); /* no qualifiers */ }
3153 relation_expr: relation_name
3155 /* normal relations */
3158 | relation_name '*' %prec '='
3160 /* inheritance query */
3161 $$ = cat2_str($1, make1_str("*"));
3164 opt_array_bounds: '[' ']' nest_array_bounds
3167 $$.index2 = $3.index1;
3168 $$.str = cat2_str(make1_str("[]"), $3.str);
3170 | '[' Iconst ']' nest_array_bounds
3172 $$.index1 = atol($2);
3173 $$.index2 = $4.index1;
3174 $$.str = cat4_str(make1_str("["), $2, make1_str("]"), $4.str);
3180 $$.str= make1_str("");
3184 nest_array_bounds: '[' ']' nest_array_bounds
3187 $$.index2 = $3.index1;
3188 $$.str = cat2_str(make1_str("[]"), $3.str);
3190 | '[' Iconst ']' nest_array_bounds
3192 $$.index1 = atol($2);
3193 $$.index2 = $4.index1;
3194 $$.str = cat4_str(make1_str("["), $2, make1_str("]"), $4.str);
3200 $$.str= make1_str("");
3204 /*****************************************************************************
3207 * SQL92 introduces a large amount of type-specific syntax.
3208 * Define individual clauses to handle these cases, and use
3209 * the generic case to handle regular type-extensible Postgres syntax.
3210 * - thomas 1997-10-10
3212 *****************************************************************************/
3214 Typename: Array opt_array_bounds
3216 $$ = cat2_str($1, $2.str);
3218 | Character { $$ = $1; }
3221 $$ = cat2_str(make1_str("setof"), $2);
3226 | Datetime { $$ = $1; }
3227 | Numeric { $$ = $1; }
3236 generic: ident { $$ = $1; }
3237 | TYPE_P { $$ = make1_str("type"); }
3238 | SQL_AT { $$ = make1_str("at"); }
3239 | SQL_BOOL { $$ = make1_str("bool"); }
3240 | SQL_BREAK { $$ = make1_str("break"); }
3241 | SQL_CALL { $$ = make1_str("call"); }
3242 | SQL_CONNECT { $$ = make1_str("connect"); }
3243 | SQL_CONNECTION { $$ = make1_str("connection"); }
3244 | SQL_CONTINUE { $$ = make1_str("continue"); }
3245 | SQL_DEALLOCATE { $$ = make1_str("deallocate"); }
3246 | SQL_DISCONNECT { $$ = make1_str("disconnect"); }
3247 | SQL_FOUND { $$ = make1_str("found"); }
3248 | SQL_GO { $$ = make1_str("go"); }
3249 | SQL_GOTO { $$ = make1_str("goto"); }
3250 | SQL_IDENTIFIED { $$ = make1_str("identified"); }
3251 | SQL_IMMEDIATE { $$ = make1_str("immediate"); }
3252 | SQL_INDICATOR { $$ = make1_str("indicator"); }
3253 | SQL_INT { $$ = make1_str("int"); }
3254 | SQL_LONG { $$ = make1_str("long"); }
3255 | SQL_OPEN { $$ = make1_str("open"); }
3256 | SQL_PREPARE { $$ = make1_str("prepare"); }
3257 | SQL_RELEASE { $$ = make1_str("release"); }
3258 | SQL_SECTION { $$ = make1_str("section"); }
3259 | SQL_SHORT { $$ = make1_str("short"); }
3260 | SQL_SIGNED { $$ = make1_str("signed"); }
3261 | SQL_SQLERROR { $$ = make1_str("sqlerror"); }
3262 | SQL_SQLPRINT { $$ = make1_str("sqlprint"); }
3263 | SQL_SQLWARNING { $$ = make1_str("sqlwarning"); }
3264 | SQL_STOP { $$ = make1_str("stop"); }
3265 | SQL_STRUCT { $$ = make1_str("struct"); }
3266 | SQL_UNSIGNED { $$ = make1_str("unsigned"); }
3267 | SQL_VAR { $$ = make1_str("var"); }
3268 | SQL_WHENEVER { $$ = make1_str("whenever"); }
3271 /* SQL92 numeric data types
3272 * Check FLOAT() precision limits assuming IEEE floating types.
3273 * Provide real DECIMAL() and NUMERIC() implementations now - Jan 1998-12-30
3274 * - thomas 1997-09-18
3276 Numeric: FLOAT opt_float
3278 $$ = cat2_str(make1_str("float"), $2);
3282 $$ = make1_str("double precision");
3284 | DECIMAL opt_decimal
3286 $$ = cat2_str(make1_str("decimal"), $2);
3288 | NUMERIC opt_numeric
3290 $$ = cat2_str(make1_str("numeric"), $2);
3295 { $$ = make1_str("float"); }
3297 { $$ = make1_str("double precision"); }
3299 { $$ = make1_str("decimal"); }
3301 { $$ = make1_str("numeric"); }
3304 opt_float: '(' Iconst ')'
3307 yyerror("precision for FLOAT must be at least 1");
3308 else if (atol($2) >= 16)
3309 yyerror("precision for FLOAT must be less than 16");
3310 $$ = make3_str(make1_str("("), $2, make1_str(")"));
3318 opt_numeric: '(' Iconst ',' Iconst ')'
3320 if (atol($2) < 1 || atol($2) > NUMERIC_MAX_PRECISION) {
3321 sprintf(errortext, "NUMERIC precision %s must be between 1 and %d", $2, NUMERIC_MAX_PRECISION);
3324 if (atol($4) < 0 || atol($4) > atol($2)) {
3325 sprintf(errortext, "NUMERIC scale %s must be between 0 and precision %s", $4, $2);
3328 $$ = cat3_str(make2_str(make1_str("("), $2), make1_str(","), make2_str($4, make1_str(")")));
3332 if (atol($2) < 1 || atol($2) > NUMERIC_MAX_PRECISION) {
3333 sprintf(errortext, "NUMERIC precision %s must be between 1 and %d", $2, NUMERIC_MAX_PRECISION);
3336 $$ = make3_str(make1_str("("), $2, make1_str(")"));
3344 opt_decimal: '(' Iconst ',' Iconst ')'
3346 if (atol($2) < 1 || atol($2) > NUMERIC_MAX_PRECISION) {
3347 sprintf(errortext, "NUMERIC precision %s must be between 1 and %d", $2, NUMERIC_MAX_PRECISION);
3350 if (atol($4) < 0 || atol($4) > atol($2)) {
3351 sprintf(errortext, "NUMERIC scale %s must be between 0 and precision %s", $4, $2);
3354 $$ = cat3_str(make2_str(make1_str("("), $2), make1_str(","), make2_str($4, make1_str(")")));
3358 if (atol($2) < 1 || atol($2) > NUMERIC_MAX_PRECISION) {
3359 sprintf(errortext, "NUMERIC precision %s must be between 1 and %d", $2, NUMERIC_MAX_PRECISION);
3362 $$ = make3_str(make1_str("("), $2, make1_str(")"));
3370 /* SQL92 character data types
3371 * The following implements CHAR() and VARCHAR().
3372 * We do it here instead of the 'Generic' production
3373 * because we don't want to allow arrays of VARCHAR().
3374 * I haven't thought about whether that will work or not.
3377 Character: character '(' Iconst ')'
3379 if (strncasecmp($1, "char", strlen("char")) && strncasecmp($1, "varchar", strlen("varchar")))
3380 yyerror("internal parsing error; unrecognized character type");
3382 sprintf(errortext, "length for '%s' type must be at least 1",$1);
3385 else if (atol($3) > 4096) {
3386 /* we can store a char() of length up to the size
3387 * of a page (8KB) - page headers and friends but
3388 * just to be safe here... - ay 6/95
3389 * XXX note this hardcoded limit - thomas 1997-07-13
3391 sprintf(errortext, "length for type '%s' cannot exceed 4096",$1);
3395 $$ = cat2_str($1, make3_str(make1_str("("), $3, make1_str(")")));
3403 character: CHARACTER opt_varying opt_charset opt_collate
3406 fprintf(stderr, "COLLATE %s not yet implemented",$4);
3408 $$ = cat4_str(make1_str("character"), $2, $3, $4);
3410 | CHAR opt_varying { $$ = cat2_str(make1_str("char"), $2); }
3411 | VARCHAR { $$ = make1_str("varchar"); }
3412 | NATIONAL CHARACTER opt_varying { $$ = cat2_str(make1_str("national character"), $3); }
3413 | NCHAR opt_varying { $$ = cat2_str(make1_str("nchar"), $2); }
3416 opt_varying: VARYING { $$ = make1_str("varying"); }
3417 | /*EMPTY*/ { $$ = make1_str(""); }
3420 opt_charset: CHARACTER SET ColId { $$ = cat2_str(make1_str("character set"), $3); }
3421 | /*EMPTY*/ { $$ = make1_str(""); }
3424 opt_collate: COLLATE ColId { $$ = cat2_str(make1_str("collate"), $2); }
3425 | /*EMPTY*/ { $$ = make1_str(""); }
3432 | TIMESTAMP opt_timezone
3434 $$ = cat2_str(make1_str("timestamp"), $2);
3438 $$ = make1_str("time");
3440 | INTERVAL opt_interval
3442 $$ = cat2_str(make1_str("interval"), $2);
3446 datetime: YEAR_P { $$ = make1_str("year"); }
3447 | MONTH_P { $$ = make1_str("month"); }
3448 | DAY_P { $$ = make1_str("day"); }
3449 | HOUR_P { $$ = make1_str("hour"); }
3450 | MINUTE_P { $$ = make1_str("minute"); }
3451 | SECOND_P { $$ = make1_str("second"); }
3454 opt_timezone: WITH TIME ZONE { $$ = make1_str("with time zone"); }
3455 | /*EMPTY*/ { $$ = make1_str(""); }
3458 opt_interval: datetime { $$ = $1; }
3459 | YEAR_P TO MONTH_P { $$ = make1_str("year to #month"); }
3460 | DAY_P TO HOUR_P { $$ = make1_str("day to hour"); }
3461 | DAY_P TO MINUTE_P { $$ = make1_str("day to minute"); }
3462 | DAY_P TO SECOND_P { $$ = make1_str("day to second"); }
3463 | HOUR_P TO MINUTE_P { $$ = make1_str("hour to minute"); }
3464 | MINUTE_P TO SECOND_P { $$ = make1_str("minute to second"); }
3465 | HOUR_P TO SECOND_P { $$ = make1_str("hour to second"); }
3466 | /*EMPTY*/ { $$ = make1_str(""); }
3470 /*****************************************************************************
3472 * expression grammar, still needs some cleanup
3474 *****************************************************************************/
3476 a_expr_or_null: a_expr
3480 $$ = make1_str("null");
3484 /* Expressions using row descriptors
3485 * Define row_descriptor to allow yacc to break the reduce/reduce conflict
3486 * with singleton expressions.
3487 * Eliminated lots of code by defining row_op and sub_type clauses.
3488 * However, can not consolidate EXPR_LINK case with others subselects
3489 * due to shift/reduce conflict with the non-subselect clause (the parser
3490 * would have to look ahead more than one token to resolve the conflict).
3491 * - thomas 1998-05-09
3493 row_expr: '(' row_descriptor ')' IN '(' SubSelect ')'
3495 $$ = make5_str(make1_str("("), $2, make1_str(") in ("), $6, make1_str(")"));
3497 | '(' row_descriptor ')' NOT IN '(' SubSelect ')'
3499 $$ = make5_str(make1_str("("), $2, make1_str(") not in ("), $7, make1_str(")"));
3501 | '(' row_descriptor ')' row_op sub_type '(' SubSelect ')'
3503 $$ = make4_str(make5_str(make1_str("("), $2, make1_str(")"), $4, $5), make1_str("("), $7, make1_str(")"));
3505 | '(' row_descriptor ')' row_op '(' SubSelect ')'
3507 $$ = make3_str(make5_str(make1_str("("), $2, make1_str(")"), $4, make1_str("(")), $6, make1_str(")"));
3509 | '(' row_descriptor ')' row_op '(' row_descriptor ')'
3511 $$ = cat3_str(make3_str(make1_str("("), $2, make1_str(")")), $4, make3_str(make1_str("("), $6, make1_str(")")));
3515 row_descriptor: row_list ',' a_expr
3517 $$ = cat3_str($1, make1_str(","), $3);
3521 row_op: Op { $$ = $1; }
3531 sub_type: ANY { $$ = make1_str("ANY"); }
3532 | ALL { $$ = make1_str("ALL"); }
3536 row_list: row_list ',' a_expr
3538 $$ = cat3_str($1, make1_str(","), $3);
3546 /* General expressions
3547 * This is the heart of the expression syntax.
3548 * Note that the BETWEEN clause looks similar to a boolean expression
3549 * and so we must define b_expr which is almost the same as a_expr
3550 * but without the boolean expressions.
3551 * All operations/expressions are allowed in a BETWEEN clause
3552 * if surrounded by parens.
3555 a_expr: attr opt_indirection
3557 $$ = cat2_str($1, $2);
3567 | '-' a_expr %prec UMINUS
3568 { $$ = cat2_str(make1_str("-"), $2); }
3570 { $$ = cat3_str($1, make1_str("+"), $3); }
3572 { $$ = cat3_str($1, make1_str("-"), $3); }
3574 { $$ = cat3_str($1, make1_str("/"), $3); }
3576 { $$ = cat3_str($1, make1_str("*"), $3); }
3578 { $$ = cat3_str($1, make1_str("<"), $3); }
3580 { $$ = cat3_str($1, make1_str(">"), $3); }
3582 { $$ = cat3_str($1, make1_str("="), $3); }
3583 /* not possible in embedded sql | ':' a_expr
3584 { $$ = cat2_str(make1_str(":"), $2); }
3587 { $$ = cat2_str(make1_str(";"), $2); }
3589 { $$ = cat2_str(make1_str("|"), $2); }
3590 | a_expr TYPECAST Typename
3592 $$ = cat3_str($1, make1_str("::"), $3);
3594 | CAST '(' a_expr AS Typename ')'
3596 $$ = cat3_str(make2_str(make1_str("cast("), $3), make1_str("as"), make2_str($5, make1_str(")")));
3598 | '(' a_expr_or_null ')'
3599 { $$ = make3_str(make1_str("("), $2, make1_str(")")); }
3601 { $$ = cat3_str($1, $2, $3); }
3602 | a_expr LIKE a_expr
3603 { $$ = cat3_str($1, make1_str("like"), $3); }
3604 | a_expr NOT LIKE a_expr
3605 { $$ = cat3_str($1, make1_str("not like"), $4); }
3607 { $$ = cat2_str($1, $2); }
3609 { $$ = cat2_str($1, $2); }
3610 | func_name '(' '*' ')'
3612 $$ = cat2_str($1, make1_str("(*)"));
3616 $$ = cat2_str($1, make1_str("()"));
3618 | func_name '(' expr_list ')'
3620 $$ = make4_str($1, make1_str("("), $3, make1_str(")"));
3624 $$ = make1_str("current_date");
3628 $$ = make1_str("current_time");
3630 | CURRENT_TIME '(' Iconst ')'
3633 fprintf(stderr,"CURRENT_TIME(%s) precision not implemented; zero used instead", $3);
3634 $$ = make1_str("current_time");
3638 $$ = make1_str("current_timestamp");
3640 | CURRENT_TIMESTAMP '(' Iconst ')'
3643 fprintf(stderr,"CURRENT_TIMESTAMP(%s) precision not implemented; zero used instead",$3);
3644 $$ = make1_str("current_timestamp");
3648 $$ = make1_str("current_user");
3652 $$ = make1_str("user");
3655 | EXISTS '(' SubSelect ')'
3657 $$ = make3_str(make1_str("exists("), $3, make1_str(")"));
3659 | EXTRACT '(' extract_list ')'
3661 $$ = make3_str(make1_str("extract("), $3, make1_str(")"));
3663 | POSITION '(' position_list ')'
3665 $$ = make3_str(make1_str("position("), $3, make1_str(")"));
3667 | SUBSTRING '(' substr_list ')'
3669 $$ = make3_str(make1_str("substring("), $3, make1_str(")"));
3671 /* various trim expressions are defined in SQL92 - thomas 1997-07-19 */
3672 | TRIM '(' BOTH trim_list ')'
3674 $$ = make3_str(make1_str("trim(both"), $4, make1_str(")"));
3676 | TRIM '(' LEADING trim_list ')'
3678 $$ = make3_str(make1_str("trim(leading"), $4, make1_str(")"));
3680 | TRIM '(' TRAILING trim_list ')'
3682 $$ = make3_str(make1_str("trim(trailing"), $4, make1_str(")"));
3684 | TRIM '(' trim_list ')'
3686 $$ = make3_str(make1_str("trim("), $3, make1_str(")"));
3689 { $$ = cat2_str($1, make1_str("isnull")); }
3691 { $$ = cat2_str($1, make1_str("is null")); }
3693 { $$ = cat2_str($1, make1_str("notnull")); }
3694 | a_expr IS NOT NULL_P
3695 { $$ = cat2_str($1, make1_str("is not null")); }
3696 /* IS TRUE, IS FALSE, etc used to be function calls
3697 * but let's make them expressions to allow the optimizer
3698 * a chance to eliminate them if a_expr is a constant string.
3699 * - thomas 1997-12-22
3703 { $$ = cat2_str($1, make1_str("is true")); }
3705 | a_expr IS NOT FALSE_P
3707 { $$ = cat2_str($1, make1_str("is not false")); }
3711 { $$ = cat2_str($1, make1_str("is false")); }
3713 | a_expr IS NOT TRUE_P
3715 { $$ = cat2_str($1, make1_str("is not true")); }
3717 | a_expr BETWEEN b_expr AND b_expr
3719 $$ = cat5_str($1, make1_str("between"), $3, make1_str("and"), $5);
3721 | a_expr NOT BETWEEN b_expr AND b_expr
3723 $$ = cat5_str($1, make1_str("not between"), $4, make1_str("and"), $6);
3725 | a_expr IN '(' in_expr ')'
3727 $$ = make4_str($1, make1_str(" in ("), $4, make1_str(")"));
3729 | a_expr NOT IN '(' not_in_expr ')'
3731 $$ = make4_str($1, make1_str(" not in ("), $5, make1_str(")"));
3733 | a_expr Op '(' SubSelect ')'
3735 $$ = cat3_str($1, $2, make3_str(make1_str("("), $4, make1_str(")")));
3737 | a_expr '+' '(' SubSelect ')'
3739 $$ = make4_str($1, make1_str("+("), $4, make1_str(")"));
3741 | a_expr '-' '(' SubSelect ')'
3743 $$ = make4_str($1, make1_str("-("), $4, make1_str(")"));
3745 | a_expr '/' '(' SubSelect ')'
3747 $$ = make4_str($1, make1_str("/("), $4, make1_str(")"));
3749 | a_expr '*' '(' SubSelect ')'
3751 $$ = make4_str($1, make1_str("*("), $4, make1_str(")"));
3753 | a_expr '<' '(' SubSelect ')'
3755 $$ = make4_str($1, make1_str("<("), $4, make1_str(")"));
3757 | a_expr '>' '(' SubSelect ')'
3759 $$ = make4_str($1, make1_str(">("), $4, make1_str(")"));
3761 | a_expr '=' '(' SubSelect ')'
3763 $$ = make4_str($1, make1_str("=("), $4, make1_str(")"));
3765 | a_expr Op ANY '(' SubSelect ')'
3767 $$ = cat3_str($1, $2, make3_str(make1_str("any("), $5, make1_str(")")));
3769 | a_expr '+' ANY '(' SubSelect ')'
3771 $$ = make4_str($1, make1_str("+any("), $5, make1_str(")"));
3773 | a_expr '-' ANY '(' SubSelect ')'
3775 $$ = make4_str($1, make1_str("-any("), $5, make1_str(")"));
3777 | a_expr '/' ANY '(' SubSelect ')'
3779 $$ = make4_str($1, make1_str("/any("), $5, make1_str(")"));
3781 | a_expr '*' ANY '(' SubSelect ')'
3783 $$ = make4_str($1, make1_str("*any("), $5, make1_str(")"));
3785 | a_expr '<' ANY '(' SubSelect ')'
3787 $$ = make4_str($1, make1_str("<any("), $5, make1_str(")"));
3789 | a_expr '>' ANY '(' SubSelect ')'
3791 $$ = make4_str($1, make1_str(">any("), $5, make1_str(")"));
3793 | a_expr '=' ANY '(' SubSelect ')'
3795 $$ = make4_str($1, make1_str("=any("), $5, make1_str(")"));
3797 | a_expr Op ALL '(' SubSelect ')'
3799 $$ = cat3_str($1, $2, make3_str(make1_str("all ("), $5, make1_str(")")));
3801 | a_expr '+' ALL '(' SubSelect ')'
3803 $$ = make4_str($1, make1_str("+all("), $5, make1_str(")"));
3805 | a_expr '-' ALL '(' SubSelect ')'
3807 $$ = make4_str($1, make1_str("-all("), $5, make1_str(")"));
3809 | a_expr '/' ALL '(' SubSelect ')'
3811 $$ = make4_str($1, make1_str("/all("), $5, make1_str(")"));
3813 | a_expr '*' ALL '(' SubSelect ')'
3815 $$ = make4_str($1, make1_str("*all("), $5, make1_str(")"));
3817 | a_expr '<' ALL '(' SubSelect ')'
3819 $$ = make4_str($1, make1_str("<all("), $5, make1_str(")"));
3821 | a_expr '>' ALL '(' SubSelect ')'
3823 $$ = make4_str($1, make1_str(">all("), $5, make1_str(")"));
3825 | a_expr '=' ALL '(' SubSelect ')'
3827 $$ = make4_str($1, make1_str("=all("), $5, make1_str(")"));
3830 { $$ = cat3_str($1, make1_str("and"), $3); }
3832 { $$ = cat3_str($1, make1_str("or"), $3); }
3834 { $$ = cat2_str(make1_str("not"), $2); }
3838 { $$ = make1_str("?"); }
3841 /* Restricted expressions
3842 * b_expr is a subset of the complete expression syntax
3843 * defined by a_expr. b_expr is used in BETWEEN clauses
3844 * to eliminate parser ambiguities stemming from the AND keyword.
3846 b_expr: attr opt_indirection
3848 $$ = cat2_str($1, $2);
3856 | '-' b_expr %prec UMINUS
3857 { $$ = cat2_str(make1_str("-"), $2); }
3859 { $$ = cat3_str($1, make1_str("+"), $3); }
3861 { $$ = cat3_str($1, make1_str("-"), $3); }
3863 { $$ = cat3_str($1, make1_str("/"), $3); }
3865 { $$ = cat3_str($1, make1_str("*"), $3); }
3866 /* not possible in embedded sql | ':' b_expr
3867 { $$ = cat2_str(make1_str(":"), $2); }
3870 { $$ = cat2_str(make1_str(";"), $2); }
3872 { $$ = cat2_str(make1_str("|"), $2); }
3873 | b_expr TYPECAST Typename
3875 $$ = cat3_str($1, make1_str("::"), $3);
3877 | CAST '(' b_expr AS Typename ')'
3879 $$ = cat3_str(make2_str(make1_str("cast("), $3), make1_str("as"), make2_str($5, make1_str(")")));
3882 { $$ = make3_str(make1_str("("), $2, make1_str(")")); }
3884 { $$ = cat3_str($1, $2, $3); }
3886 { $$ = cat2_str($1, $2); }
3888 { $$ = cat2_str($1, $2); }
3891 $$ = cat2_str($1, make1_str("()"));
3893 | func_name '(' expr_list ')'
3895 $$ = make4_str($1, make1_str("("), $3, make1_str(")"));
3899 $$ = make1_str("current_date");
3903 $$ = make1_str("current_time");
3905 | CURRENT_TIME '(' Iconst ')'
3908 fprintf(stderr,"CURRENT_TIME(%s) precision not implemented; zero used instead", $3);
3909 $$ = make1_str("current_time");
3913 $$ = make1_str("current_timestamp");
3915 | CURRENT_TIMESTAMP '(' Iconst ')'
3918 fprintf(stderr,"CURRENT_TIMESTAMP(%s) precision not implemented; zero used instead",$3);
3919 $$ = make1_str("current_timestamp");
3923 $$ = make1_str("current_user");
3927 $$ = make1_str("user");
3929 | POSITION '(' position_list ')'
3931 $$ = make3_str(make1_str("position ("), $3, make1_str(")"));
3933 | SUBSTRING '(' substr_list ')'
3935 $$ = make3_str(make1_str("substring ("), $3, make1_str(")"));
3937 /* various trim expressions are defined in SQL92 - thomas 1997-07-19 */
3938 | TRIM '(' BOTH trim_list ')'
3940 $$ = make3_str(make1_str("trim(both"), $4, make1_str(")"));
3942 | TRIM '(' LEADING trim_list ')'
3944 $$ = make3_str(make1_str("trim(leading"), $4, make1_str(")"));
3946 | TRIM '(' TRAILING trim_list ')'
3948 $$ = make3_str(make1_str("trim(trailing"), $4, make1_str(")"));
3950 | TRIM '(' trim_list ')'
3952 $$ = make3_str(make1_str("trim("), $3, make1_str(")"));
3958 opt_indirection: '[' ecpg_expr ']' opt_indirection
3960 $$ = cat4_str(make1_str("["), $2, make1_str("]"), $4);
3962 | '[' ecpg_expr ':' ecpg_expr ']' opt_indirection
3964 $$ = cat2_str(cat5_str(make1_str("["), $2, make1_str(":"), $4, make1_str("]")), $6);
3967 { $$ = make1_str(""); }
3970 expr_list: a_expr_or_null
3972 | expr_list ',' a_expr_or_null
3973 { $$ = cat3_str($1, make1_str(","), $3); }
3974 | expr_list USING a_expr
3975 { $$ = cat3_str($1, make1_str("using"), $3); }
3978 extract_list: extract_arg FROM a_expr
3980 $$ = cat3_str($1, make1_str("from"), $3);
3983 { $$ = make1_str(""); }
3985 { $$ = make1_str("?"); }
3988 extract_arg: datetime { $$ = $1; }
3989 | TIMEZONE_HOUR { $$ = make1_str("timezone_hour"); }
3990 | TIMEZONE_MINUTE { $$ = make1_str("timezone_minute"); }
3993 position_list: position_expr IN position_expr
3994 { $$ = cat3_str($1, make1_str("in"), $3); }
3996 { $$ = make1_str(""); }
3999 position_expr: attr opt_indirection
4001 $$ = cat2_str($1, $2);
4005 | '-' position_expr %prec UMINUS
4006 { $$ = cat2_str(make1_str("-"), $2); }
4007 | position_expr '+' position_expr
4008 { $$ = cat3_str($1, make1_str("+"), $3); }
4009 | position_expr '-' position_expr
4010 { $$ = cat3_str($1, make1_str("-"), $3); }
4011 | position_expr '/' position_expr
4012 { $$ = cat3_str($1, make1_str("/"), $3); }
4013 | position_expr '*' position_expr
4014 { $$ = cat3_str($1, make1_str("*"), $3); }
4016 { $$ = cat2_str(make1_str("|"), $2); }
4017 | position_expr TYPECAST Typename
4019 $$ = cat3_str($1, make1_str("::"), $3);
4021 | CAST '(' position_expr AS Typename ')'
4023 $$ = cat3_str(make2_str(make1_str("cast("), $3), make1_str("as"), make2_str($5, make1_str(")")));
4025 | '(' position_expr ')'
4026 { $$ = make3_str(make1_str("("), $2, make1_str(")")); }
4027 | position_expr Op position_expr
4028 { $$ = cat3_str($1, $2, $3); }
4030 { $$ = cat2_str($1, $2); }
4032 { $$ = cat2_str($1, $2); }
4039 $$ = cat2_str($1, make1_str("()"));
4041 | func_name '(' expr_list ')'
4043 $$ = make4_str($1, make1_str("("), $3, make1_str(")"));
4045 | POSITION '(' position_list ')'
4047 $$ = make3_str(make1_str("position("), $3, make1_str(")"));
4049 | SUBSTRING '(' substr_list ')'
4051 $$ = make3_str(make1_str("substring("), $3, make1_str(")"));
4053 /* various trim expressions are defined in SQL92 - thomas 1997-07-19 */
4054 | TRIM '(' BOTH trim_list ')'
4056 $$ = make3_str(make1_str("trim(both"), $4, make1_str(")"));
4058 | TRIM '(' LEADING trim_list ')'
4060 $$ = make3_str(make1_str("trim(leading"), $4, make1_str(")"));
4062 | TRIM '(' TRAILING trim_list ')'
4064 $$ = make3_str(make1_str("trim(trailing"), $4, make1_str(")"));
4066 | TRIM '(' trim_list ')'
4068 $$ = make3_str(make1_str("trim("), $3, make1_str(")"));
4072 substr_list: expr_list substr_from substr_for
4074 $$ = cat3_str($1, $2, $3);
4077 { $$ = make1_str(""); }
4080 substr_from: FROM expr_list
4081 { $$ = cat2_str(make1_str("from"), $2); }
4088 substr_for: FOR expr_list
4089 { $$ = cat2_str(make1_str("for"), $2); }
4091 { $$ = make1_str(""); }
4094 trim_list: a_expr FROM expr_list
4095 { $$ = cat3_str($1, make1_str("from"), $3); }
4097 { $$ = cat2_str(make1_str("from"), $2); }
4110 in_expr_nodes: AexprConst
4112 | in_expr_nodes ',' AexprConst
4113 { $$ = cat3_str($1, make1_str(","), $3);}
4116 not_in_expr: SubSelect
4124 not_in_expr_nodes: AexprConst
4126 | not_in_expr_nodes ',' AexprConst
4127 { $$ = cat3_str($1, make1_str(","), $3);}
4131 * Define SQL92-style case clause.
4132 * Allow all four forms described in the standard:
4133 * - Full specification
4134 * CASE WHEN a = b THEN c ... ELSE d END
4135 * - Implicit argument
4136 * CASE a WHEN b THEN c ... ELSE d END
4137 * - Conditional NULL
4139 * same as CASE WHEN x = y THEN NULL ELSE x END
4140 * - Conditional substitution from list, use first non-null argument
4142 * same as CASE WHEN a IS NOT NULL THEN a WHEN b IS NOT NULL THEN b ... END
4143 * - thomas 1998-11-09
4145 case_expr: CASE case_arg when_clause_list case_default END_TRANS
4146 { $$ = cat5_str(make1_str("case"), $2, $3, $4, make1_str("end")); }
4147 | NULLIF '(' a_expr ',' a_expr ')'
4149 $$ = cat5_str(make1_str("nullif("), $3, make1_str(","), $5, make1_str(")"));
4151 fprintf(stderr, "NULLIF() not yet fully implemented");
4153 | COALESCE '(' expr_list ')'
4155 $$ = cat3_str(make1_str("coalesce("), $3, make1_str(")"));
4159 when_clause_list: when_clause_list when_clause
4160 { $$ = cat2_str($1, $2); }
4165 when_clause: WHEN a_expr THEN a_expr_or_null
4167 $$ = cat4_str(make1_str("when"), $2, make1_str("then"), $4);
4171 case_default: ELSE a_expr_or_null { $$ = cat2_str(make1_str("else"), $2); }
4172 | /*EMPTY*/ { $$ = make1_str(""); }
4175 case_arg: attr opt_indirection
4177 $$ = cat2_str($1, $2);
4184 { $$ = make1_str(""); }
4187 attr: relation_name '.' attrs
4189 $$ = make3_str($1, make1_str("."), $3);
4193 $$ = make3_str($1, make1_str("."), $3);
4199 | attrs '.' attr_name
4200 { $$ = make3_str($1, make1_str("."), $3); }
4202 { $$ = make2_str($1, make1_str(".*")); }
4206 /*****************************************************************************
4210 *****************************************************************************/
4212 res_target_list: res_target_list ',' res_target_el
4213 { $$ = cat3_str($1, make1_str(","),$3); }
4216 | '*' { $$ = make1_str("*"); }
4219 res_target_el: ColId opt_indirection '=' a_expr_or_null
4221 $$ = cat4_str($1, $2, make1_str("="), $4);
4223 | attr opt_indirection
4225 $$ = cat2_str($1, $2);
4227 | relation_name '.' '*'
4229 $$ = make2_str($1, make1_str(".*"));
4234 ** target list for select.
4235 ** should get rid of the other but is still needed by the defunct select into
4236 ** and update (uses a subset)
4238 res_target_list2: res_target_list2 ',' res_target_el2
4239 { $$ = cat3_str($1, make1_str(","), $3); }
4244 /* AS is not optional because shift/red conflict with unary ops */
4245 res_target_el2: a_expr_or_null AS ColLabel
4247 $$ = cat3_str($1, make1_str("as"), $3);
4253 | relation_name '.' '*'
4255 $$ = make2_str($1, make1_str(".*"));
4259 $$ = make1_str("*");
4263 opt_id: ColId { $$ = $1; }
4264 | /* EMPTY */ { $$ = make1_str(""); }
4267 relation_name: SpecialRuleRelation
4273 /* disallow refs to variable system tables */
4274 if (strcmp(LogRelationName, $1) == 0
4275 || strcmp(VariableRelationName, $1) == 0) {
4276 sprintf(errortext, make1_str("%s cannot be accessed by users"),$1);
4284 database_name: ColId { $$ = $1; };
4285 access_method: ident { $$ = $1; };
4286 attr_name: ColId { $$ = $1; };
4287 class: ident { $$ = $1; };
4288 index_name: ColId { $$ = $1; };
4291 * Include date/time keywords as SQL92 extension.
4292 * Include TYPE as a SQL92 unreserved keyword. - thomas 1997-10-05
4294 name: ColId { $$ = $1; };
4295 func_name: ColId { $$ = $1; };
4297 file_name: Sconst { $$ = $1; };
4298 recipe_name: ident { $$ = $1; };
4301 * Include TRUE/FALSE for SQL3 support. - thomas 1997-10-24
4317 $$ = cat2_str($1, $2);
4323 $$ = make1_str("true");
4327 $$ = make1_str("false");
4331 ParamNo: PARAM opt_indirection
4333 $$ = cat2_str(make_name(), $2);
4337 Iconst: ICONST { $$ = make_name();};
4338 Fconst: FCONST { $$ = make_name();};
4340 $$ = (char *)mm_alloc(strlen($1) + 3);
4343 $$[strlen($1)+2]='\0';
4344 $$[strlen($1)+1]='\'';
4347 UserId: ident { $$ = $1;};
4349 /* Column and type identifier
4350 * Does not include explicit datetime types
4351 * since these must be decoupled in Typename syntax.
4352 * Use ColId for most identifiers. - thomas 1997-10-21
4361 /* Column identifier
4362 * Include date/time keywords as SQL92 extension.
4363 * Include TYPE as a SQL92 unreserved keyword. - thomas 1997-10-05
4364 * Add other keywords. Note that as the syntax expands,
4365 * some of these keywords will have to be removed from this
4366 * list due to shift/reduce conflicts in yacc. If so, move
4367 * down to the ColLabel entity. - thomas 1997-11-06
4369 ColId: ident { $$ = $1; }
4370 | datetime { $$ = $1; }
4371 | ABSOLUTE { $$ = make1_str("absolute"); }
4372 | ACTION { $$ = make1_str("action"); }
4373 | AFTER { $$ = make1_str("after"); }
4374 | AGGREGATE { $$ = make1_str("aggregate"); }
4375 | BACKWARD { $$ = make1_str("backward"); }
4376 | BEFORE { $$ = make1_str("before"); }
4377 | CACHE { $$ = make1_str("cache"); }
4378 | CREATEDB { $$ = make1_str("createdb"); }
4379 | CREATEUSER { $$ = make1_str("createuser"); }
4380 | CYCLE { $$ = make1_str("cycle"); }
4381 | DATABASE { $$ = make1_str("database"); }
4382 | DELIMITERS { $$ = make1_str("delimiters"); }
4383 | DOUBLE { $$ = make1_str("double"); }
4384 | EACH { $$ = make1_str("each"); }
4385 | ENCODING { $$ = make1_str("encoding"); }
4386 | FORWARD { $$ = make1_str("forward"); }
4387 | FUNCTION { $$ = make1_str("function"); }
4388 | HANDLER { $$ = make1_str("handler"); }
4389 | INCREMENT { $$ = make1_str("increment"); }
4390 | INDEX { $$ = make1_str("index"); }
4391 | INHERITS { $$ = make1_str("inherits"); }
4392 | INSENSITIVE { $$ = make1_str("insensitive"); }
4393 | INSTEAD { $$ = make1_str("instead"); }
4394 | ISNULL { $$ = make1_str("isnull"); }
4395 | KEY { $$ = make1_str("key"); }
4396 | LANGUAGE { $$ = make1_str("language"); }
4397 | LANCOMPILER { $$ = make1_str("lancompiler"); }
4398 | LOCATION { $$ = make1_str("location"); }
4399 | MATCH { $$ = make1_str("match"); }
4400 | MAXVALUE { $$ = make1_str("maxvalue"); }
4401 | MINVALUE { $$ = make1_str("minvalue"); }
4402 | NEXT { $$ = make1_str("next"); }
4403 | NOCREATEDB { $$ = make1_str("nocreatedb"); }
4404 | NOCREATEUSER { $$ = make1_str("nocreateuser"); }
4405 | NOTHING { $$ = make1_str("nothing"); }
4406 | NOTNULL { $$ = make1_str("notnull"); }
4407 | OF { $$ = make1_str("of"); }
4408 | OIDS { $$ = make1_str("oids"); }
4409 | ONLY { $$ = make1_str("only"); }
4410 | OPERATOR { $$ = make1_str("operator"); }
4411 | OPTION { $$ = make1_str("option"); }
4412 | PASSWORD { $$ = make1_str("password"); }
4413 | PRIOR { $$ = make1_str("prior"); }
4414 | PRIVILEGES { $$ = make1_str("privileges"); }
4415 | PROCEDURAL { $$ = make1_str("procedural"); }
4416 | READ { $$ = make1_str("read"); }
4417 | RECIPE { $$ = make1_str("recipe"); }
4418 | RELATIVE { $$ = make1_str("relative"); }
4419 | RENAME { $$ = make1_str("rename"); }
4420 | RETURNS { $$ = make1_str("returns"); }
4421 | ROW { $$ = make1_str("row"); }
4422 | RULE { $$ = make1_str("rule"); }
4423 | SCROLL { $$ = make1_str("scroll"); }
4424 | SEQUENCE { $$ = make1_str("sequence"); }
4425 | SERIAL { $$ = make1_str("serial"); }
4426 | START { $$ = make1_str("start"); }
4427 | STATEMENT { $$ = make1_str("statement"); }
4428 | STDIN { $$ = make1_str("stdin"); }
4429 | STDOUT { $$ = make1_str("stdout"); }
4430 | TIME { $$ = make1_str("time"); }
4431 | TIMESTAMP { $$ = make1_str("timestamp"); }
4432 | TIMEZONE_HOUR { $$ = make1_str("timezone_hour"); }
4433 | TIMEZONE_MINUTE { $$ = make1_str("timezone_minute"); }
4434 | TRIGGER { $$ = make1_str("trigger"); }
4435 | TRUSTED { $$ = make1_str("trusted"); }
4436 | TYPE_P { $$ = make1_str("type"); }
4437 | VALID { $$ = make1_str("valid"); }
4438 | VERSION { $$ = make1_str("version"); }
4439 | ZONE { $$ = make1_str("zone"); }
4440 | SQL_AT { $$ = make1_str("at"); }
4441 | SQL_BOOL { $$ = make1_str("bool"); }
4442 | SQL_BREAK { $$ = make1_str("break"); }
4443 | SQL_CALL { $$ = make1_str("call"); }
4444 | SQL_CONNECT { $$ = make1_str("connect"); }
4445 | SQL_CONNECTION { $$ = make1_str("connection"); }
4446 | SQL_CONTINUE { $$ = make1_str("continue"); }
4447 | SQL_DEALLOCATE { $$ = make1_str("deallocate"); }
4448 | SQL_DISCONNECT { $$ = make1_str("disconnect"); }
4449 | SQL_FOUND { $$ = make1_str("found"); }
4450 | SQL_GO { $$ = make1_str("go"); }
4451 | SQL_GOTO { $$ = make1_str("goto"); }
4452 | SQL_IDENTIFIED { $$ = make1_str("identified"); }
4453 | SQL_IMMEDIATE { $$ = make1_str("immediate"); }
4454 | SQL_INDICATOR { $$ = make1_str("indicator"); }
4455 | SQL_INT { $$ = make1_str("int"); }
4456 | SQL_LONG { $$ = make1_str("long"); }
4457 | SQL_OPEN { $$ = make1_str("open"); }
4458 | SQL_PREPARE { $$ = make1_str("prepare"); }
4459 | SQL_RELEASE { $$ = make1_str("release"); }
4460 | SQL_SECTION { $$ = make1_str("section"); }
4461 | SQL_SHORT { $$ = make1_str("short"); }
4462 | SQL_SIGNED { $$ = make1_str("signed"); }
4463 | SQL_SQLERROR { $$ = make1_str("sqlerror"); }
4464 | SQL_SQLPRINT { $$ = make1_str("sqlprint"); }
4465 | SQL_SQLWARNING { $$ = make1_str("sqlwarning"); }
4466 | SQL_STOP { $$ = make1_str("stop"); }
4467 | SQL_STRUCT { $$ = make1_str("struct"); }
4468 | SQL_UNSIGNED { $$ = make1_str("unsigned"); }
4469 | SQL_VAR { $$ = make1_str("var"); }
4470 | SQL_WHENEVER { $$ = make1_str("whenever"); }
4473 * Allowed labels in "AS" clauses.
4474 * Include TRUE/FALSE SQL3 reserved words for Postgres backward
4475 * compatibility. Cannot allow this for column names since the
4476 * syntax would not distinguish between the constant value and
4477 * a column name. - thomas 1997-10-24
4478 * Add other keywords to this list. Note that they appear here
4479 * rather than in ColId if there was a shift/reduce conflict
4480 * when used as a full identifier. - thomas 1997-11-06
4482 ColLabel: ColId { $$ = $1; }
4483 | ABORT_TRANS { $$ = make1_str("abort"); }
4484 | ANALYZE { $$ = make1_str("analyze"); }
4485 | BINARY { $$ = make1_str("binary"); }
4486 | CASE { $$ = make1_str("case"); }
4487 | CLUSTER { $$ = make1_str("cluster"); }
4488 | COALESCE { $$ = make1_str("coalesce"); }
4489 | CONSTRAINT { $$ = make1_str("constraint"); }
4490 | COPY { $$ = make1_str("copy"); }
4491 | CURRENT { $$ = make1_str("current"); }
4492 | DO { $$ = make1_str("do"); }
4493 | ELSE { $$ = make1_str("else"); }
4494 | END_TRANS { $$ = make1_str("end"); }
4495 | EXPLAIN { $$ = make1_str("explain"); }
4496 | EXTEND { $$ = make1_str("extend"); }
4497 | FALSE_P { $$ = make1_str("false"); }
4498 | FOREIGN { $$ = make1_str("foreign"); }
4499 | GROUP { $$ = make1_str("group"); }
4500 | LISTEN { $$ = make1_str("listen"); }
4501 | LOAD { $$ = make1_str("load"); }
4502 | LOCK_P { $$ = make1_str("lock"); }
4503 | MOVE { $$ = make1_str("move"); }
4504 | NEW { $$ = make1_str("new"); }
4505 | NONE { $$ = make1_str("none"); }
4506 | NULLIF { $$ = make1_str("nullif"); }
4507 | ORDER { $$ = make1_str("order"); }
4508 | POSITION { $$ = make1_str("position"); }
4509 | PRECISION { $$ = make1_str("precision"); }
4510 | RESET { $$ = make1_str("reset"); }
4511 | SETOF { $$ = make1_str("setof"); }
4512 | SHOW { $$ = make1_str("show"); }
4513 | TABLE { $$ = make1_str("table"); }
4514 | THEN { $$ = make1_str("then"); }
4515 | TRANSACTION { $$ = make1_str("transaction"); }
4516 | TRUE_P { $$ = make1_str("true"); }
4517 | VACUUM { $$ = make1_str("vacuum"); }
4518 | VERBOSE { $$ = make1_str("verbose"); }
4519 | WHEN { $$ = make1_str("when"); }
4522 SpecialRuleRelation: CURRENT
4525 $$ = make1_str("current");
4527 yyerror("CURRENT used in non-rule query");
4532 $$ = make1_str("new");
4534 yyerror("NEW used in non-rule query");
4539 * and now special embedded SQL stuff
4543 * the exec sql connect statement: connect to the given database
4545 ECPGConnect: SQL_CONNECT TO connection_target opt_connection_name opt_user
4547 $$ = make5_str($3, make1_str(","), $5, make1_str(","), $4);
4549 | SQL_CONNECT TO DEFAULT
4551 $$ = make1_str("NULL,NULL,NULL,\"DEFAULT\"");
4553 /* also allow ORACLE syntax */
4554 | SQL_CONNECT ora_user
4556 $$ = make3_str(make1_str("NULL,"), $2, make1_str(",NULL"));
4559 connection_target: database_name opt_server opt_port
4561 /* old style: dbname[@server][:port] */
4562 if (strlen($2) > 0 && *($2) != '@')
4564 sprintf(errortext, "parse error at or near '%s'", $2);
4568 $$ = make5_str(make1_str("\""), $1, $2, $3, make1_str("\""));
4570 | db_prefix server opt_port '/' database_name opt_options
4572 /* new style: <tcp|unix>:postgresql://server[:port][/dbname] */
4573 if (strncmp($2, "://", 3) != 0)
4575 sprintf(errortext, "parse error at or near '%s'", $2);
4579 if (strncmp($1, "unix", 4) == 0 && strncmp($2 + 3, "localhost", 9) != 0)
4581 sprintf(errortext, "unix domain sockets only work on 'localhost' but not on '%9.9s'", $2);
4585 if (strncmp($1, "unix", 4) != 0 && strncmp($1, "tcp", 3) != 0)
4587 sprintf(errortext, "only protocols 'tcp' and 'unix' are supported");
4591 $$ = make4_str(make5_str(make1_str("\""), $1, $2, $3, make1_str("/")), $5, $6, make1_str("\""));
4601 $$[strlen($$) - 1] = '\"';
4605 db_prefix: ident cvariable
4607 if (strcmp($2, "postgresql") != 0 && strcmp($2, "postgres") != 0)
4609 sprintf(errortext, "parse error at or near '%s'", $2);
4613 if (strcmp($1, "tcp") != 0 && strcmp($1, "unix") != 0)
4615 sprintf(errortext, "Illegal connection type %s", $1);
4619 $$ = make3_str($1, make1_str(":"), $2);
4622 server: Op server_name
4624 if (strcmp($1, "@") != 0 && strcmp($1, "://") != 0)
4626 sprintf(errortext, "parse error at or near '%s'", $1);
4630 $$ = make2_str($1, $2);
4633 opt_server: server { $$ = $1; }
4634 | /* empty */ { $$ = make1_str(""); }
4636 server_name: ColId { $$ = $1; }
4637 | ColId '.' server_name { $$ = make3_str($1, make1_str("."), $3); }
4639 opt_port: ':' Iconst { $$ = make2_str(make1_str(":"), $2); }
4640 | /* empty */ { $$ = make1_str(""); }
4642 opt_connection_name: AS connection_target { $$ = $2; }
4643 | /* empty */ { $$ = make1_str("NULL"); }
4645 opt_user: USER ora_user { $$ = $2; }
4646 | /* empty */ { $$ = make1_str("NULL,NULL"); }
4650 $$ = make2_str($1, make1_str(",NULL"));
4652 | user_name '/' ColId
4654 $$ = make3_str($1, make1_str(","), $3);
4656 | user_name SQL_IDENTIFIED BY user_name
4658 $$ = make3_str($1, make1_str(","), $4);
4660 | user_name USING user_name
4662 $$ = make3_str($1, make1_str(","), $3);
4665 user_name: UserId { if ($1[0] == '\"')
4668 $$ = make3_str(make1_str("\""), $1, make1_str("\""));
4670 | char_variable { $$ = $1; }
4671 | SCONST { $$ = make3_str(make1_str("\""), $1, make1_str("\"")); }
4673 char_variable: cvariable
4674 { /* check if we have a char variable */
4675 struct variable *p = find_variable($1);
4676 enum ECPGttype typ = p->type->typ;
4678 /* if array see what's inside */
4679 if (typ == ECPGt_array)
4680 typ = p->type->u.element->typ;
4685 case ECPGt_unsigned_char:
4689 $$ = make2_str($1, make1_str(".arr"));
4692 yyerror("invalid datatype");
4697 opt_options: Op ColId
4699 if (strlen($1) == 0)
4700 yyerror("parse error");
4702 if (strcmp($1, "?") != 0)
4704 sprintf(errortext, "parse error at or near %s", $1);
4708 $$ = make2_str(make1_str("?"), $2);
4710 | /* empty */ { $$ = make1_str(""); }
4713 * Declare a prepared cursor. The syntax is different from the standard
4714 * declare statement, so we create a new rule.
4716 ECPGCursorStmt: DECLARE name opt_cursor CURSOR FOR ident cursor_clause
4718 struct cursor *ptr, *this;
4719 struct variable *thisquery = (struct variable *)mm_alloc(sizeof(struct variable));
4721 for (ptr = cur; ptr != NULL; ptr = ptr->next)
4723 if (strcmp($2, ptr->name) == 0)
4725 /* re-definition is a bug */
4726 sprintf(errortext, "cursor %s already defined", $2);
4731 this = (struct cursor *) mm_alloc(sizeof(struct cursor));
4733 /* initial definition */
4736 this->connection = connection;
4737 this->command = cat5_str(make1_str("declare"), mm_strdup($2), $3, make1_str("cursor for ?"), $7);
4738 this->argsresult = NULL;
4740 thisquery->type = &ecpg_query;
4741 thisquery->brace_level = 0;
4742 thisquery->next = NULL;
4743 thisquery->name = (char *) mm_alloc(sizeof("ECPGprepared_statement(\"\")") + strlen($6));
4744 sprintf(thisquery->name, "ECPGprepared_statement(\"%s\")", $6);
4746 this->argsinsert = NULL;
4747 add_variable(&(this->argsinsert), thisquery, &no_indicator);
4751 $$ = cat3_str(make1_str("/*"), mm_strdup(this->command), make1_str("*/"));
4756 * the exec sql deallocate prepare command to deallocate a previously
4757 * prepared statement
4759 ECPGDeallocate: SQL_DEALLOCATE SQL_PREPARE ident { $$ = make3_str(make1_str("ECPGdeallocate(__LINE__, \""), $3, make1_str("\");")); }
4762 * variable declaration inside the exec sql declare block
4764 ECPGDeclaration: sql_startdeclare
4766 fputs("/* exec sql begin declare section */", yyout);
4767 output_line_number();
4769 variable_declarations sql_enddeclare
4771 fprintf(yyout, "%s/* exec sql end declare section */", $3);
4773 output_line_number();
4776 sql_startdeclare : ecpgstart BEGIN_TRANS DECLARE SQL_SECTION SQL_SEMI {}
4778 sql_enddeclare: ecpgstart END_TRANS DECLARE SQL_SECTION SQL_SEMI {}
4780 variable_declarations: /* empty */
4784 | declaration variable_declarations
4786 $$ = cat2_str($1, $2);
4789 declaration: storage_clause
4791 actual_storage[struct_level] = mm_strdup($1);
4795 actual_type[struct_level].type_enum = $3.type_enum;
4796 actual_type[struct_level].type_dimension = $3.type_dimension;
4797 actual_type[struct_level].type_index = $3.type_index;
4801 $$ = cat4_str($1, $3.type_str, $5, make1_str(";\n"));
4804 storage_clause : S_EXTERN { $$ = make1_str("extern"); }
4805 | S_STATIC { $$ = make1_str("static"); }
4806 | S_SIGNED { $$ = make1_str("signed"); }
4807 | S_CONST { $$ = make1_str("const"); }
4808 | S_REGISTER { $$ = make1_str("register"); }
4809 | S_AUTO { $$ = make1_str("auto"); }
4810 | /* empty */ { $$ = make1_str(""); }
4815 $$.type_str = mm_strdup(ECPGtype_name($1));
4816 $$.type_dimension = -1;
4821 $$.type_enum = ECPGt_varchar;
4822 $$.type_str = make1_str("");
4823 $$.type_dimension = -1;
4828 $$.type_enum = ECPGt_struct;
4830 $$.type_dimension = -1;
4835 $$.type_enum = ECPGt_union;
4837 $$.type_dimension = -1;
4843 $$.type_enum = ECPGt_int;
4845 $$.type_dimension = -1;
4850 /* this is for typedef'ed types */
4851 struct typedefs *this = get_typedef($1);
4853 $$.type_str = (this->type->type_enum == ECPGt_varchar) ? make1_str("") : mm_strdup(this->name);
4854 $$.type_enum = this->type->type_enum;
4855 $$.type_dimension = this->type->type_dimension;
4856 $$.type_index = this->type->type_index;
4857 struct_member_list[struct_level] = ECPGstruct_member_dup(this->struct_member_list);
4860 enum_type: s_enum '{' c_line '}'
4862 $$ = cat4_str($1, make1_str("{"), $3, make1_str("}"));
4865 s_enum: S_ENUM opt_symbol { $$ = cat2_str(make1_str("enum"), $2); }
4867 struct_type: s_struct '{' variable_declarations '}'
4869 ECPGfree_struct_member(struct_member_list[struct_level]);
4870 free(actual_storage[struct_level--]);
4871 $$ = cat4_str($1, make1_str("{"), $3, make1_str("}"));
4874 union_type: s_union '{' variable_declarations '}'
4876 ECPGfree_struct_member(struct_member_list[struct_level]);
4877 free(actual_storage[struct_level--]);
4878 $$ = cat4_str($1, make1_str("{"), $3, make1_str("}"));
4881 s_struct : S_STRUCT opt_symbol
4883 struct_member_list[struct_level++] = NULL;
4884 if (struct_level >= STRUCT_DEPTH)
4885 yyerror("Too many levels in nested structure definition");
4886 $$ = cat2_str(make1_str("struct"), $2);
4889 s_union : S_UNION opt_symbol
4891 struct_member_list[struct_level++] = NULL;
4892 if (struct_level >= STRUCT_DEPTH)
4893 yyerror("Too many levels in nested structure definition");
4894 $$ = cat2_str(make1_str("union"), $2);
4897 opt_symbol: /* empty */ { $$ = make1_str(""); }
4898 | symbol { $$ = $1; }
4900 simple_type: S_SHORT { $$ = ECPGt_short; }
4901 | S_UNSIGNED S_SHORT { $$ = ECPGt_unsigned_short; }
4902 | S_INT { $$ = ECPGt_int; }
4903 | S_UNSIGNED S_INT { $$ = ECPGt_unsigned_int; }
4904 | S_LONG { $$ = ECPGt_long; }
4905 | S_UNSIGNED S_LONG { $$ = ECPGt_unsigned_long; }
4906 | S_FLOAT { $$ = ECPGt_float; }
4907 | S_DOUBLE { $$ = ECPGt_double; }
4908 | S_BOOL { $$ = ECPGt_bool; };
4909 | S_CHAR { $$ = ECPGt_char; }
4910 | S_UNSIGNED S_CHAR { $$ = ECPGt_unsigned_char; }
4912 varchar_type: S_VARCHAR { $$ = ECPGt_varchar; }
4914 variable_list: variable
4918 | variable_list ',' variable
4920 $$ = cat3_str($1, make1_str(","), $3);
4923 variable: opt_pointer symbol opt_array_bounds opt_initializer
4925 struct ECPGtype * type;
4926 int dimension = $3.index1; /* dimension of array */
4927 int length = $3.index2; /* lenght of string */
4928 char dim[14L], ascii_len[12];
4930 adjust_array(actual_type[struct_level].type_enum, &dimension, &length, actual_type[struct_level].type_dimension, actual_type[struct_level].type_index, strlen($1));
4932 switch (actual_type[struct_level].type_enum)
4937 type = ECPGmake_struct_type(struct_member_list[struct_level], actual_type[struct_level].type_enum);
4939 type = ECPGmake_array_type(ECPGmake_struct_type(struct_member_list[struct_level], actual_type[struct_level].type_enum), dimension);
4941 $$ = make4_str($1, mm_strdup($2), $3.str, $4);
4944 if (dimension == -1)
4945 type = ECPGmake_simple_type(actual_type[struct_level].type_enum, length);
4947 type = ECPGmake_array_type(ECPGmake_simple_type(actual_type[struct_level].type_enum, length), dimension);
4957 sprintf(dim, "[%d]", dimension);
4960 sprintf(ascii_len, "%d", length);
4963 yyerror ("pointer to varchar are not implemented");
4966 $$ = 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);
4968 $$ = 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);
4972 case ECPGt_unsigned_char:
4973 if (dimension == -1)
4974 type = ECPGmake_simple_type(actual_type[struct_level].type_enum, length);
4976 type = ECPGmake_array_type(ECPGmake_simple_type(actual_type[struct_level].type_enum, length), dimension);
4978 $$ = make4_str($1, mm_strdup($2), $3.str, $4);
4982 type = ECPGmake_simple_type(actual_type[struct_level].type_enum, 1);
4984 type = ECPGmake_array_type(ECPGmake_simple_type(actual_type[struct_level].type_enum, 1), dimension);
4986 $$ = make4_str($1, mm_strdup($2), $3.str, $4);
4990 if (struct_level == 0)
4991 new_variable($2, type);
4993 ECPGmake_struct_member($2, type, &(struct_member_list[struct_level - 1]));
4998 opt_initializer: /* empty */ { $$ = make1_str(""); }
4999 | '=' vartext { $$ = make2_str(make1_str("="), $2); }
5001 opt_pointer: /* empty */ { $$ = make1_str(""); }
5002 | '*' { $$ = make1_str("*"); }
5005 * As long as the prepare statement is not supported by the backend, we will
5006 * try to simulate it here so we get dynamic SQL
5008 ECPGDeclare: DECLARE STATEMENT ident
5010 /* this is only supported for compatibility */
5011 $$ = cat3_str(make1_str("/* declare statement"), $3, make1_str("*/"));
5014 * the exec sql disconnect statement: disconnect from the given database
5016 ECPGDisconnect: SQL_DISCONNECT dis_name { $$ = $2; }
5018 dis_name: connection_object { $$ = $1; }
5019 | CURRENT { $$ = make1_str("CURRENT"); }
5020 | ALL { $$ = make1_str("ALL"); }
5021 | /* empty */ { $$ = make1_str("CURRENT"); }
5023 connection_object: connection_target { $$ = $1; }
5024 | DEFAULT { $$ = make1_str("DEFAULT"); }
5027 * execute a given string as sql command
5029 ECPGExecute : EXECUTE SQL_IMMEDIATE execstring
5031 struct variable *thisquery = (struct variable *)mm_alloc(sizeof(struct variable));
5033 thisquery->type = &ecpg_query;
5034 thisquery->brace_level = 0;
5035 thisquery->next = NULL;
5036 thisquery->name = $3;
5038 add_variable(&argsinsert, thisquery, &no_indicator);
5040 $$ = make1_str("?");
5044 struct variable *thisquery = (struct variable *)mm_alloc(sizeof(struct variable));
5046 thisquery->type = &ecpg_query;
5047 thisquery->brace_level = 0;
5048 thisquery->next = NULL;
5049 thisquery->name = (char *) mm_alloc(sizeof("ECPGprepared_statement(\"\")") + strlen($2));
5050 sprintf(thisquery->name, "ECPGprepared_statement(\"%s\")", $2);
5052 add_variable(&argsinsert, thisquery, &no_indicator);
5055 $$ = make1_str("?");
5058 execstring: char_variable |
5059 CSTRING { $$ = make3_str(make1_str("\""), $1, make1_str("\"")); };
5062 * the exec sql free command to deallocate a previously
5063 * prepared statement
5065 ECPGFree: SQL_FREE ident { $$ = $2; }
5068 * open is an open cursor, at the moment this has to be removed
5070 ECPGOpen: SQL_OPEN name opt_using {
5074 opt_using: /* empty */ { $$ = make1_str(""); }
5075 | USING variablelist {
5076 /* yyerror ("open cursor with variables not implemented yet"); */
5080 variablelist: cinputvariable | cinputvariable ',' variablelist
5083 * As long as the prepare statement is not supported by the backend, we will
5084 * try to simulate it here so we get dynamic SQL
5086 ECPGPrepare: SQL_PREPARE ident FROM char_variable
5088 $$ = make4_str(make1_str("\""), $2, make1_str("\", "), $4);
5092 * for compatibility with ORACLE we will also allow the keyword RELEASE
5093 * after a transaction statement to disconnect from the database.
5096 ECPGRelease: TransactionStmt SQL_RELEASE
5098 if (strncmp($1, "begin", 5) == 0)
5099 yyerror("RELEASE does not make sense when beginning a transaction");
5101 fprintf(yyout, "ECPGtrans(__LINE__, %s, \"%s\");", connection, $1);
5103 fprintf(yyout, "ECPGdisconnect(\"\");");
5109 * set the actual connection, this needs a differnet handling as the other
5112 ECPGSetConnection: SET SQL_CONNECTION connection_object
5118 * define a new type for embedded SQL
5120 ECPGTypedef: TYPE_P symbol IS ctype opt_type_array_bounds opt_reference
5122 /* add entry to list */
5123 struct typedefs *ptr, *this;
5124 int dimension = $5.index1;
5125 int length = $5.index2;
5127 for (ptr = types; ptr != NULL; ptr = ptr->next)
5129 if (strcmp($2, ptr->name) == 0)
5131 /* re-definition is a bug */
5132 sprintf(errortext, "type %s already defined", $2);
5137 adjust_array($4.type_enum, &dimension, &length, $4.type_dimension, $4.type_index, strlen($6));
5139 this = (struct typedefs *) mm_alloc(sizeof(struct typedefs));
5141 /* initial definition */
5144 this->type = (struct this_type *) mm_alloc(sizeof(struct this_type));
5145 this->type->type_enum = $4.type_enum;
5146 this->type->type_str = mm_strdup($2);
5147 this->type->type_dimension = dimension; /* dimension of array */
5148 this->type->type_index = length; /* lenght of string */
5149 this->struct_member_list = struct_member_list[struct_level];
5151 if ($4.type_enum != ECPGt_varchar &&
5152 $4.type_enum != ECPGt_char &&
5153 $4.type_enum != ECPGt_unsigned_char &&
5154 this->type->type_index >= 0)
5155 yyerror("No multi-dimensional array support for simple data types");
5159 $$ = 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("*/"));
5162 opt_type_array_bounds: '[' ']' nest_type_array_bounds
5165 $$.index2 = $3.index1;
5166 $$.str = cat2_str(make1_str("[]"), $3.str);
5168 | '(' ')' nest_type_array_bounds
5171 $$.index2 = $3.index1;
5172 $$.str = cat2_str(make1_str("[]"), $3.str);
5174 | '[' Iconst ']' nest_type_array_bounds
5176 $$.index1 = atol($2);
5177 $$.index2 = $4.index1;
5178 $$.str = cat4_str(make1_str("["), $2, make1_str("]"), $4.str);
5180 | '(' Iconst ')' nest_type_array_bounds
5182 $$.index1 = atol($2);
5183 $$.index2 = $4.index1;
5184 $$.str = cat4_str(make1_str("["), $2, make1_str("]"), $4.str);
5190 $$.str= make1_str("");
5194 nest_type_array_bounds: '[' ']' nest_type_array_bounds
5197 $$.index2 = $3.index1;
5198 $$.str = cat2_str(make1_str("[]"), $3.str);
5200 | '(' ')' nest_type_array_bounds
5203 $$.index2 = $3.index1;
5204 $$.str = cat2_str(make1_str("[]"), $3.str);
5206 | '[' Iconst ']' nest_type_array_bounds
5208 $$.index1 = atol($2);
5209 $$.index2 = $4.index1;
5210 $$.str = cat4_str(make1_str("["), $2, make1_str("]"), $4.str);
5212 | '(' Iconst ')' nest_type_array_bounds
5214 $$.index1 = atol($2);
5215 $$.index2 = $4.index1;
5216 $$.str = cat4_str(make1_str("["), $2, make1_str("]"), $4.str);
5222 $$.str= make1_str("");
5225 opt_reference: SQL_REFERENCE { $$ = make1_str("reference"); }
5226 | /* empty */ { $$ = make1_str(""); }
5230 $$.type_str = make1_str("char");
5231 $$.type_enum = ECPGt_char;
5233 $$.type_dimension = -1;
5237 $$.type_str = make1_str("varchar");
5238 $$.type_enum = ECPGt_varchar;
5240 $$.type_dimension = -1;
5244 $$.type_str = make1_str("float");
5245 $$.type_enum = ECPGt_float;
5247 $$.type_dimension = -1;
5251 $$.type_str = make1_str("double");
5252 $$.type_enum = ECPGt_double;
5254 $$.type_dimension = -1;
5256 | opt_signed SQL_INT
5258 $$.type_str = make1_str("int");
5259 $$.type_enum = ECPGt_int;
5261 $$.type_dimension = -1;
5265 $$.type_str = make1_str("int");
5266 $$.type_enum = ECPGt_int;
5268 $$.type_dimension = -1;
5270 | opt_signed SQL_SHORT
5272 $$.type_str = make1_str("short");
5273 $$.type_enum = ECPGt_short;
5275 $$.type_dimension = -1;
5277 | opt_signed SQL_LONG
5279 $$.type_str = make1_str("long");
5280 $$.type_enum = ECPGt_long;
5282 $$.type_dimension = -1;
5286 $$.type_str = make1_str("bool");
5287 $$.type_enum = ECPGt_bool;
5289 $$.type_dimension = -1;
5291 | SQL_UNSIGNED SQL_INT
5293 $$.type_str = make1_str("unsigned int");
5294 $$.type_enum = ECPGt_unsigned_int;
5296 $$.type_dimension = -1;
5298 | SQL_UNSIGNED SQL_SHORT
5300 $$.type_str = make1_str("unsigned short");
5301 $$.type_enum = ECPGt_unsigned_short;
5303 $$.type_dimension = -1;
5305 | SQL_UNSIGNED SQL_LONG
5307 $$.type_str = make1_str("unsigned long");
5308 $$.type_enum = ECPGt_unsigned_long;
5310 $$.type_dimension = -1;
5314 struct_member_list[struct_level++] = NULL;
5315 if (struct_level >= STRUCT_DEPTH)
5316 yyerror("Too many levels in nested structure definition");
5317 } '{' sql_variable_declarations '}'
5319 ECPGfree_struct_member(struct_member_list[struct_level--]);
5320 $$.type_str = cat3_str(make1_str("struct {"), $4, make1_str("}"));
5321 $$.type_enum = ECPGt_struct;
5323 $$.type_dimension = -1;
5327 struct_member_list[struct_level++] = NULL;
5328 if (struct_level >= STRUCT_DEPTH)
5329 yyerror("Too many levels in nested structure definition");
5330 } '{' sql_variable_declarations '}'
5332 ECPGfree_struct_member(struct_member_list[struct_level--]);
5333 $$.type_str = cat3_str(make1_str("union {"), $4, make1_str("}"));
5334 $$.type_enum = ECPGt_union;
5336 $$.type_dimension = -1;
5340 struct typedefs *this = get_typedef($1);
5342 $$.type_str = mm_strdup($1);
5343 $$.type_enum = this->type->type_enum;
5344 $$.type_dimension = this->type->type_dimension;
5345 $$.type_index = this->type->type_index;
5346 struct_member_list[struct_level] = this->struct_member_list;
5349 opt_signed: SQL_SIGNED | /* empty */
5351 sql_variable_declarations: /* empty */
5355 | sql_declaration sql_variable_declarations
5357 $$ = cat2_str($1, $2);
5361 sql_declaration: ctype
5363 actual_type[struct_level].type_enum = $1.type_enum;
5364 actual_type[struct_level].type_dimension = $1.type_dimension;
5365 actual_type[struct_level].type_index = $1.type_index;
5367 sql_variable_list SQL_SEMI
5369 $$ = cat3_str($1.type_str, $3, make1_str(";"));
5372 sql_variable_list: sql_variable
5376 | sql_variable_list ',' sql_variable
5378 $$ = make3_str($1, make1_str(","), $3);
5381 sql_variable: opt_pointer symbol opt_array_bounds
5383 int dimension = $3.index1;
5384 int length = $3.index2;
5385 struct ECPGtype * type;
5388 adjust_array(actual_type[struct_level].type_enum, &dimension, &length, actual_type[struct_level].type_dimension, actual_type[struct_level].type_index, strlen($1));
5390 switch (actual_type[struct_level].type_enum)
5395 type = ECPGmake_struct_type(struct_member_list[struct_level], actual_type[struct_level].type_enum);
5397 type = ECPGmake_array_type(ECPGmake_struct_type(struct_member_list[struct_level], actual_type[struct_level].type_enum), dimension);
5401 if (dimension == -1)
5402 type = ECPGmake_simple_type(actual_type[struct_level].type_enum, length);
5404 type = ECPGmake_array_type(ECPGmake_simple_type(actual_type[struct_level].type_enum, length), dimension);
5416 sprintf(dim, "[%d]", dimension);
5422 case ECPGt_unsigned_char:
5423 if (dimension == -1)
5424 type = ECPGmake_simple_type(actual_type[struct_level].type_enum, length);
5426 type = ECPGmake_array_type(ECPGmake_simple_type(actual_type[struct_level].type_enum, length), dimension);
5431 yyerror("No multi-dimensional array support for simple data types");
5434 type = ECPGmake_simple_type(actual_type[struct_level].type_enum, 1);
5436 type = ECPGmake_array_type(ECPGmake_simple_type(actual_type[struct_level].type_enum, 1), dimension);
5441 if (struct_level == 0)
5442 new_variable($2, type);
5444 ECPGmake_struct_member($2, type, &(struct_member_list[struct_level - 1]));
5446 $$ = cat3_str($1, $2, $3.str);
5450 * define the type of one variable for embedded SQL
5452 ECPGVar: SQL_VAR symbol IS ctype opt_type_array_bounds opt_reference
5454 struct variable *p = find_variable($2);
5455 int dimension = $5.index1;
5456 int length = $5.index2;
5457 struct ECPGtype * type;
5459 adjust_array($4.type_enum, &dimension, &length, $4.type_dimension, $4.type_index, strlen($6));
5461 switch ($4.type_enum)
5466 type = ECPGmake_struct_type(struct_member_list[struct_level], $4.type_enum);
5468 type = ECPGmake_array_type(ECPGmake_struct_type(struct_member_list[struct_level], $4.type_enum), dimension);
5471 if (dimension == -1)
5472 type = ECPGmake_simple_type($4.type_enum, length);
5474 type = ECPGmake_array_type(ECPGmake_simple_type($4.type_enum, length), dimension);
5478 case ECPGt_unsigned_char:
5479 if (dimension == -1)
5480 type = ECPGmake_simple_type($4.type_enum, length);
5482 type = ECPGmake_array_type(ECPGmake_simple_type($4.type_enum, length), dimension);
5487 yyerror("No multi-dimensional array support for simple data types");
5490 type = ECPGmake_simple_type($4.type_enum, 1);
5492 type = ECPGmake_array_type(ECPGmake_simple_type($4.type_enum, 1), dimension);
5497 ECPGfree_type(p->type);
5500 $$ = 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("*/"));
5504 * whenever statement: decide what to do in case of error/no data found
5505 * according to SQL standards we lack: SQLSTATE, CONSTRAINT and SQLEXCEPTION
5507 ECPGWhenever: SQL_WHENEVER SQL_SQLERROR action {
5508 when_error.code = $<action>3.code;
5509 when_error.command = $<action>3.command;
5510 $$ = cat3_str(make1_str("/* exec sql whenever sqlerror "), $3.str, make1_str("; */\n"));
5512 | SQL_WHENEVER NOT SQL_FOUND action {
5513 when_nf.code = $<action>4.code;
5514 when_nf.command = $<action>4.command;
5515 $$ = cat3_str(make1_str("/* exec sql whenever not found "), $4.str, make1_str("; */\n"));
5517 | SQL_WHENEVER SQL_SQLWARNING action {
5518 when_warn.code = $<action>3.code;
5519 when_warn.command = $<action>3.command;
5520 $$ = cat3_str(make1_str("/* exec sql whenever sql_warning "), $3.str, make1_str("; */\n"));
5523 action : SQL_CONTINUE {
5524 $<action>$.code = W_NOTHING;
5525 $<action>$.command = NULL;
5526 $<action>$.str = make1_str("continue");
5529 $<action>$.code = W_SQLPRINT;
5530 $<action>$.command = NULL;
5531 $<action>$.str = make1_str("sqlprint");
5534 $<action>$.code = W_STOP;
5535 $<action>$.command = NULL;
5536 $<action>$.str = make1_str("stop");
5539 $<action>$.code = W_GOTO;
5540 $<action>$.command = strdup($2);
5541 $<action>$.str = cat2_str(make1_str("goto "), $2);
5544 $<action>$.code = W_GOTO;
5545 $<action>$.command = strdup($3);
5546 $<action>$.str = cat2_str(make1_str("goto "), $3);
5548 | DO name '(' dotext ')' {
5549 $<action>$.code = W_DO;
5550 $<action>$.command = make4_str($2, make1_str("("), $4, make1_str(")"));
5551 $<action>$.str = cat2_str(make1_str("do"), mm_strdup($<action>$.command));
5554 $<action>$.code = W_BREAK;
5555 $<action>$.command = NULL;
5556 $<action>$.str = make1_str("break");
5558 | SQL_CALL name '(' dotext ')' {
5559 $<action>$.code = W_DO;
5560 $<action>$.command = make4_str($2, make1_str("("), $4, make1_str(")"));
5561 $<action>$.str = cat2_str(make1_str("call"), mm_strdup($<action>$.command));
5564 /* some other stuff for ecpg */
5565 ecpg_expr: attr opt_indirection
5567 $$ = cat2_str($1, $2);
5577 | '-' ecpg_expr %prec UMINUS
5578 { $$ = cat2_str(make1_str("-"), $2); }
5579 | a_expr '+' ecpg_expr
5580 { $$ = cat3_str($1, make1_str("+"), $3); }
5581 | a_expr '-' ecpg_expr
5582 { $$ = cat3_str($1, make1_str("-"), $3); }
5583 | a_expr '/' ecpg_expr
5584 { $$ = cat3_str($1, make1_str("/"), $3); }
5585 | a_expr '*' ecpg_expr
5586 { $$ = cat3_str($1, make1_str("*"), $3); }
5587 | a_expr '<' ecpg_expr
5588 { $$ = cat3_str($1, make1_str("<"), $3); }
5589 | a_expr '>' ecpg_expr
5590 { $$ = cat3_str($1, make1_str(">"), $3); }
5591 | a_expr '=' ecpg_expr
5592 { $$ = cat3_str($1, make1_str("="), $3); }
5594 { $$ = cat2_str(make1_str(":"), $2); }*/
5596 { $$ = cat2_str(make1_str(";"), $2); }
5598 { $$ = cat2_str(make1_str("|"), $2); }
5599 | a_expr TYPECAST Typename
5601 $$ = cat3_str($1, make1_str("::"), $3);
5603 | CAST '(' a_expr AS Typename ')'
5605 $$ = cat3_str(make2_str(make1_str("cast("), $3), make1_str("as"), make2_str($5, make1_str(")")));
5607 | '(' a_expr_or_null ')'
5608 { $$ = make3_str(make1_str("("), $2, make1_str(")")); }
5609 | a_expr Op ecpg_expr
5610 { $$ = cat3_str($1, $2, $3); }
5611 | a_expr LIKE ecpg_expr
5612 { $$ = cat3_str($1, make1_str("like"), $3); }
5613 | a_expr NOT LIKE ecpg_expr
5614 { $$ = cat3_str($1, make1_str("not like"), $4); }
5616 { $$ = cat2_str($1, $2); }
5618 { $$ = cat2_str($1, $2); }
5619 | func_name '(' '*' ')'
5621 $$ = cat2_str($1, make1_str("(*)"));
5625 $$ = cat2_str($1, make1_str("()"));
5627 | func_name '(' expr_list ')'
5629 $$ = make4_str($1, make1_str("("), $3, make1_str(")"));
5633 $$ = make1_str("current_date");
5637 $$ = make1_str("current_time");
5639 | CURRENT_TIME '(' Iconst ')'
5642 fprintf(stderr,"CURRENT_TIME(%s) precision not implemented; zero used instead", $3);
5643 $$ = make1_str("current_time");
5647 $$ = make1_str("current_timestamp");
5649 | CURRENT_TIMESTAMP '(' Iconst ')'
5652 fprintf(stderr,"CURRENT_TIMESTAMP(%s) precision not implemented; zero used instead",$3);
5653 $$ = make1_str("current_timestamp");
5657 $$ = make1_str("current_user");
5659 | EXISTS '(' SubSelect ')'
5661 $$ = make3_str(make1_str("exists("), $3, make1_str(")"));
5663 | EXTRACT '(' extract_list ')'
5665 $$ = make3_str(make1_str("extract("), $3, make1_str(")"));
5667 | POSITION '(' position_list ')'
5669 $$ = make3_str(make1_str("position("), $3, make1_str(")"));
5671 | SUBSTRING '(' substr_list ')'
5673 $$ = make3_str(make1_str("substring("), $3, make1_str(")"));
5675 /* various trim expressions are defined in SQL92 - thomas 1997-07-19 */
5676 | TRIM '(' BOTH trim_list ')'
5678 $$ = make3_str(make1_str("trim(both"), $4, make1_str(")"));
5680 | TRIM '(' LEADING trim_list ')'
5682 $$ = make3_str(make1_str("trim(leading"), $4, make1_str(")"));
5684 | TRIM '(' TRAILING trim_list ')'
5686 $$ = make3_str(make1_str("trim(trailing"), $4, make1_str(")"));
5688 | TRIM '(' trim_list ')'
5690 $$ = make3_str(make1_str("trim("), $3, make1_str(")"));
5693 { $$ = cat2_str($1, make1_str("isnull")); }
5695 { $$ = cat2_str($1, make1_str("is null")); }
5697 { $$ = cat2_str($1, make1_str("notnull")); }
5698 | a_expr IS NOT NULL_P
5699 { $$ = cat2_str($1, make1_str("is not null")); }
5700 /* IS TRUE, IS FALSE, etc used to be function calls
5701 * but let's make them expressions to allow the optimizer
5702 * a chance to eliminate them if a_expr is a constant string.
5703 * - thomas 1997-12-22
5707 { $$ = cat2_str($1, make1_str("is true")); }
5709 | a_expr IS NOT FALSE_P
5711 { $$ = cat2_str($1, make1_str("is not false")); }
5715 { $$ = cat2_str($1, make1_str("is false")); }
5717 | a_expr IS NOT TRUE_P
5719 { $$ = cat2_str($1, make1_str("is not true")); }
5721 | a_expr BETWEEN b_expr AND b_expr
5723 $$ = cat5_str($1, make1_str("between"), $3, make1_str("and"), $5);
5725 | a_expr NOT BETWEEN b_expr AND b_expr
5727 $$ = cat5_str($1, make1_str("not between"), $4, make1_str("and"), $6);
5729 | a_expr IN '(' in_expr ')'
5731 $$ = make4_str($1, make1_str("in ("), $4, make1_str(")"));
5733 | a_expr NOT IN '(' not_in_expr ')'
5735 $$ = make4_str($1, make1_str("not in ("), $5, make1_str(")"));
5737 | a_expr Op '(' SubSelect ')'
5739 $$ = cat3_str($1, $2, make3_str(make1_str("("), $4, make1_str(")")));
5741 | a_expr '+' '(' SubSelect ')'
5743 $$ = make4_str($1, make1_str("+("), $4, make1_str(")"));
5745 | a_expr '-' '(' SubSelect ')'
5747 $$ = make4_str($1, make1_str("-("), $4, make1_str(")"));
5749 | a_expr '/' '(' SubSelect ')'
5751 $$ = make4_str($1, make1_str("/("), $4, make1_str(")"));
5753 | a_expr '*' '(' SubSelect ')'
5755 $$ = make4_str($1, make1_str("*("), $4, make1_str(")"));
5757 | a_expr '<' '(' SubSelect ')'
5759 $$ = make4_str($1, make1_str("<("), $4, make1_str(")"));
5761 | a_expr '>' '(' SubSelect ')'
5763 $$ = make4_str($1, make1_str(">("), $4, make1_str(")"));
5765 | a_expr '=' '(' SubSelect ')'
5767 $$ = make4_str($1, make1_str("=("), $4, make1_str(")"));
5769 | a_expr Op ANY '(' SubSelect ')'
5771 $$ = cat3_str($1, $2, make3_str(make1_str("any ("), $5, make1_str(")")));
5773 | a_expr '+' ANY '(' SubSelect ')'
5775 $$ = make4_str($1, make1_str("+any("), $5, make1_str(")"));
5777 | a_expr '-' ANY '(' SubSelect ')'
5779 $$ = make4_str($1, make1_str("-any("), $5, make1_str(")"));
5781 | a_expr '/' ANY '(' SubSelect ')'
5783 $$ = make4_str($1, make1_str("/any("), $5, make1_str(")"));
5785 | a_expr '*' ANY '(' SubSelect ')'
5787 $$ = make4_str($1, make1_str("*any("), $5, make1_str(")"));
5789 | a_expr '<' ANY '(' SubSelect ')'
5791 $$ = make4_str($1, make1_str("<any("), $5, make1_str(")"));
5793 | a_expr '>' ANY '(' SubSelect ')'
5795 $$ = make4_str($1, make1_str(">any("), $5, make1_str(")"));
5797 | a_expr '=' ANY '(' SubSelect ')'
5799 $$ = make4_str($1, make1_str("=any("), $5, make1_str(")"));
5801 | a_expr Op ALL '(' SubSelect ')'
5803 $$ = make3_str($1, $2, make3_str(make1_str("all ("), $5, make1_str(")")));
5805 | a_expr '+' ALL '(' SubSelect ')'
5807 $$ = make4_str($1, make1_str("+all("), $5, make1_str(")"));
5809 | a_expr '-' ALL '(' SubSelect ')'
5811 $$ = make4_str($1, make1_str("-all("), $5, make1_str(")"));
5813 | a_expr '/' ALL '(' SubSelect ')'
5815 $$ = make4_str($1, make1_str("/all("), $5, make1_str(")"));
5817 | a_expr '*' ALL '(' SubSelect ')'
5819 $$ = make4_str($1, make1_str("*all("), $5, make1_str(")"));
5821 | a_expr '<' ALL '(' SubSelect ')'
5823 $$ = make4_str($1, make1_str("<all("), $5, make1_str(")"));
5825 | a_expr '>' ALL '(' SubSelect ')'
5827 $$ = make4_str($1, make1_str(">all("), $5, make1_str(")"));
5829 | a_expr '=' ALL '(' SubSelect ')'
5831 $$ = make4_str($1, make1_str("=all("), $5, make1_str(")"));
5833 | a_expr AND ecpg_expr
5834 { $$ = cat3_str($1, make1_str("and"), $3); }
5835 | a_expr OR ecpg_expr
5836 { $$ = cat3_str($1, make1_str("or"), $3); }
5838 { $$ = cat2_str(make1_str("not"), $2); }
5843 into_list : coutputvariable | into_list ',' coutputvariable;
5845 ecpgstart: SQL_START { reset_variables();}
5847 dotext: /* empty */ { $$ = make1_str(""); }
5848 | dotext do_anything { $$ = make2_str($1, $2); }
5850 vartext: var_anything { $$ = $1; }
5851 | vartext var_anything { $$ = make2_str($1, $2); }
5853 coutputvariable : cvariable indicator {
5854 add_variable(&argsresult, find_variable($1), ($2 == NULL) ? &no_indicator : find_variable($2));
5857 cinputvariable : cvariable indicator {
5858 add_variable(&argsinsert, find_variable($1), ($2 == NULL) ? &no_indicator : find_variable($2));
5861 civariableonly : cvariable {
5862 add_variable(&argsinsert, find_variable($1), &no_indicator);
5863 $$ = make1_str("?");
5866 cvariable: CVARIABLE { $$ = $1; }
5868 indicator: /* empty */ { $$ = NULL; }
5869 | cvariable { check_indicator((find_variable($1))->type); $$ = $1; }
5870 | SQL_INDICATOR cvariable { check_indicator((find_variable($2))->type); $$ = $2; }
5871 | SQL_INDICATOR name { check_indicator((find_variable($2))->type); $$ = $2; }
5873 ident: IDENT { $$ = $1; }
5874 | CSTRING { $$ = $1; }
5879 symbol: IDENT { $$ = $1; }
5881 cpp_line: CPP_LINE { $$ = $1; }
5883 c_line: c_anything { $$ = $1; }
5886 $$ = make2_str($1, $2);
5889 c_thing: c_anything | ';' { $$ = make1_str(";"); }
5891 c_anything: IDENT { $$ = $1; }
5892 | CSTRING { $$ = make3_str(make1_str("\""), $1, make1_str("\"")); }
5893 | Iconst { $$ = $1; }
5894 | Fconst { $$ = $1; }
5895 | '*' { $$ = make1_str("*"); }
5896 | S_AUTO { $$ = make1_str("auto"); }
5897 | S_BOOL { $$ = make1_str("bool"); }
5898 | S_CHAR { $$ = make1_str("char"); }
5899 | S_CONST { $$ = make1_str("const"); }
5900 | S_DOUBLE { $$ = make1_str("double"); }
5901 | S_ENUM { $$ = make1_str("enum"); }
5902 | S_EXTERN { $$ = make1_str("extern"); }
5903 | S_FLOAT { $$ = make1_str("float"); }
5904 | S_INT { $$ = make1_str("int"); }
5905 | S_LONG { $$ = make1_str("long"); }
5906 | S_REGISTER { $$ = make1_str("register"); }
5907 | S_SHORT { $$ = make1_str("short"); }
5908 | S_SIGNED { $$ = make1_str("signed"); }
5909 | S_STATIC { $$ = make1_str("static"); }
5910 | S_STRUCT { $$ = make1_str("struct"); }
5911 | S_UNION { $$ = make1_str("union"); }
5912 | S_UNSIGNED { $$ = make1_str("unsigned"); }
5913 | S_VARCHAR { $$ = make1_str("varchar"); }
5914 | S_ANYTHING { $$ = make_name(); }
5915 | '[' { $$ = make1_str("["); }
5916 | ']' { $$ = make1_str("]"); }
5917 | '(' { $$ = make1_str("("); }
5918 | ')' { $$ = make1_str(")"); }
5919 | '=' { $$ = make1_str("="); }
5920 | ',' { $$ = make1_str(","); }
5922 do_anything: IDENT { $$ = $1; }
5923 | CSTRING { $$ = make3_str(make1_str("\""), $1, make1_str("\""));}
5924 | Iconst { $$ = $1; }
5925 | Fconst { $$ = $1; }
5926 | ',' { $$ = make1_str(","); }
5928 var_anything: IDENT { $$ = $1; }
5929 | CSTRING { $$ = make3_str(make1_str("\""), $1, make1_str("\"")); }
5930 | Iconst { $$ = $1; }
5931 | Fconst { $$ = $1; }
5932 | '{' c_line '}' { $$ = make3_str(make1_str("{"), $2, make1_str("}")); }
5936 $$ = make1_str("{");
5940 remove_variables(braces_open--);
5941 $$ = make1_str("}");
5946 void yyerror(char * error)
5948 fprintf(stderr, "%s:%d: %s\n", input_filename, yylineno, error);