1 /* Copyright comment */
8 #include "access/htup.h"
9 #include "catalog/catname.h"
10 #include "utils/numeric.h"
15 #include "mb/pg_wchar.h"
18 #define STRUCT_DEPTH 128
21 * Variables containing simple states.
25 static char *connection = NULL;
26 static int QueryIsRule = 0, ForUpdateNotAllowed = 0;
27 static struct this_type actual_type[STRUCT_DEPTH];
28 static char *actual_storage[STRUCT_DEPTH];
30 /* temporarily store struct members while creating the data structure */
31 struct ECPGstruct_member *struct_member_list[STRUCT_DEPTH] = { NULL };
33 struct ECPGtype ecpg_no_indicator = {ECPGt_NO_INDICATOR, 0L, {NULL}};
34 struct variable no_indicator = {"no_indicator", &ecpg_no_indicator, 0, NULL};
36 struct ECPGtype ecpg_query = {ECPGt_char_variable, 0L, {NULL}};
39 * Handle the filename and line numbering.
41 char * input_filename = NULL;
47 fprintf(yyout, "\n#line %d \"%s\"\n", yylineno + 1, input_filename);
51 output_simple_statement(char *cmd)
59 * store the whenever action here
61 static struct when when_error, when_nf, when_warn;
64 print_action(struct when *w)
68 case W_SQLPRINT: fprintf(yyout, "sqlprint();");
70 case W_GOTO: fprintf(yyout, "goto %s;", w->command);
72 case W_DO: fprintf(yyout, "%s;", w->command);
74 case W_STOP: fprintf(yyout, "exit (1);");
76 case W_BREAK: fprintf(yyout, "break;");
78 default: fprintf(yyout, "{/* %d not implemented yet */}", w->code);
84 whenever_action(int mode)
86 if ((mode&1) == 1 && when_nf.code != W_NOTHING)
89 fprintf(yyout, "\nif (sqlca.sqlcode == ECPG_NOT_FOUND) ");
90 print_action(&when_nf);
92 if (when_warn.code != W_NOTHING)
95 fprintf(yyout, "\nif (sqlca.sqlwarn[0] == 'W') ");
96 print_action(&when_warn);
98 if (when_error.code != W_NOTHING)
100 output_line_number();
101 fprintf(yyout, "\nif (sqlca.sqlcode < 0) ");
102 print_action(&when_error);
106 output_line_number();
110 * Handling of variables.
114 * brace level counter
118 static struct variable * allvariables = NULL;
120 static struct variable *
121 new_variable(const char * name, struct ECPGtype * type)
123 struct variable * p = (struct variable*) mm_alloc(sizeof(struct variable));
125 p->name = mm_strdup(name);
127 p->brace_level = braces_open;
129 p->next = allvariables;
135 static struct variable * find_variable(char * name);
137 static struct variable *
138 find_struct_member(char *name, char *str, struct ECPGstruct_member *members)
140 char *next = strchr(++str, '.'), c = '\0';
148 for (; members; members = members->next)
150 if (strcmp(members->name, str) == 0)
155 switch (members->typ->typ)
158 return(new_variable(name, ECPGmake_array_type(members->typ->u.element, members->typ->size)));
161 return(new_variable(name, ECPGmake_struct_type(members->typ->u.members, members->typ->typ)));
163 return(new_variable(name, ECPGmake_simple_type(members->typ->typ, members->typ->size)));
172 return(find_struct_member(name, next, members->typ->u.element->u.members));
174 else return(find_struct_member(name, next, members->typ->u.members));
182 static struct variable *
183 find_struct(char * name, char *next)
188 /* first get the mother structure entry */
190 p = find_variable(name);
194 if (p->type->typ != ECPGt_struct && p->type->typ != ECPGt_union)
196 sprintf(errortext, "variable %s is not a pointer", name);
200 if (p->type->u.element->typ != ECPGt_struct && p->type->u.element->typ != ECPGt_union)
202 sprintf(errortext, "variable %s is not a pointer to a structure or a union", name);
206 /* restore the name, we will need it later on */
210 return find_struct_member(name, next, p->type->u.element->u.members);
214 if (p->type->typ != ECPGt_struct && p->type->typ != ECPGt_union)
216 sprintf(errortext, "variable %s is neither a structure nor a union", name);
220 /* restore the name, we will need it later on */
223 return find_struct_member(name, next, p->type->u.members);
227 static struct variable *
228 find_simple(char * name)
232 for (p = allvariables; p; p = p->next)
234 if (strcmp(p->name, name) == 0)
241 /* Note that this function will end the program in case of an unknown */
243 static struct variable *
244 find_variable(char * name)
249 if ((next = strchr(name, '.')) != NULL)
250 p = find_struct(name, next);
251 else if ((next = strstr(name, "->")) != NULL)
252 p = find_struct(name, next);
254 p = find_simple(name);
258 sprintf(errortext, "The variable %s is not declared", name);
266 remove_variables(int brace_level)
268 struct variable * p, *prev;
270 for (p = prev = allvariables; p; p = p ? p->next : NULL)
272 if (p->brace_level >= brace_level)
275 if (p == allvariables)
276 prev = allvariables = p->next;
278 prev->next = p->next;
280 ECPGfree_type(p->type);
292 * Here are the variables that need to be handled on every request.
293 * These are of two kinds: input and output.
294 * I will make two lists for them.
297 struct arguments * argsinsert = NULL;
298 struct arguments * argsresult = NULL;
301 reset_variables(void)
308 /* Add a variable to a request. */
310 add_variable(struct arguments ** list, struct variable * var, struct variable * ind)
312 struct arguments * p = (struct arguments *)mm_alloc(sizeof(struct arguments));
320 /* Dump out a list of all the variable on this list.
321 This is a recursive function that works from the end of the list and
322 deletes the list as we go on.
325 dump_variables(struct arguments * list, int mode)
332 /* The list is build up from the beginning so lets first dump the
336 dump_variables(list->next, mode);
338 /* Then the current element and its indicator */
339 ECPGdump_a_type(yyout, list->variable->name, list->variable->type,
340 (list->indicator->type->typ != ECPGt_NO_INDICATOR) ? list->indicator->name : NULL,
341 (list->indicator->type->typ != ECPGt_NO_INDICATOR) ? list->indicator->type : NULL, NULL, NULL);
343 /* Then release the list element. */
349 check_indicator(struct ECPGtype *var)
351 /* make sure this is a valid indicator variable */
354 struct ECPGstruct_member *p;
359 case ECPGt_unsigned_short:
360 case ECPGt_unsigned_int:
361 case ECPGt_unsigned_long:
366 for (p = var->u.members; p; p = p->next)
367 check_indicator(p->typ);
371 check_indicator(var->u.element);
374 yyerror ("indicator variable must be integer type");
380 make1_str(const char *str)
382 char * res_str = (char *)mm_alloc(strlen(str) + 1);
384 strcpy(res_str, str);
389 make2_str(char *str1, char *str2)
391 char * res_str = (char *)mm_alloc(strlen(str1) + strlen(str2) + 1);
393 strcpy(res_str, str1);
394 strcat(res_str, str2);
401 cat2_str(char *str1, char *str2)
403 char * res_str = (char *)mm_alloc(strlen(str1) + strlen(str2) + 2);
405 strcpy(res_str, str1);
406 strcat(res_str, " ");
407 strcat(res_str, str2);
414 make3_str(char *str1, char *str2, char * str3)
416 char * res_str = (char *)mm_alloc(strlen(str1) + strlen(str2) + strlen(str3) + 1);
418 strcpy(res_str, str1);
419 strcat(res_str, str2);
420 strcat(res_str, str3);
428 cat3_str(char *str1, char *str2, char * str3)
430 char * res_str = (char *)mm_alloc(strlen(str1) + strlen(str2) + strlen(str3) + 3);
432 strcpy(res_str, str1);
433 strcat(res_str, " ");
434 strcat(res_str, str2);
435 strcat(res_str, " ");
436 strcat(res_str, str3);
444 make4_str(char *str1, char *str2, char *str3, char *str4)
446 char * res_str = (char *)mm_alloc(strlen(str1) + strlen(str2) + strlen(str3) + strlen(str4) + 1);
448 strcpy(res_str, str1);
449 strcat(res_str, str2);
450 strcat(res_str, str3);
451 strcat(res_str, str4);
460 cat4_str(char *str1, char *str2, char *str3, char *str4)
462 char * res_str = (char *)mm_alloc(strlen(str1) + strlen(str2) + strlen(str3) + strlen(str4) + 4);
464 strcpy(res_str, str1);
465 strcat(res_str, " ");
466 strcat(res_str, str2);
467 strcat(res_str, " ");
468 strcat(res_str, str3);
469 strcat(res_str, " ");
470 strcat(res_str, str4);
479 make5_str(char *str1, char *str2, char *str3, char *str4, char *str5)
481 char * res_str = (char *)mm_alloc(strlen(str1) + strlen(str2) + strlen(str3) + strlen(str4) + strlen(str5) + 1);
483 strcpy(res_str, str1);
484 strcat(res_str, str2);
485 strcat(res_str, str3);
486 strcat(res_str, str4);
487 strcat(res_str, str5);
497 cat5_str(char *str1, char *str2, char *str3, char *str4, char *str5)
499 char * res_str = (char *)mm_alloc(strlen(str1) + strlen(str2) + strlen(str3) + strlen(str4) + strlen(str5) + 5);
501 strcpy(res_str, str1);
502 strcat(res_str, " ");
503 strcat(res_str, str2);
504 strcat(res_str, " ");
505 strcat(res_str, str3);
506 strcat(res_str, " ");
507 strcat(res_str, str4);
508 strcat(res_str, " ");
509 strcat(res_str, str5);
521 char * name = (char *)mm_alloc(yyleng + 1);
523 strncpy(name, yytext, yyleng);
529 output_statement(char * stmt, int mode)
531 int i, j=strlen(stmt);
533 fprintf(yyout, "{ ECPGdo(__LINE__, %s, \"", connection ? connection : "NULL");
535 /* do this char by char as we have to filter '\"' */
536 for (i = 0;i < j; i++)
538 fputc(stmt[i], yyout);
539 fputs("\", ", yyout);
541 /* dump variables to C file*/
542 dump_variables(argsinsert, 1);
543 fputs("ECPGt_EOIT, ", yyout);
544 dump_variables(argsresult, 1);
545 fputs("ECPGt_EORT);", yyout);
547 whenever_action(mode);
549 if (connection != NULL)
553 static struct typedefs *
554 get_typedef(char *name)
556 struct typedefs *this;
558 for (this = types; this && strcmp(this->name, name); this = this->next);
561 sprintf(errortext, "invalid datatype '%s'", name);
569 adjust_array(enum ECPGttype type_enum, int *dimension, int *length, int type_dimension, int type_index, bool pointer)
574 yyerror("No multi-dimensional array support");
576 *length = type_index;
579 if (type_dimension >= 0)
581 if (*dimension >= 0 && *length >= 0)
582 yyerror("No multi-dimensional array support");
585 *length = *dimension;
587 *dimension = type_dimension;
590 if (*length >= 0 && *dimension >= 0 && pointer)
591 yyerror("No multi-dimensional array support");
597 /* pointer has to get dimension 0 */
600 *length = *dimension;
605 yyerror("No multi-dimensional array support for structures");
609 /* pointer has to get dimension 0 */
613 /* one index is the string length */
616 *length = *dimension;
622 case ECPGt_unsigned_char:
623 /* pointer has to get length 0 */
627 /* one index is the string length */
630 *length = (*dimension < 0) ? 1 : *dimension;
636 /* a pointer has dimension = 0 */
638 *length = *dimension;
643 yyerror("No multi-dimensional array support for simple data types");
658 struct this_type type;
659 enum ECPGttype type_enum;
662 /* special embedded SQL token */
663 %token SQL_AT SQL_AUTOCOMMIT SQL_BOOL SQL_BREAK
664 %token SQL_CALL SQL_CONNECT SQL_CONNECTION SQL_CONTINUE
665 %token SQL_DEALLOCATE SQL_DISCONNECT SQL_ENUM
666 %token SQL_FOUND SQL_FREE SQL_GO SQL_GOTO
667 %token SQL_IDENTIFIED SQL_IMMEDIATE SQL_INDICATOR SQL_INT SQL_LONG
668 %token SQL_OFF SQL_OPEN SQL_PREPARE SQL_RELEASE SQL_REFERENCE
669 %token SQL_SECTION SQL_SHORT SQL_SIGNED SQL_SQLERROR SQL_SQLPRINT
670 %token SQL_SQLWARNING SQL_START SQL_STOP SQL_STRUCT SQL_UNSIGNED
671 %token SQL_VAR SQL_WHENEVER
674 %token S_ANYTHING S_AUTO S_BOOL S_CHAR S_CONST S_DOUBLE S_ENUM S_EXTERN
675 %token S_FLOAT S_INT S
676 %token S_LONG S_REGISTER S_SHORT S_SIGNED S_STATIC S_STRUCT
677 %token S_UNION S_UNSIGNED S_VARCHAR
679 /* I need this and don't know where it is defined inside the backend */
682 /* Keywords (in SQL92 reserved words) */
683 %token ABSOLUTE, ACTION, ADD, ALL, ALTER, AND, ANY, AS, ASC,
684 BEGIN_TRANS, BETWEEN, BOTH, BY,
685 CASCADE, CASE, CAST, CHAR, CHARACTER, CHECK, CLOSE,
686 COALESCE, COLLATE, COLUMN, COMMIT,
687 CONSTRAINT, CREATE, CROSS, CURRENT, CURRENT_DATE, CURRENT_TIME,
688 CURRENT_TIMESTAMP, CURRENT_USER, CURSOR,
689 DAY_P, DECIMAL, DECLARE, DEFAULT, DELETE, DESC, DISTINCT, DOUBLE, DROP,
690 ELSE, END_TRANS, EXCEPT, EXECUTE, EXISTS, EXTRACT,
691 FALSE_P, FETCH, FLOAT, FOR, FOREIGN, FROM, FULL,
692 GLOBAL, GRANT, GROUP, HAVING, HOUR_P,
693 IN, INNER_P, INSENSITIVE, INSERT, INTERSECT, INTERVAL, INTO, IS,
694 ISOLATION, JOIN, KEY, LANGUAGE, LEADING, LEFT, LEVEL, LIKE, LOCAL,
695 MATCH, MINUTE_P, MONTH_P, NAMES,
696 NATIONAL, NATURAL, NCHAR, NEXT, NO, NOT, NULLIF, NULL_P, NUMERIC,
697 OF, ON, ONLY, OPTION, OR, ORDER, OUTER_P,
698 PARTIAL, POSITION, PRECISION, PRIMARY, PRIOR, PRIVILEGES, PROCEDURE, PUBLIC,
699 READ, REFERENCES, RELATIVE, REVOKE, RIGHT, ROLLBACK,
700 SCROLL, SECOND_P, SELECT, SET, SUBSTRING,
701 TABLE, TEMP, TEMPORARY, THEN, TIME, TIMESTAMP, TIMEZONE_HOUR,
702 TIMEZONE_MINUTE, TO, TRAILING, TRANSACTION, TRIM, TRUE_P,
703 UNION, UNIQUE, UPDATE, USER, USING,
704 VALUES, VARCHAR, VARYING, VIEW,
705 WHEN, WHERE, WITH, WORK, YEAR_P, ZONE
707 /* Keywords (in SQL3 reserved words) */
710 /* Keywords (in SQL92 non-reserved words) */
711 %token COMMITTED, SERIALIZABLE, TYPE_P
713 /* Keywords for Postgres support (not in SQL92 reserved words)
715 * The CREATEDB and CREATEUSER tokens should go away
716 * when some sort of pg_privileges relation is introduced.
717 * - Todd A. Brandys 1998-01-01?
719 %token ABORT_TRANS, ACCESS, AFTER, AGGREGATE, ANALYZE,
720 BACKWARD, BEFORE, BINARY,
721 CACHE, CLUSTER, COPY, CREATEDB, CREATEUSER, CYCLE,
722 DATABASE, DELIMITERS, DO,
723 EACH, ENCODING, EXCLUSIVE, EXPLAIN, EXTEND,
724 FORWARD, FUNCTION, HANDLER,
725 INCREMENT, INDEX, INHERITS, INSTEAD, ISNULL,
726 LANCOMPILER, LIMIT, LISTEN, UNLISTEN, LOAD, LOCATION, LOCK_P,
727 MAXVALUE, MINVALUE, MODE, MOVE,
728 NEW, NOCREATEDB, NOCREATEUSER, NONE, NOTHING, NOTIFY, NOTNULL,
729 OFFSET, OIDS, OPERATOR, PASSWORD, PROCEDURAL,
730 RENAME, RESET, RETURNS, ROW, RULE,
731 SERIAL, SEQUENCE, SETOF, SHARE, SHOW, START, STATEMENT, STDIN, STDOUT,
733 UNLISTEN, UNTIL, VACUUM, VALID, VERBOSE, VERSION
735 /* Special keywords, not in the query language - see the "lex" file */
736 %token <str> IDENT SCONST Op CSTRING CVARIABLE CPP_LINE
737 %token <ival> ICONST PARAM
740 /* these are not real. they are here so that they get generated as #define's*/
752 %left Op /* multi-character ops and user-defined operators */
759 %left '|' /* this is the relation union op, not logical or */
760 /* Unary Operators */
762 %left ';' /* end of statement or natural log */
767 %left UNION INTERSECT EXCEPT
769 %type <str> Iconst Fconst Sconst TransactionStmt CreateStmt UserId
770 %type <str> CreateAsElement OptCreateAs CreateAsList CreateAsStmt
771 %type <str> OptInherit key_reference key_action
772 %type <str> key_match constraint_expr ColLabel SpecialRuleRelation
773 %type <str> ColId default_expr ColQualifier columnDef ColQualList
774 %type <str> ColConstraint ColConstraintElem default_list NumericOnly FloatOnly
775 %type <str> OptTableElementList OptTableElement TableConstraint
776 %type <str> ConstraintElem key_actions constraint_list ColPrimaryKey
777 %type <str> res_target_list res_target_el res_target_list2
778 %type <str> res_target_el2 opt_id relation_name database_name
779 %type <str> access_method attr_name class index_name name func_name
780 %type <str> file_name AexprConst ParamNo TypeId
781 %type <str> in_expr_nodes not_in_expr_nodes a_expr b_expr
782 %type <str> opt_indirection expr_list extract_list extract_arg
783 %type <str> position_list position_expr substr_list substr_from
784 %type <str> trim_list in_expr substr_for not_in_expr attr attrs
785 %type <str> Typename Array Generic Numeric generic opt_float opt_numeric
786 %type <str> opt_decimal Character character opt_varying opt_charset
787 %type <str> opt_collate Datetime datetime opt_timezone opt_interval
788 %type <str> numeric a_expr_or_null row_expr row_descriptor row_list
789 %type <str> SelectStmt SubSelect result OptTemp OptTempType OptTempScope
790 %type <str> opt_table opt_union opt_unique sort_clause sortby_list
791 %type <str> sortby OptUseOp opt_inh_star relation_name_list name_list
792 %type <str> group_clause having_clause from_clause c_list
793 %type <str> table_list join_outer where_clause relation_expr row_op sub_type
794 %type <str> opt_column_list insert_rest InsertStmt OptimizableStmt
795 %type <str> columnList DeleteStmt LockStmt UpdateStmt CursorStmt
796 %type <str> NotifyStmt columnElem copy_dirn c_expr UnlistenStmt
797 %type <str> copy_delimiter ListenStmt CopyStmt copy_file_name opt_binary
798 %type <str> opt_with_copy FetchStmt opt_direction fetch_how_many opt_portal_name
799 %type <str> ClosePortalStmt DestroyStmt VacuumStmt opt_verbose
800 %type <str> opt_analyze opt_va_list va_list ExplainStmt index_params
801 %type <str> index_list func_index index_elem opt_type opt_class access_method_clause
802 %type <str> index_opt_unique IndexStmt set_opt func_return def_rest
803 %type <str> func_args_list func_args opt_with ProcedureStmt def_arg
804 %type <str> def_elem def_list definition def_name def_type DefineStmt
805 %type <str> opt_instead event event_object RuleActionList,
806 %type <str> RuleActionBlock RuleActionMulti join_list
807 %type <str> RuleStmt opt_column opt_name oper_argtypes
808 %type <str> MathOp RemoveFuncStmt aggr_argtype for_update_clause
809 %type <str> RemoveAggrStmt remove_type RemoveStmt ExtendStmt
810 %type <str> RemoveOperStmt RenameStmt all_Op user_valid_clause
811 %type <str> VariableSetStmt var_value zone_value VariableShowStmt
812 %type <str> VariableResetStmt AddAttrStmt alter_clause DropUserStmt
813 %type <str> user_passwd_clause user_createdb_clause opt_trans
814 %type <str> user_createuser_clause user_group_list user_group_clause
815 %type <str> CreateUserStmt AlterUserStmt CreateSeqStmt OptSeqList
816 %type <str> OptSeqElem TriggerForSpec TriggerForOpt TriggerForType
817 %type <str> DropTrigStmt TriggerOneEvent TriggerEvents RuleActionStmt
818 %type <str> TriggerActionTime CreateTrigStmt DropPLangStmt PLangTrusted
819 %type <str> CreatePLangStmt IntegerOnly TriggerFuncArgs TriggerFuncArg
820 %type <str> ViewStmt LoadStmt CreatedbStmt opt_database1 opt_database2 location
821 %type <str> DestroydbStmt ClusterStmt grantee RevokeStmt encoding
822 %type <str> GrantStmt privileges operation_commalist operation
823 %type <str> opt_cursor opt_lmode
824 %type <str> case_expr when_clause_list case_default case_arg when_clause
825 %type <str> select_clause opt_select_limit select_limit_value
826 %type <str> select_offset_value table_list using_expr join_expr
827 %type <str> using_list from_expr table_expr join_clause join_type
828 %type <str> join_qual update_list join_clause join_clause_with_union
829 %type <str> opt_level opt_lock lock_type
831 %type <str> ECPGWhenever ECPGConnect connection_target ECPGOpen opt_using
832 %type <str> indicator ECPGExecute ecpg_expr dotext ECPGPrepare
833 %type <str> storage_clause opt_initializer vartext c_anything blockstart
834 %type <str> blockend variable_list variable var_anything do_anything
835 %type <str> opt_pointer cvariable ECPGDisconnect dis_name
836 %type <str> stmt symbol opt_symbol ECPGRelease execstring server_name
837 %type <str> connection_object opt_server opt_port c_thing opt_reference
838 %type <str> user_name opt_user char_variable ora_user ident
839 %type <str> db_prefix server opt_options opt_connection_name
840 %type <str> ECPGSetConnection c_line cpp_line s_enum ECPGTypedef
841 %type <str> enum_type civariableonly ECPGCursorStmt ECPGDeallocate
842 %type <str> ECPGFree ECPGDeclare ECPGVar sql_variable_declarations
843 %type <str> sql_declaration sql_variable_list sql_variable opt_at
844 %type <str> struct_type s_struct declaration variable_declarations
845 %type <str> s_struct s_union union_type ECPGSetAutocommit on_off
847 %type <type_enum> simple_type varchar_type
849 %type <type> type ctype
851 %type <action> action
853 %type <index> opt_array_bounds nest_array_bounds opt_type_array_bounds
854 %type <index> nest_type_array_bounds
860 statements: /* empty */
861 | statements statement
863 statement: ecpgstart opt_at stmt ';' { connection = NULL; }
866 | c_thing { fprintf(yyout, "%s", $1); free($1); }
867 | cpp_line { fprintf(yyout, "%s", $1); free($1); }
868 | blockstart { fputs($1, yyout); free($1); }
869 | blockend { fputs($1, yyout); free($1); }
871 opt_at: SQL_AT connection_target { connection = $2; }
873 stmt: AddAttrStmt { output_statement($1, 0); }
874 | AlterUserStmt { output_statement($1, 0); }
875 | ClosePortalStmt { output_statement($1, 0); }
876 | CopyStmt { output_statement($1, 0); }
877 | CreateStmt { output_statement($1, 0); }
878 | CreateAsStmt { output_statement($1, 0); }
879 | CreateSeqStmt { output_statement($1, 0); }
880 | CreatePLangStmt { output_statement($1, 0); }
881 | CreateTrigStmt { output_statement($1, 0); }
882 | CreateUserStmt { output_statement($1, 0); }
883 | ClusterStmt { output_statement($1, 0); }
884 | DefineStmt { output_statement($1, 0); }
885 | DestroyStmt { output_statement($1, 0); }
886 | DropPLangStmt { output_statement($1, 0); }
887 | DropTrigStmt { output_statement($1, 0); }
888 | DropUserStmt { output_statement($1, 0); }
889 | ExtendStmt { output_statement($1, 0); }
890 | ExplainStmt { output_statement($1, 0); }
891 | FetchStmt { output_statement($1, 1); }
892 | GrantStmt { output_statement($1, 0); }
893 | IndexStmt { output_statement($1, 0); }
894 | ListenStmt { output_statement($1, 0); }
895 | UnlistenStmt { output_statement($1, 0); }
896 | LockStmt { output_statement($1, 0); }
897 | ProcedureStmt { output_statement($1, 0); }
898 | RemoveAggrStmt { output_statement($1, 0); }
899 | RemoveOperStmt { output_statement($1, 0); }
900 | RemoveFuncStmt { output_statement($1, 0); }
901 | RemoveStmt { output_statement($1, 0); }
902 | RenameStmt { output_statement($1, 0); }
903 | RevokeStmt { output_statement($1, 0); }
905 if (strncmp($1, "/* " , sizeof("/* ")-1) == 0)
906 output_simple_statement($1);
908 output_statement($1, 1);
910 | RuleStmt { output_statement($1, 0); }
912 fprintf(yyout, "{ ECPGtrans(__LINE__, %s, \"%s\");", connection ? connection : "NULL", $1);
916 | ViewStmt { output_statement($1, 0); }
917 | LoadStmt { output_statement($1, 0); }
918 | CreatedbStmt { output_statement($1, 0); }
919 | DestroydbStmt { output_statement($1, 0); }
920 | VacuumStmt { output_statement($1, 0); }
921 | VariableSetStmt { output_statement($1, 0); }
922 | VariableShowStmt { output_statement($1, 0); }
923 | VariableResetStmt { output_statement($1, 0); }
926 yyerror("no at option for connect statement.\n");
928 fprintf(yyout, "{ ECPGconnect(__LINE__, %s, %d);", $1, autocommit);
933 output_simple_statement($1);
937 yyerror("no at option for connect statement.\n");
945 output_simple_statement($1);
949 yyerror("no at option for disconnect statement.\n");
951 fprintf(yyout, "{ ECPGdisconnect(__LINE__, \"%s\");", $1);
956 output_statement($1, 0);
959 fprintf(yyout, "{ ECPGdeallocate(__LINE__, %s, \"%s\");", connection ? connection : "NULL", $1);
966 for (ptr = cur; ptr != NULL; ptr=ptr->next)
968 if (strcmp(ptr->name, $1) == 0)
974 sprintf(errortext, "trying to open undeclared cursor %s\n", $1);
978 fprintf(yyout, "{ ECPGdo(__LINE__, %s, \"%s\",", ptr->connection ? ptr->connection : "NULL", ptr->command);
979 /* dump variables to C file*/
980 dump_variables(ptr->argsinsert, 0);
981 dump_variables(argsinsert, 0);
982 fputs("ECPGt_EOIT, ", yyout);
983 dump_variables(ptr->argsresult, 0);
984 fputs("ECPGt_EORT);", yyout);
990 yyerror("no at option for set connection statement.\n");
992 fprintf(yyout, "{ ECPGprepare(__LINE__, %s);", $1);
996 | ECPGRelease { /* output already done */ }
997 | ECPGSetAutocommit {
998 fprintf(yyout, "{ ECPGsetcommit(__LINE__, \"%s\", %s);", $1, connection ? connection : "NULL");
1002 | ECPGSetConnection {
1004 yyerror("no at option for set connection statement.\n");
1006 fprintf(yyout, "{ ECPGsetconn(__LINE__, %s);", $1);
1012 yyerror("no at option for typedef statement.\n");
1014 output_simple_statement($1);
1018 yyerror("no at option for var statement.\n");
1020 output_simple_statement($1);
1024 yyerror("no at option for whenever statement.\n");
1026 output_simple_statement($1);
1032 * We start with a lot of stuff that's very similar to the backend's parsing
1035 /*****************************************************************************
1037 * Create a new Postgres DBMS user
1040 *****************************************************************************/
1042 CreateUserStmt: CREATE USER UserId user_passwd_clause user_createdb_clause
1043 user_createuser_clause user_group_clause user_valid_clause
1045 $$ = cat3_str(cat5_str(make1_str("create user"), $3, $4, $5, $6), $7, $8);
1049 /*****************************************************************************
1051 * Alter a postresql DBMS user
1054 *****************************************************************************/
1056 AlterUserStmt: ALTER USER UserId user_passwd_clause user_createdb_clause
1057 user_createuser_clause user_group_clause user_valid_clause
1059 $$ = cat3_str(cat5_str(make1_str("alter user"), $3, $4, $5, $6), $7, $8);
1063 /*****************************************************************************
1065 * Drop a postresql DBMS user
1068 *****************************************************************************/
1070 DropUserStmt: DROP USER UserId
1072 $$ = cat2_str(make1_str("drop user"), $3);
1076 user_passwd_clause: WITH PASSWORD UserId { $$ = cat2_str(make1_str("with password") , $3); }
1077 | /*EMPTY*/ { $$ = make1_str(""); }
1080 user_createdb_clause: CREATEDB
1082 $$ = make1_str("createdb");
1086 $$ = make1_str("nocreatedb");
1088 | /*EMPTY*/ { $$ = make1_str(""); }
1091 user_createuser_clause: CREATEUSER
1093 $$ = make1_str("createuser");
1097 $$ = make1_str("nocreateuser");
1099 | /*EMPTY*/ { $$ = NULL; }
1102 user_group_list: user_group_list ',' UserId
1104 $$ = cat3_str($1, make1_str(","), $3);
1112 user_group_clause: IN GROUP user_group_list { $$ = cat2_str(make1_str("in group"), $3); }
1113 | /*EMPTY*/ { $$ = make1_str(""); }
1116 user_valid_clause: VALID UNTIL Sconst { $$ = cat2_str(make1_str("valid until"), $3); }
1117 | /*EMPTY*/ { $$ = make1_str(""); }
1120 /*****************************************************************************
1122 * Set PG internal variable
1123 * SET name TO 'var_value'
1124 * Include SQL92 syntax (thomas 1997-10-22):
1125 * SET TIME ZONE 'var_value'
1127 *****************************************************************************/
1129 VariableSetStmt: SET ColId TO var_value
1131 $$ = cat4_str(make1_str("set"), $2, make1_str("to"), $4);
1133 | SET ColId '=' var_value
1135 $$ = cat4_str(make1_str("set"), $2, make1_str("="), $4);
1137 | SET TIME ZONE zone_value
1139 $$ = cat2_str(make1_str("set time zone"), $4);
1141 | SET TRANSACTION ISOLATION LEVEL opt_level
1143 $$ = cat2_str(make1_str("set transaction isolation level"), $5);
1145 | SET NAMES encoding
1148 $$ = cat2_str(make1_str("set names"), $3);
1150 yyerror("SET NAMES is not supported");
1155 opt_level: READ COMMITTED { $$ = make1_str("read committed"); }
1156 | SERIALIZABLE { $$ = make1_str("serializable"); }
1160 var_value: Sconst { $$ = $1; }
1161 | DEFAULT { $$ = make1_str("default"); }
1164 zone_value: Sconst { $$ = $1; }
1165 | DEFAULT { $$ = make1_str("default"); }
1166 | LOCAL { $$ = make1_str("local"); }
1169 VariableShowStmt: SHOW ColId
1171 $$ = cat2_str(make1_str("show"), $2);
1175 $$ = make1_str("show time zone");
1177 | SHOW TRANSACTION ISOLATION LEVEL
1179 $$ = make1_str("show transaction isolation level");
1183 VariableResetStmt: RESET ColId
1185 $$ = cat2_str(make1_str("reset"), $2);
1189 $$ = make1_str("reset time zone");
1191 | RESET TRANSACTION ISOLATION LEVEL
1193 $$ = make1_str("reset transaction isolation level");
1198 /*****************************************************************************
1201 * addattr ( attr1 = type1 .. attrn = typen ) to <relname> [*]
1203 *****************************************************************************/
1205 AddAttrStmt: ALTER TABLE relation_name opt_inh_star alter_clause
1207 $$ = cat4_str(make1_str("alter table"), $3, $4, $5);
1211 alter_clause: ADD opt_column columnDef
1213 $$ = cat3_str(make1_str("add"), $2, $3);
1215 | ADD '(' OptTableElementList ')'
1217 $$ = make3_str(make1_str("add("), $3, make1_str(")"));
1219 | DROP opt_column ColId
1220 { yyerror("ALTER TABLE/DROP COLUMN not yet implemented"); }
1221 | ALTER opt_column ColId SET DEFAULT default_expr
1222 { yyerror("ALTER TABLE/ALTER COLUMN/SET DEFAULT not yet implemented"); }
1223 | ALTER opt_column ColId DROP DEFAULT
1224 { yyerror("ALTER TABLE/ALTER COLUMN/DROP DEFAULT not yet implemented"); }
1225 | ADD ConstraintElem
1226 { yyerror("ALTER TABLE/ADD CONSTRAINT not yet implemented"); }
1229 /*****************************************************************************
1234 *****************************************************************************/
1236 ClosePortalStmt: CLOSE opt_id
1238 $$ = cat2_str(make1_str("close"), $2);
1243 /*****************************************************************************
1246 * COPY [BINARY] <relname> FROM/TO
1247 * [USING DELIMITERS <delimiter>]
1249 *****************************************************************************/
1251 CopyStmt: COPY opt_binary relation_name opt_with_copy copy_dirn copy_file_name copy_delimiter
1253 $$ = cat3_str(cat5_str(make1_str("copy"), $2, $3, $4, $5), $6, $7);
1258 { $$ = make1_str("to"); }
1260 { $$ = make1_str("from"); }
1264 * copy_file_name NULL indicates stdio is used. Whether stdin or stdout is
1265 * used depends on the direction. (It really doesn't make sense to copy from
1266 * stdout. We silently correct the "typo". - AY 9/94
1268 copy_file_name: Sconst { $$ = $1; }
1269 | STDIN { $$ = make1_str("stdin"); }
1270 | STDOUT { $$ = make1_str("stdout"); }
1273 opt_binary: BINARY { $$ = make1_str("binary"); }
1274 | /*EMPTY*/ { $$ = make1_str(""); }
1277 opt_with_copy: WITH OIDS { $$ = make1_str("with oids"); }
1278 | /*EMPTY*/ { $$ = make1_str(""); }
1282 * the default copy delimiter is tab but the user can configure it
1284 copy_delimiter: USING DELIMITERS Sconst { $$ = cat2_str(make1_str("using delimiters"), $3); }
1285 | /*EMPTY*/ { $$ = make1_str(""); }
1290 /*****************************************************************************
1295 *****************************************************************************/
1297 CreateStmt: CREATE OptTemp TABLE relation_name '(' OptTableElementList ')'
1300 $$ = cat3_str(cat4_str(make1_str("create"), $2, make1_str("table"), $4), make3_str(make1_str("("), $6, make1_str(")")), $8);
1304 OptTemp: OptTempType { $$ = $1; }
1305 | OptTempScope OptTempType { $$ = cat2_str($1,$2); }
1308 OptTempType: TEMP { $$ = make1_str("temp"); }
1309 | TEMPORARY { $$ = make1_str("temporary"); }
1310 | /* EMPTY */ { $$ = make1_str(""); }
1313 OptTempScope: GLOBAL
1315 yyerror("GLOBAL TEMPORARY TABLE is not currently supported");
1316 $$ = make1_str("global");
1318 | LOCAL { $$ = make1_str("local"); }
1322 OptTableElementList: OptTableElementList ',' OptTableElement
1324 $$ = cat3_str($1, make1_str(","), $3);
1330 | /*EMPTY*/ { $$ = make1_str(""); }
1333 OptTableElement: columnDef { $$ = $1; }
1334 | TableConstraint { $$ = $1; }
1337 columnDef: ColId Typename ColQualifier
1339 $$ = cat3_str($1, $2, $3);
1341 | ColId SERIAL ColPrimaryKey
1343 $$ = make3_str($1, make1_str(" serial "), $3);
1347 ColQualifier: ColQualList { $$ = $1; }
1348 | /*EMPTY*/ { $$ = make1_str(""); }
1351 ColQualList: ColQualList ColConstraint { $$ = cat2_str($1,$2); }
1352 | ColConstraint { $$ = $1; }
1355 ColPrimaryKey: PRIMARY KEY
1357 $$ = make1_str("primary key");
1366 CONSTRAINT name ColConstraintElem
1368 $$ = cat3_str(make1_str("constraint"), $2, $3);
1374 /* DEFAULT NULL is already the default for Postgres.
1375 * Bue define it here and carry it forward into the system
1376 * to make it explicit.
1377 * - thomas 1998-09-13
1378 * WITH NULL and NULL are not SQL92-standard syntax elements,
1379 * so leave them out. Use DEFAULT NULL to explicitly indicate
1380 * that a column may have that value. WITH NULL leads to
1381 * shift/reduce conflicts with WITH TIME ZONE anyway.
1382 * - thomas 1999-01-08
1384 ColConstraintElem: CHECK '(' constraint_expr ')'
1386 $$ = make3_str(make1_str("check("), $3, make1_str(")"));
1390 $$ = make1_str("default null");
1392 | DEFAULT default_expr
1394 $$ = cat2_str(make1_str("default"), $2);
1398 $$ = make1_str("not null");
1402 $$ = make1_str("unique");
1406 $$ = make1_str("primary key");
1408 | REFERENCES ColId opt_column_list key_match key_actions
1410 fprintf(stderr, "CREATE TABLE/FOREIGN KEY clause ignored; not yet implemented");
1415 default_list: default_list ',' default_expr
1417 $$ = cat3_str($1, make1_str(","), $3);
1425 /* The Postgres default column value is NULL.
1426 * Rather than carrying DEFAULT NULL forward as a clause,
1427 * let's just have it be a no-op.
1429 { $$ = make1_str("null"); }
1430 * - thomas 1998-09-13
1433 default_expr: AexprConst
1435 | '-' default_expr %prec UMINUS
1436 { $$ = cat2_str(make1_str("-"), $2); }
1437 | default_expr '+' default_expr
1438 { $$ = cat3_str($1, make1_str("+"), $3); }
1439 | default_expr '-' default_expr
1440 { $$ = cat3_str($1, make1_str("-"), $3); }
1441 | default_expr '/' default_expr
1442 { $$ = cat3_str($1, make1_str("/"), $3); }
1443 | default_expr '%' default_expr
1444 { $$ = cat3_str($1, make1_str("%"), $3); }
1445 | default_expr '*' default_expr
1446 { $$ = cat3_str($1, make1_str("*"), $3); }
1447 | default_expr '=' default_expr
1448 { yyerror("boolean expressions not supported in DEFAULT"); }
1449 | default_expr '<' default_expr
1450 { yyerror("boolean expressions not supported in DEFAULT"); }
1451 | default_expr '>' default_expr
1452 { yyerror("boolean expressions not supported in DEFAULT"); }
1453 /* not possible in embedded sql
1455 { $$ = cat2_str(make1_str(":"), $2); }
1458 { $$ = cat2_str(make1_str(";"), $2); }
1460 { $$ = cat2_str(make1_str("|"), $2); }
1461 | default_expr TYPECAST Typename
1462 { $$ = cat3_str($1, make1_str("::"), $3); }
1463 | CAST '(' default_expr AS Typename ')'
1465 $$ = cat3_str(make2_str(make1_str("cast("), $3) , make1_str("as"), make2_str($5, make1_str(")")));
1467 | '(' default_expr ')'
1468 { $$ = make3_str(make1_str("("), $2, make1_str(")")); }
1470 { $$ = cat2_str($1, make1_str("()")); }
1471 | func_name '(' default_list ')'
1472 { $$ = cat2_str($1, make3_str(make1_str("("), $3, make1_str(")"))); }
1473 | default_expr Op default_expr
1475 if (!strcmp("<=", $2) || !strcmp(">=", $2))
1476 yyerror("boolean expressions not supported in DEFAULT");
1477 $$ = cat3_str($1, $2, $3);
1480 { $$ = cat2_str($1, $2); }
1482 { $$ = cat2_str($1, $2); }
1483 /* XXX - thomas 1997-10-07 v6.2 function-specific code to be changed */
1485 { $$ = make1_str("current_date"); }
1487 { $$ = make1_str("current_time"); }
1488 | CURRENT_TIME '(' Iconst ')'
1491 fprintf(stderr, "CURRENT_TIME(%s) precision not implemented; zero used instead",$3);
1492 $$ = "current_time";
1495 { $$ = make1_str("current_timestamp"); }
1496 | CURRENT_TIMESTAMP '(' Iconst ')'
1499 fprintf(stderr, "CURRENT_TIMESTAMP(%s) precision not implemented; zero used instead",$3);
1500 $$ = "current_timestamp";
1503 { $$ = make1_str("current_user"); }
1505 { $$ = make1_str("user"); }
1508 /* ConstraintElem specifies constraint syntax which is not embedded into
1509 * a column definition. ColConstraintElem specifies the embedded form.
1510 * - thomas 1997-12-03
1512 TableConstraint: CONSTRAINT name ConstraintElem
1514 $$ = cat3_str(make1_str("constraint"), $2, $3);
1520 ConstraintElem: CHECK '(' constraint_expr ')'
1522 $$ = make3_str(make1_str("check("), $3, make1_str(")"));
1524 | UNIQUE '(' columnList ')'
1526 $$ = make3_str(make1_str("unique("), $3, make1_str(")"));
1528 | PRIMARY KEY '(' columnList ')'
1530 $$ = make3_str(make1_str("primary key("), $4, make1_str(")"));
1532 | FOREIGN KEY '(' columnList ')' REFERENCES ColId opt_column_list key_match key_actions
1534 fprintf(stderr, "CREATE TABLE/FOREIGN KEY clause ignored; not yet implemented");
1539 constraint_list: constraint_list ',' constraint_expr
1541 $$ = cat3_str($1, make1_str(","), $3);
1549 constraint_expr: AexprConst
1552 { $$ = make1_str("null"); }
1557 | '-' constraint_expr %prec UMINUS
1558 { $$ = cat2_str(make1_str("-"), $2); }
1559 | constraint_expr '+' constraint_expr
1560 { $$ = cat3_str($1, make1_str("+"), $3); }
1561 | constraint_expr '-' constraint_expr
1562 { $$ = cat3_str($1, make1_str("-"), $3); }
1563 | constraint_expr '/' constraint_expr
1564 { $$ = cat3_str($1, make1_str("/"), $3); }
1565 | constraint_expr '%' constraint_expr
1566 { $$ = cat3_str($1, make1_str("%"), $3); }
1567 | constraint_expr '*' constraint_expr
1568 { $$ = cat3_str($1, make1_str("*"), $3); }
1569 | constraint_expr '=' constraint_expr
1570 { $$ = cat3_str($1, make1_str("="), $3); }
1571 | constraint_expr '<' constraint_expr
1572 { $$ = cat3_str($1, make1_str("<"), $3); }
1573 | constraint_expr '>' constraint_expr
1574 { $$ = cat3_str($1, make1_str(">"), $3); }
1575 /* this one doesn't work with embedded sql anyway
1576 | ':' constraint_expr
1577 { $$ = cat2_str(make1_str(":"), $2); }
1579 | ';' constraint_expr
1580 { $$ = cat2_str(make1_str(";"), $2); }
1581 | '|' constraint_expr
1582 { $$ = cat2_str(make1_str("|"), $2); }
1583 | constraint_expr TYPECAST Typename
1585 $$ = cat3_str($1, make1_str("::"), $3);
1587 | CAST '(' constraint_expr AS Typename ')'
1589 $$ = cat3_str(make2_str(make1_str("cast("), $3), make1_str("as"), make2_str($5, make1_str(")")));
1591 | '(' constraint_expr ')'
1592 { $$ = make3_str(make1_str("("), $2, make1_str(")")); }
1595 { $$ = cat2_str($1, make1_str("()")); }
1597 | func_name '(' constraint_list ')'
1599 $$ = cat2_str($1, make3_str(make1_str("("), $3, make1_str(")")));
1601 | constraint_expr Op constraint_expr
1602 { $$ = cat3_str($1, $2, $3); }
1603 | constraint_expr LIKE constraint_expr
1604 { $$ = cat3_str($1, make1_str("like"), $3); }
1605 | constraint_expr NOT LIKE constraint_expr
1606 { $$ = cat3_str($1, make1_str("not like"), $4); }
1607 | constraint_expr AND constraint_expr
1608 { $$ = cat3_str($1, make1_str("and"), $3); }
1609 | constraint_expr OR constraint_expr
1610 { $$ = cat3_str($1, make1_str("or"), $3); }
1611 | NOT constraint_expr
1612 { $$ = cat2_str(make1_str("not"), $2); }
1613 | Op constraint_expr
1614 { $$ = cat2_str($1, $2); }
1615 | constraint_expr Op
1616 { $$ = cat2_str($1, $2); }
1617 | constraint_expr ISNULL
1618 { $$ = cat2_str($1, make1_str("isnull")); }
1619 | constraint_expr IS NULL_P
1620 { $$ = cat2_str($1, make1_str("is null")); }
1621 | constraint_expr NOTNULL
1622 { $$ = cat2_str($1, make1_str("notnull")); }
1623 | constraint_expr IS NOT NULL_P
1624 { $$ = cat2_str($1, make1_str("is not null")); }
1625 | constraint_expr IS TRUE_P
1626 { $$ = cat2_str($1, make1_str("is true")); }
1627 | constraint_expr IS FALSE_P
1628 { $$ = cat2_str($1, make1_str("is false")); }
1629 | constraint_expr IS NOT TRUE_P
1630 { $$ = cat2_str($1, make1_str("is not true")); }
1631 | constraint_expr IS NOT FALSE_P
1632 { $$ = cat2_str($1, make1_str("is not false")); }
1633 | constraint_expr IN '(' c_list ')'
1634 { $$ = cat4_str($1, make1_str("in ("), $4, make1_str(")")); }
1635 | constraint_expr NOT IN '(' c_list ')'
1636 { $$ = cat4_str($1, make1_str("not in ("), $5, make1_str(")")); }
1637 | constraint_expr BETWEEN c_expr AND c_expr
1638 { $$ = cat5_str($1, make1_str("between"), $3, make1_str("and"), $5); }
1639 | constraint_expr NOT BETWEEN c_expr AND c_expr
1640 { $$ = cat5_str($1, make1_str("not between"), $4, make1_str("and"), $6); }
1642 c_list: c_list ',' c_expr
1644 $$ = make3_str($1, make1_str(", "), $3);
1656 key_match: MATCH FULL { $$ = make1_str("match full"); }
1657 | MATCH PARTIAL { $$ = make1_str("match partial"); }
1658 | /*EMPTY*/ { $$ = make1_str(""); }
1661 key_actions: key_action key_action { $$ = cat2_str($1, $2); }
1662 | key_action { $$ = $1; }
1663 | /*EMPTY*/ { $$ = make1_str(""); }
1666 key_action: ON DELETE key_reference { $$ = cat2_str(make1_str("on delete"), $3); }
1667 | ON UPDATE key_reference { $$ = cat2_str(make1_str("on update"), $3); }
1670 key_reference: NO ACTION { $$ = make1_str("no action"); }
1671 | CASCADE { $$ = make1_str("cascade"); }
1672 | SET DEFAULT { $$ = make1_str("set default"); }
1673 | SET NULL_P { $$ = make1_str("set null"); }
1676 OptInherit: INHERITS '(' relation_name_list ')' { $$ = make3_str(make1_str("inherits ("), $3, make1_str(")")); }
1677 | /*EMPTY*/ { $$ = make1_str(""); }
1680 CreateAsStmt: CREATE OptTemp TABLE relation_name OptCreateAs AS SubSelect
1682 $$ = cat5_str(cat3_str(make1_str("create"), $2, make1_str("table")), $4, $5, make1_str("as"), $7);
1686 OptCreateAs: '(' CreateAsList ')' { $$ = make3_str(make1_str("("), $2, make1_str(")")); }
1687 | /*EMPTY*/ { $$ = make1_str(""); }
1690 CreateAsList: CreateAsList ',' CreateAsElement { $$ = cat3_str($1, make1_str(","), $3); }
1691 | CreateAsElement { $$ = $1; }
1694 CreateAsElement: ColId { $$ = $1; }
1697 /*****************************************************************************
1700 * CREATE SEQUENCE seqname
1702 *****************************************************************************/
1704 CreateSeqStmt: CREATE SEQUENCE relation_name OptSeqList
1706 $$ = cat3_str(make1_str("create sequence"), $3, $4);
1710 OptSeqList: OptSeqList OptSeqElem
1711 { $$ = cat2_str($1, $2); }
1712 | { $$ = make1_str(""); }
1715 OptSeqElem: CACHE IntegerOnly
1717 $$ = cat2_str(make1_str("cache"), $2);
1721 $$ = make1_str("cycle");
1723 | INCREMENT IntegerOnly
1725 $$ = cat2_str(make1_str("increment"), $2);
1727 | MAXVALUE IntegerOnly
1729 $$ = cat2_str(make1_str("maxvalue"), $2);
1731 | MINVALUE IntegerOnly
1733 $$ = cat2_str(make1_str("minvalue"), $2);
1737 $$ = cat2_str(make1_str("start"), $2);
1741 NumericOnly: FloatOnly { $$ = $1; }
1742 | IntegerOnly { $$ = $1; }
1750 $$ = cat2_str(make1_str("-"), $2);
1761 $$ = cat2_str(make1_str("-"), $2);
1765 /*****************************************************************************
1768 * CREATE PROCEDURAL LANGUAGE ...
1769 * DROP PROCEDURAL LANGUAGE ...
1771 *****************************************************************************/
1773 CreatePLangStmt: CREATE PLangTrusted PROCEDURAL LANGUAGE Sconst
1774 HANDLER def_name LANCOMPILER Sconst
1776 $$ = cat4_str(cat5_str(make1_str("create"), $2, make1_str("precedural language"), $5, make1_str("handler")), $7, make1_str("langcompiler"), $9);
1780 PLangTrusted: TRUSTED { $$ = make1_str("trusted"); }
1781 | { $$ = make1_str(""); }
1783 DropPLangStmt: DROP PROCEDURAL LANGUAGE Sconst
1785 $$ = cat2_str(make1_str("drop procedural language"), $4);
1789 /*****************************************************************************
1792 * CREATE TRIGGER ...
1795 *****************************************************************************/
1797 CreateTrigStmt: CREATE TRIGGER name TriggerActionTime TriggerEvents ON
1798 relation_name TriggerForSpec EXECUTE PROCEDURE
1799 name '(' TriggerFuncArgs ')'
1801 $$ = 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(")")));
1805 TriggerActionTime: BEFORE { $$ = make1_str("before"); }
1806 | AFTER { $$ = make1_str("after"); }
1809 TriggerEvents: TriggerOneEvent
1813 | TriggerOneEvent OR TriggerOneEvent
1815 $$ = cat3_str($1, make1_str("or"), $3);
1817 | TriggerOneEvent OR TriggerOneEvent OR TriggerOneEvent
1819 $$ = cat5_str($1, make1_str("or"), $3, make1_str("or"), $5);
1823 TriggerOneEvent: INSERT { $$ = make1_str("insert"); }
1824 | DELETE { $$ = make1_str("delete"); }
1825 | UPDATE { $$ = make1_str("update"); }
1828 TriggerForSpec: FOR TriggerForOpt TriggerForType
1830 $$ = cat3_str(make1_str("for"), $2, $3);
1834 TriggerForOpt: EACH { $$ = make1_str("each"); }
1835 | /*EMPTY*/ { $$ = make1_str(""); }
1838 TriggerForType: ROW { $$ = make1_str("row"); }
1839 | STATEMENT { $$ = make1_str("statement"); }
1842 TriggerFuncArgs: TriggerFuncArg
1844 | TriggerFuncArgs ',' TriggerFuncArg
1845 { $$ = cat3_str($1, make1_str(","), $3); }
1847 { $$ = make1_str(""); }
1850 TriggerFuncArg: Iconst
1858 | Sconst { $$ = $1; }
1859 | ident { $$ = $1; }
1862 DropTrigStmt: DROP TRIGGER name ON relation_name
1864 $$ = cat4_str(make1_str("drop trigger"), $3, make1_str("on"), $5);
1868 /*****************************************************************************
1871 * define (type,operator,aggregate)
1873 *****************************************************************************/
1875 DefineStmt: CREATE def_type def_rest
1877 $$ = cat3_str(make1_str("create"), $2, $3);
1881 def_rest: def_name definition
1883 $$ = cat2_str($1, $2);
1887 def_type: OPERATOR { $$ = make1_str("operator"); }
1888 | TYPE_P { $$ = make1_str("type"); }
1889 | AGGREGATE { $$ = make1_str("aggregate"); }
1892 def_name: PROCEDURE { $$ = make1_str("procedure"); }
1893 | JOIN { $$ = make1_str("join"); }
1894 | ColId { $$ = $1; }
1895 | MathOp { $$ = $1; }
1899 definition: '(' def_list ')' { $$ = make3_str(make1_str("("), $2, make1_str(")")); }
1902 def_list: def_elem { $$ = $1; }
1903 | def_list ',' def_elem { $$ = cat3_str($1, make1_str(","), $3); }
1906 def_elem: def_name '=' def_arg {
1907 $$ = cat3_str($1, make1_str("="), $3);
1913 | DEFAULT '=' def_arg
1915 $$ = cat2_str(make1_str("default ="), $3);
1919 def_arg: ColId { $$ = $1; }
1920 | all_Op { $$ = $1; }
1921 | NumericOnly { $$ = $1; }
1922 | Sconst { $$ = $1; }
1925 $$ = cat2_str(make1_str("setof"), $2);
1929 /*****************************************************************************
1932 * destroy <relname1> [, <relname2> .. <relnameN> ]
1934 *****************************************************************************/
1936 DestroyStmt: DROP TABLE relation_name_list
1938 $$ = cat2_str(make1_str("drop table"), $3);
1940 | DROP SEQUENCE relation_name_list
1942 $$ = cat2_str(make1_str("drop sequence"), $3);
1948 /*****************************************************************************
1951 * fetch/move [forward | backward] [ # | all ] [ in <portalname> ]
1952 * fetch [ forward | backward | absolute | relative ]
1953 * [ # | all | next | prior ] [ [ in | from ] <portalname> ]
1955 *****************************************************************************/
1957 FetchStmt: FETCH opt_direction fetch_how_many opt_portal_name INTO into_list
1959 if (strncmp($2, "relative", strlen("relative")) == 0 && atol($3) == 0L)
1960 yyerror("FETCH/RELATIVE at current position is not supported");
1962 $$ = cat4_str(make1_str("fetch"), $2, $3, $4);
1964 | MOVE opt_direction fetch_how_many opt_portal_name
1966 $$ = cat4_str(make1_str("fetch"), $2, $3, $4);
1970 opt_direction: FORWARD { $$ = make1_str("forward"); }
1971 | BACKWARD { $$ = make1_str("backward"); }
1972 | RELATIVE { $$ = make1_str("relative"); }
1975 fprintf(stderr, "FETCH/ABSOLUTE not supported, using RELATIVE");
1976 $$ = make1_str("absolute");
1978 | /*EMPTY*/ { $$ = make1_str(""); /* default */ }
1981 fetch_how_many: Iconst { $$ = $1; }
1982 | '-' Iconst { $$ = make2_str(make1_str("-"), $2); }
1983 | ALL { $$ = make1_str("all"); }
1984 | NEXT { $$ = make1_str("next"); }
1985 | PRIOR { $$ = make1_str("prior"); }
1986 | /*EMPTY*/ { $$ = make1_str(""); /*default*/ }
1989 opt_portal_name: IN name { $$ = cat2_str(make1_str("in"), $2); }
1990 | FROM name { $$ = cat2_str(make1_str("from"), $2); }
1991 /* | name { $$ = cat2_str(make1_str("in"), $1); */
1992 | /*EMPTY*/ { $$ = make1_str(""); }
1996 /*****************************************************************************
1999 * GRANT [privileges] ON [relation_name_list] TO [GROUP] grantee
2001 *****************************************************************************/
2003 GrantStmt: GRANT privileges ON relation_name_list TO grantee opt_with_grant
2005 $$ = cat2_str(cat5_str(make1_str("grant"), $2, make1_str("on"), $4, make1_str("to")), $6);
2009 privileges: ALL PRIVILEGES
2011 $$ = make1_str("all privileges");
2015 $$ = make1_str("all");
2017 | operation_commalist
2023 operation_commalist: operation
2027 | operation_commalist ',' operation
2029 $$ = cat3_str($1, make1_str(","), $3);
2035 $$ = make1_str("select");
2039 $$ = make1_str("insert");
2043 $$ = make1_str("update");
2047 $$ = make1_str("delete");
2051 $$ = make1_str("rule");
2057 $$ = make1_str("public");
2061 $$ = cat2_str(make1_str("group"), $2);
2069 opt_with_grant: WITH GRANT OPTION
2071 yyerror("WITH GRANT OPTION is not supported. Only relation owners can set privileges");
2077 /*****************************************************************************
2080 * REVOKE [privileges] ON [relation_name] FROM [user]
2082 *****************************************************************************/
2084 RevokeStmt: REVOKE privileges ON relation_name_list FROM grantee
2086 $$ = cat2_str(cat5_str(make1_str("revoke"), $2, make1_str("on"), $4, make1_str("from")), $6);
2092 /*****************************************************************************
2095 * create index <indexname> on <relname>
2096 * using <access> "(" (<col> with <op>)+ ")" [with
2099 * [where <qual>] is not supported anymore
2100 *****************************************************************************/
2102 IndexStmt: CREATE index_opt_unique INDEX index_name ON relation_name
2103 access_method_clause '(' index_params ')' opt_with
2105 /* should check that access_method is valid,
2106 etc ... but doesn't */
2107 $$ = 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);
2111 index_opt_unique: UNIQUE { $$ = make1_str("unique"); }
2112 | /*EMPTY*/ { $$ = make1_str(""); }
2115 access_method_clause: USING access_method { $$ = cat2_str(make1_str("using"), $2); }
2116 | /*EMPTY*/ { $$ = make1_str(""); }
2119 index_params: index_list { $$ = $1; }
2120 | func_index { $$ = $1; }
2123 index_list: index_list ',' index_elem { $$ = cat3_str($1, make1_str(","), $3); }
2124 | index_elem { $$ = $1; }
2127 func_index: func_name '(' name_list ')' opt_type opt_class
2129 $$ = cat4_str($1, make3_str(make1_str("("), $3, ")"), $5, $6);
2133 index_elem: attr_name opt_type opt_class
2135 $$ = cat3_str($1, $2, $3);
2139 opt_type: ':' Typename { $$ = cat2_str(make1_str(":"), $2); }
2140 | FOR Typename { $$ = cat2_str(make1_str("for"), $2); }
2141 | /*EMPTY*/ { $$ = make1_str(""); }
2144 /* opt_class "WITH class" conflicts with preceeding opt_type
2145 * for Typename of "TIMESTAMP WITH TIME ZONE"
2146 * So, remove "WITH class" from the syntax. OK??
2147 * - thomas 1997-10-12
2148 * | WITH class { $$ = $2; }
2150 opt_class: class { $$ = $1; }
2151 | USING class { $$ = cat2_str(make1_str("using"), $2); }
2152 | /*EMPTY*/ { $$ = make1_str(""); }
2155 /*****************************************************************************
2158 * extend index <indexname> [where <qual>]
2160 *****************************************************************************/
2162 ExtendStmt: EXTEND INDEX index_name where_clause
2164 $$ = cat3_str(make1_str("extend index"), $3, $4);
2169 /*****************************************************************************
2172 * execute recipe <recipeName>
2174 *****************************************************************************/
2176 RecipeStmt: EXECUTE RECIPE recipe_name
2178 $$ = cat2_str(make1_str("execute recipe"), $3);
2182 /*****************************************************************************
2185 * define function <fname>
2186 * (language = <lang>, returntype = <typename>
2187 * [, arch_pct = <percentage | pre-defined>]
2188 * [, disk_pct = <percentage | pre-defined>]
2189 * [, byte_pct = <percentage | pre-defined>]
2190 * [, perbyte_cpu = <int | pre-defined>]
2191 * [, percall_cpu = <int | pre-defined>]
2193 * [arg is (<type-1> { , <type-n>})]
2194 * as <filename or code in language as appropriate>
2196 *****************************************************************************/
2198 ProcedureStmt: CREATE FUNCTION func_name func_args
2199 RETURNS func_return opt_with AS Sconst LANGUAGE Sconst
2201 $$ = 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);
2204 opt_with: WITH definition { $$ = cat2_str(make1_str("with"), $2); }
2205 | /*EMPTY*/ { $$ = make1_str(""); }
2208 func_args: '(' func_args_list ')' { $$ = make3_str(make1_str("("), $2, make1_str(")")); }
2209 | '(' ')' { $$ = make1_str("()"); }
2212 func_args_list: TypeId { $$ = $1; }
2213 | func_args_list ',' TypeId
2214 { $$ = cat3_str($1, make1_str(","), $3); }
2217 func_return: set_opt TypeId
2219 $$ = cat2_str($1, $2);
2223 set_opt: SETOF { $$ = make1_str("setof"); }
2224 | /*EMPTY*/ { $$ = make1_str(""); }
2228 /*****************************************************************************
2232 * remove function <funcname>
2233 * (REMOVE FUNCTION "funcname" (arg1, arg2, ...))
2234 * remove aggregate <aggname>
2235 * (REMOVE AGGREGATE "aggname" "aggtype")
2236 * remove operator <opname>
2237 * (REMOVE OPERATOR "opname" (leftoperand_typ rightoperand_typ))
2238 * remove type <typename>
2239 * (REMOVE TYPE "typename")
2240 * remove rule <rulename>
2241 * (REMOVE RULE "rulename")
2243 *****************************************************************************/
2245 RemoveStmt: DROP remove_type name
2247 $$ = cat3_str(make1_str("drop"), $2, $3);
2251 remove_type: TYPE_P { $$ = make1_str("type"); }
2252 | INDEX { $$ = make1_str("index"); }
2253 | RULE { $$ = make1_str("rule"); }
2254 | VIEW { $$ = make1_str("view"); }
2258 RemoveAggrStmt: DROP AGGREGATE name aggr_argtype
2260 $$ = cat3_str(make1_str("drop aggregate"), $3, $4);
2264 aggr_argtype: name { $$ = $1; }
2265 | '*' { $$ = make1_str("*"); }
2269 RemoveFuncStmt: DROP FUNCTION func_name func_args
2271 $$ = cat3_str(make1_str("drop function"), $3, $4);
2276 RemoveOperStmt: DROP OPERATOR all_Op '(' oper_argtypes ')'
2278 $$ = cat3_str(make1_str("drop operator"), $3, make3_str(make1_str("("), $5, make1_str(")")));
2282 all_Op: Op | MathOp;
2284 MathOp: '+' { $$ = make1_str("+"); }
2285 | '-' { $$ = make1_str("-"); }
2286 | '*' { $$ = make1_str("*"); }
2287 | '%' { $$ = make1_str("%"); }
2288 | '/' { $$ = make1_str("/"); }
2289 | '<' { $$ = make1_str("<"); }
2290 | '>' { $$ = make1_str(">"); }
2291 | '=' { $$ = make1_str("="); }
2296 yyerror("parser: argument type missing (use NONE for unary operators)");
2299 { $$ = cat3_str($1, make1_str(","), $3); }
2300 | NONE ',' name /* left unary */
2301 { $$ = cat2_str(make1_str("none,"), $3); }
2302 | name ',' NONE /* right unary */
2303 { $$ = cat2_str($1, make1_str(", none")); }
2307 /*****************************************************************************
2310 * rename <attrname1> in <relname> [*] to <attrname2>
2311 * rename <relname1> to <relname2>
2313 *****************************************************************************/
2315 RenameStmt: ALTER TABLE relation_name opt_inh_star
2316 RENAME opt_column opt_name TO name
2318 $$ = cat4_str(cat5_str(make1_str("alter table"), $3, $4, make1_str("rename"), $6), $7, make1_str("to"), $9);
2322 opt_name: name { $$ = $1; }
2323 | /*EMPTY*/ { $$ = make1_str(""); }
2326 opt_column: COLUMN { $$ = make1_str("colmunn"); }
2327 | /*EMPTY*/ { $$ = make1_str(""); }
2331 /*****************************************************************************
2333 * QUERY: Define Rewrite Rule , Define Tuple Rule
2334 * Define Rule <old rules >
2336 * only rewrite rule is supported -- ay 9/94
2338 *****************************************************************************/
2340 RuleStmt: CREATE RULE name AS
2342 ON event TO event_object where_clause
2343 DO opt_instead RuleActionList
2345 $$ = 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);
2349 RuleActionList: NOTHING { $$ = make1_str("nothing"); }
2350 | SelectStmt { $$ = $1; }
2351 | RuleActionStmt { $$ = $1; }
2352 | '[' RuleActionBlock ']' { $$ = cat3_str(make1_str("["), $2, make1_str("]")); }
2353 | '(' RuleActionBlock ')' { $$ = cat3_str(make1_str("("), $2, make1_str(")")); }
2356 RuleActionBlock: RuleActionMulti { $$ = $1; }
2357 | RuleActionStmt { $$ = $1; }
2360 RuleActionMulti: RuleActionMulti RuleActionStmt
2361 { $$ = cat2_str($1, $2); }
2362 | RuleActionMulti RuleActionStmt ';'
2363 { $$ = cat3_str($1, $2, make1_str(";")); }
2364 | RuleActionStmt ';'
2365 { $$ = cat2_str($1, make1_str(";")); }
2368 RuleActionStmt: InsertStmt
2374 event_object: relation_name '.' attr_name
2376 $$ = make3_str($1, make1_str("."), $3);
2384 /* change me to select, update, etc. some day */
2385 event: SELECT { $$ = make1_str("select"); }
2386 | UPDATE { $$ = make1_str("update"); }
2387 | DELETE { $$ = make1_str("delete"); }
2388 | INSERT { $$ = make1_str("insert"); }
2391 opt_instead: INSTEAD { $$ = make1_str("instead"); }
2392 | /*EMPTY*/ { $$ = make1_str(""); }
2396 /*****************************************************************************
2399 * NOTIFY <relation_name> can appear both in rule bodies and
2400 * as a query-level command
2402 *****************************************************************************/
2404 NotifyStmt: NOTIFY relation_name
2406 $$ = cat2_str(make1_str("notify"), $2);
2410 ListenStmt: LISTEN relation_name
2412 $$ = cat2_str(make1_str("listen"), $2);
2416 UnlistenStmt: UNLISTEN relation_name
2418 $$ = cat2_str(make1_str("unlisten"), $2);
2422 $$ = make1_str("unlisten *");
2426 /*****************************************************************************
2437 *****************************************************************************/
2438 TransactionStmt: ABORT_TRANS opt_trans { $$ = make1_str("rollback"); }
2439 | BEGIN_TRANS opt_trans { $$ = make1_str("begin transaction"); }
2440 | COMMIT opt_trans { $$ = make1_str("commit"); }
2441 | END_TRANS opt_trans { $$ = make1_str("commit"); }
2442 | ROLLBACK opt_trans { $$ = make1_str("rollback"); }
2444 opt_trans: WORK { $$ = ""; }
2445 | TRANSACTION { $$ = ""; }
2446 | /*EMPTY*/ { $$ = ""; }
2449 /*****************************************************************************
2452 * define view <viewname> '('target-list ')' [where <quals> ]
2454 *****************************************************************************/
2456 ViewStmt: CREATE VIEW name AS SelectStmt
2458 $$ = cat4_str(make1_str("create view"), $3, make1_str("as"), $5);
2463 /*****************************************************************************
2466 * load make1_str("filename")
2468 *****************************************************************************/
2470 LoadStmt: LOAD file_name
2472 $$ = cat2_str(make1_str("load"), $2);
2477 /*****************************************************************************
2482 *****************************************************************************/
2484 CreatedbStmt: CREATE DATABASE database_name WITH opt_database1 opt_database2
2486 if (strlen($5) == 0 || strlen($6) == 0)
2487 yyerror("CREATE DATABASE WITH requires at least an option");
2489 if (strlen($6) != 0)
2490 yyerror("WITH ENCODING is not supported");
2492 $$ = cat5_str(make1_str("create database"), $3, make1_str("with"), $5, $6);
2494 | CREATE DATABASE database_name
2496 $$ = cat2_str(make1_str("create database"), $3);
2500 opt_database1: LOCATION '=' location { $$ = cat2_str(make1_str("location ="), $3); }
2501 | /*EMPTY*/ { $$ = make1_str(""); }
2504 opt_database2: ENCODING '=' encoding { $$ = cat2_str(make1_str("encoding ="), $3); }
2505 | /*EMPTY*/ { $$ = NULL; }
2508 location: Sconst { $$ = $1; }
2509 | DEFAULT { $$ = make1_str("default"); }
2510 | /*EMPTY*/ { $$ = make1_str(""); }
2513 encoding: Sconst { $$ = $1; }
2514 | DEFAULT { $$ = make1_str("default"); }
2515 | /*EMPTY*/ { $$ = make1_str(""); }
2518 /*****************************************************************************
2523 *****************************************************************************/
2525 DestroydbStmt: DROP DATABASE database_name
2527 $$ = cat2_str(make1_str("drop database"), $3);
2532 /*****************************************************************************
2535 * cluster <index_name> on <relation_name>
2537 *****************************************************************************/
2539 ClusterStmt: CLUSTER index_name ON relation_name
2541 $$ = cat4_str(make1_str("cluster"), $2, make1_str("on"), $4);
2546 /*****************************************************************************
2551 *****************************************************************************/
2553 VacuumStmt: VACUUM opt_verbose opt_analyze
2555 $$ = cat3_str(make1_str("vacuum"), $2, $3);
2557 | VACUUM opt_verbose opt_analyze relation_name opt_va_list
2559 if ( strlen($5) > 0 && strlen($4) == 0 )
2560 yyerror("parser: syntax error at or near \"(\"");
2561 $$ = cat5_str(make1_str("vacuum"), $2, $3, $4, $5);
2565 opt_verbose: VERBOSE { $$ = make1_str("verbose"); }
2566 | /*EMPTY*/ { $$ = make1_str(""); }
2569 opt_analyze: ANALYZE { $$ = make1_str("analyse"); }
2570 | /*EMPTY*/ { $$ = make1_str(""); }
2573 opt_va_list: '(' va_list ')' { $$ = make3_str(make1_str("("), $2, make1_str(")")); }
2574 | /*EMPTY*/ { $$ = make1_str(""); }
2580 { $$=cat3_str($1, make1_str(","), $3); }
2584 /*****************************************************************************
2589 *****************************************************************************/
2591 ExplainStmt: EXPLAIN opt_verbose OptimizableStmt
2593 $$ = cat3_str(make1_str("explain"), $2, $3);
2598 /*****************************************************************************
2600 * Optimizable Stmts: *
2602 * one of the five queries processed by the planner *
2604 * [ultimately] produces query-trees as specified *
2605 * in the query-spec document in ~postgres/ref *
2607 *****************************************************************************/
2609 OptimizableStmt: SelectStmt
2618 /*****************************************************************************
2623 *****************************************************************************/
2625 /* This rule used 'opt_column_list' between 'relation_name' and 'insert_rest'
2626 * originally. When the second rule of 'insert_rest' was changed to use
2627 * the new 'SelectStmt' rule (for INTERSECT and EXCEPT) it produced a shift/red uce
2628 * conflict. So I just changed the rules 'InsertStmt' and 'insert_rest' to accept
2629 * the same statements without any shift/reduce conflicts */
2630 InsertStmt: INSERT INTO relation_name insert_rest
2632 $$ = cat3_str(make1_str("insert into"), $3, $4);
2636 insert_rest: VALUES '(' res_target_list2 ')'
2638 $$ = make3_str(make1_str("values("), $3, make1_str(")"));
2642 $$ = make1_str("default values");
2648 | '(' columnList ')' VALUES '(' res_target_list2 ')'
2650 $$ = make5_str(make1_str("("), $2, make1_str(") values ("), $6, make1_str(")"));
2652 | '(' columnList ')' SelectStmt
2654 $$ = make4_str(make1_str("("), $2, make1_str(")"), $4);
2658 opt_column_list: '(' columnList ')' { $$ = make3_str(make1_str("("), $2, make1_str(")")); }
2659 | /*EMPTY*/ { $$ = make1_str(""); }
2663 columnList ',' columnElem
2664 { $$ = cat3_str($1, make1_str(","), $3); }
2669 columnElem: ColId opt_indirection
2671 $$ = cat2_str($1, $2);
2676 /*****************************************************************************
2681 *****************************************************************************/
2683 DeleteStmt: DELETE FROM relation_name
2686 $$ = cat3_str(make1_str("delete from"), $3, $4);
2690 LockStmt: LOCK_P opt_table relation_name opt_lock
2692 $$ = cat4_str(make1_str("lock"), $2, $3, $4);
2696 opt_lock: IN lock_type MODE { $$ = cat3_str(make1_str("in"), $2, make1_str("mode")); }
2697 | /*EMPTY*/ { $$ = make1_str("");}
2700 lock_type: SHARE ROW EXCLUSIVE { $$ = make1_str("share row exclusive"); }
2701 | ROW opt_lmode { $$ = cat2_str(make1_str("row"), $2);}
2702 | ACCESS opt_lmode { $$ = cat2_str(make1_str("access"), $2);}
2703 | opt_lmode { $$ = $1; }
2706 opt_lmode: SHARE { $$ = make1_str("share"); }
2707 | EXCLUSIVE { $$ = make1_str("exclusive"); }
2710 /*****************************************************************************
2713 * UpdateStmt (UPDATE)
2715 *****************************************************************************/
2717 UpdateStmt: UPDATE relation_name
2722 $$ = cat2_str(cat5_str(make1_str("update"), $2, make1_str("set"), $4, $5), $6);
2727 /*****************************************************************************
2732 *****************************************************************************/
2733 CursorStmt: DECLARE name opt_cursor CURSOR FOR
2734 { ForUpdateNotAllowed = 1; }
2737 struct cursor *ptr, *this;
2739 for (ptr = cur; ptr != NULL; ptr = ptr->next)
2741 if (strcmp($2, ptr->name) == 0)
2743 /* re-definition is a bug */
2744 sprintf(errortext, "cursor %s already defined", $2);
2749 this = (struct cursor *) mm_alloc(sizeof(struct cursor));
2751 /* initial definition */
2754 this->connection = connection;
2755 this->command = cat5_str(make1_str("declare"), mm_strdup($2), $3, make1_str("cursor for"), $7);
2756 this->argsinsert = argsinsert;
2757 this->argsresult = argsresult;
2758 argsinsert = argsresult = NULL;
2762 $$ = cat3_str(make1_str("/*"), mm_strdup(this->command), make1_str("*/"));
2766 opt_cursor: BINARY { $$ = make1_str("binary"); }
2767 | INSENSITIVE { $$ = make1_str("insensitive"); }
2768 | SCROLL { $$ = make1_str("scroll"); }
2769 | INSENSITIVE SCROLL { $$ = make1_str("insensitive scroll"); }
2770 | /*EMPTY*/ { $$ = make1_str(""); }
2773 /*****************************************************************************
2778 *****************************************************************************/
2780 /* The new 'SelectStmt' rule adapted for the optional use of INTERSECT EXCEPT a nd UNION
2781 * accepts the use of '(' and ')' to select an order of set operations.
2782 * The rule returns a SelectStmt Node having the set operations attached to
2783 * unionClause and intersectClause (NIL if no set operations were present)
2786 SelectStmt: select_clause sort_clause for_update_clause opt_select_limit
2788 if (strlen($3) > 0 && ForUpdateNotAllowed != 0)
2789 yyerror("FOR UPDATE is not allowed in this context");
2791 ForUpdateNotAllowed = 0;
2792 $$ = cat4_str($1, $2, $3, $4);
2795 /* This rule parses Select statements including UNION INTERSECT and EXCEPT.
2796 * '(' and ')' can be used to specify the order of the operations
2797 * (UNION EXCEPT INTERSECT). Without the use of '(' and ')' we want the
2798 * operations to be left associative.
2800 * The sort_clause is not handled here!
2802 select_clause: '(' select_clause ')'
2804 $$ = make3_str(make1_str("("), $2, make1_str(")"));
2810 | select_clause EXCEPT select_clause
2812 $$ = cat3_str($1, make1_str("except"), $3);
2813 ForUpdateNotAllowed = 1;
2815 | select_clause UNION opt_union select_clause
2817 $$ = cat4_str($1, make1_str("union"), $3, $4);
2818 ForUpdateNotAllowed = 1;
2820 | select_clause INTERSECT opt_union select_clause
2822 $$ = cat3_str($1, make1_str("intersect"), $3);
2823 ForUpdateNotAllowed = 1;
2827 SubSelect: SELECT opt_unique res_target_list2
2828 result from_clause where_clause
2829 group_clause having_clause
2831 $$ = cat4_str(cat5_str(make1_str("select"), $2, $3, $4, $5), $6, $7, $8);
2832 if (strlen($7) > 0 || strlen($8) > 0)
2833 ForUpdateNotAllowed = 1;
2837 result: INTO OptTemp opt_table relation_name { $$= cat4_str(make1_str("into"), $2, $3, $4); }
2838 | INTO into_list { $$ = make1_str(""); }
2839 | /*EMPTY*/ { $$ = make1_str(""); }
2842 opt_table: TABLE { $$ = make1_str("table"); }
2843 | /*EMPTY*/ { $$ = make1_str(""); }
2846 opt_union: ALL { $$ = make1_str("all"); }
2847 | /*EMPTY*/ { $$ = make1_str(""); }
2850 opt_unique: DISTINCT { $$ = make1_str("distinct"); }
2851 | DISTINCT ON ColId { $$ = cat2_str(make1_str("distinct on"), $3); }
2852 | ALL { $$ = make1_str("all"); }
2853 | /*EMPTY*/ { $$ = make1_str(""); }
2856 sort_clause: ORDER BY sortby_list { $$ = cat2_str(make1_str("order by"), $3); }
2857 | /*EMPTY*/ { $$ = make1_str(""); }
2860 sortby_list: sortby { $$ = $1; }
2861 | sortby_list ',' sortby { $$ = cat3_str($1, make1_str(","), $3); }
2864 sortby: a_expr OptUseOp
2866 $$ = cat2_str($1, $2);
2870 OptUseOp: USING Op { $$ = cat2_str(make1_str("using"), $2); }
2871 | USING '<' { $$ = make1_str("using <"); }
2872 | USING '>' { $$ = make1_str("using >"); }
2873 | ASC { $$ = make1_str("asc"); }
2874 | DESC { $$ = make1_str("desc"); }
2875 | /*EMPTY*/ { $$ = make1_str(""); }
2878 opt_select_limit: LIMIT select_limit_value ',' select_offset_value
2879 { $$ = cat4_str(make1_str("limit"), $2, make1_str(","), $4); }
2880 | LIMIT select_limit_value OFFSET select_offset_value
2881 { $$ = cat4_str(make1_str("limit"), $2, make1_str("offset"), $4); }
2882 | LIMIT select_limit_value
2883 { $$ = cat2_str(make1_str("limit"), $2); }
2884 | OFFSET select_offset_value LIMIT select_limit_value
2885 { $$ = cat4_str(make1_str("offset"), $2, make1_str("limit"), $4); }
2886 | OFFSET select_offset_value
2887 { $$ = cat2_str(make1_str("offset"), $2); }
2889 { $$ = make1_str(""); }
2892 select_limit_value: Iconst { $$ = $1; }
2893 | ALL { $$ = make1_str("all"); }
2894 | PARAM { $$ = make_name(); }
2897 select_offset_value: Iconst { $$ = $1; }
2898 | PARAM { $$ = make_name(); }
2902 * jimmy bell-style recursive queries aren't supported in the
2905 * ...however, recursive addattr and rename supported. make special
2908 opt_inh_star: '*' { $$ = make1_str("*"); }
2909 | /*EMPTY*/ { $$ = make1_str(""); }
2912 relation_name_list: name_list { $$ = $1; };
2916 | name_list ',' name
2917 { $$ = cat3_str($1, make1_str(","), $3); }
2920 group_clause: GROUP BY expr_list { $$ = cat2_str(make1_str("group by"), $3); }
2921 | /*EMPTY*/ { $$ = make1_str(""); }
2924 having_clause: HAVING a_expr
2926 $$ = cat2_str(make1_str("having"), $2);
2928 | /*EMPTY*/ { $$ = make1_str(""); }
2931 for_update_clause: FOR UPDATE update_list
2933 $$ = make1_str("for update");
2937 $$ = make1_str("for read only");
2944 update_list: OF va_list
2946 $$ = cat2_str(make1_str("of"), $2);
2954 /*****************************************************************************
2956 * clauses common to all Optimizable Stmts:
2960 *****************************************************************************/
2962 from_clause: FROM from_expr
2964 $$ = cat2_str(make1_str("from"), $2);
2972 from_expr: '(' join_clause_with_union ')'
2973 { $$ = make3_str(make1_str("("), $2, make1_str(")")); }
2980 table_list: table_list ',' table_expr
2981 { $$ = make3_str($1, make1_str(","), $3); }
2986 table_expr: relation_expr AS ColLabel
2988 $$ = cat3_str($1, make1_str("as"), $3);
2990 | relation_expr ColId
2992 $$ = cat2_str($1, $2);
3000 /* A UNION JOIN is the same as a FULL OUTER JOIN which *omits*
3001 * all result rows which would have matched on an INNER JOIN.
3002 * Let's reject this for now. - thomas 1999-01-08
3004 join_clause_with_union: join_clause
3006 | table_expr UNION JOIN table_expr
3007 { yyerror("UNION JOIN not yet implemented"); }
3010 join_clause: table_expr join_list
3012 $$ = cat2_str($1, $2);
3016 join_list: join_list join_expr
3018 $$ = cat2_str($1, $2);
3026 /* This is everything but the left side of a join.
3027 * Note that a CROSS JOIN is the same as an unqualified
3028 * inner join, so just pass back the right-side table.
3029 * A NATURAL JOIN implicitly matches column names between
3030 * tables, so we'll collect those during the later transformation.
3033 join_expr: join_type JOIN table_expr join_qual
3035 $$ = cat4_str($1, make1_str("join"), $3, $4);
3037 | NATURAL join_type JOIN table_expr
3039 $$ = cat4_str(make1_str("natural"), $2, make1_str("join"), $4);
3041 | CROSS JOIN table_expr
3042 { $$ = cat2_str(make1_str("cross join"), $3); }
3045 /* OUTER is just noise... */
3046 join_type: FULL join_outer
3048 $$ = cat2_str(make1_str("full"), $2);
3049 fprintf(stderr,"FULL OUTER JOIN not yet implemented\n");
3053 $$ = cat2_str(make1_str("left"), $2);
3054 fprintf(stderr,"LEFT OUTER JOIN not yet implemented\n");
3058 $$ = cat2_str(make1_str("right"), $2);
3059 fprintf(stderr,"RIGHT OUTER JOIN not yet implemented\n");
3063 $$ = make1_str("outer");
3064 fprintf(stderr,"OUTER JOIN not yet implemented\n");
3068 $$ = make1_str("inner");
3076 join_outer: OUTER_P { $$ = make1_str("outer"); }
3077 | /*EMPTY*/ { $$ = make1_str(""); /* no qualifiers */ }
3080 /* JOIN qualification clauses
3081 * Possibilities are:
3082 * USING ( column list ) allows only unqualified column names,
3083 * which must match between tables.
3084 * ON expr allows more general qualifications.
3085 * - thomas 1999-01-07
3088 join_qual: USING '(' using_list ')' { $$ = make3_str(make1_str("using ("), $3, make1_str(")")); }
3089 | ON a_expr { $$ = cat2_str(make1_str("on"), $2); }
3092 using_list: using_list ',' using_expr { $$ = make3_str($1, make1_str(","), $3); }
3093 | using_expr { $$ = $1; }
3102 where_clause: WHERE a_expr { $$ = cat2_str(make1_str("where"), $2); }
3103 | /*EMPTY*/ { $$ = make1_str(""); /* no qualifiers */ }
3106 relation_expr: relation_name
3108 /* normal relations */
3111 | relation_name '*' %prec '='
3113 /* inheritance query */
3114 $$ = cat2_str($1, make1_str("*"));
3117 opt_array_bounds: '[' ']' nest_array_bounds
3120 $$.index2 = $3.index1;
3121 $$.str = cat2_str(make1_str("[]"), $3.str);
3123 | '[' Iresult ']' nest_array_bounds
3125 char *txt = mm_alloc(20L);
3127 sprintf (txt, "%d", $2);
3129 $$.index2 = $4.index1;
3130 $$.str = cat4_str(make1_str("["), txt, make1_str("]"), $4.str);
3136 $$.str= make1_str("");
3140 nest_array_bounds: '[' ']' nest_array_bounds
3143 $$.index2 = $3.index1;
3144 $$.str = cat2_str(make1_str("[]"), $3.str);
3146 | '[' Iresult ']' nest_array_bounds
3148 char *txt = mm_alloc(20L);
3150 sprintf (txt, "%d", $2);
3152 $$.index2 = $4.index1;
3153 $$.str = cat4_str(make1_str("["), txt, make1_str("]"), $4.str);
3159 $$.str= make1_str("");
3163 Iresult: Iconst { $$ = atol($1); }
3164 | '(' Iresult ')' { $$ = $2; }
3165 | Iresult '+' Iresult { $$ = $1 + $3; }
3166 | Iresult '-' Iresult { $$ = $1 - $3; }
3167 | Iresult '*' Iresult { $$ = $1 * $3; }
3168 | Iresult '/' Iresult { $$ = $1 / $3; }
3169 | Iresult '%' Iresult { $$ = $1 % $3; }
3173 /*****************************************************************************
3176 * SQL92 introduces a large amount of type-specific syntax.
3177 * Define individual clauses to handle these cases, and use
3178 * the generic case to handle regular type-extensible Postgres syntax.
3179 * - thomas 1997-10-10
3181 *****************************************************************************/
3183 Typename: Array opt_array_bounds
3185 $$ = cat2_str($1, $2.str);
3189 $$ = cat2_str(make1_str("setof"), $2);
3193 Array: Generic { $$ = $1; }
3194 | Datetime { $$ = $1; }
3195 | Numeric { $$ = $1; }
3196 | Character { $$ = $1; }
3205 generic: ident { $$ = $1; }
3206 | TYPE_P { $$ = make1_str("type"); }
3207 | SQL_AT { $$ = make1_str("at"); }
3208 | SQL_AUTOCOMMIT { $$ = make1_str("autocommit"); }
3209 | SQL_BOOL { $$ = make1_str("bool"); }
3210 | SQL_BREAK { $$ = make1_str("break"); }
3211 | SQL_CALL { $$ = make1_str("call"); }
3212 | SQL_CONNECT { $$ = make1_str("connect"); }
3213 | SQL_CONNECTION { $$ = make1_str("connection"); }
3214 | SQL_CONTINUE { $$ = make1_str("continue"); }
3215 | SQL_DEALLOCATE { $$ = make1_str("deallocate"); }
3216 | SQL_DISCONNECT { $$ = make1_str("disconnect"); }
3217 | SQL_FOUND { $$ = make1_str("found"); }
3218 | SQL_GO { $$ = make1_str("go"); }
3219 | SQL_GOTO { $$ = make1_str("goto"); }
3220 | SQL_IDENTIFIED { $$ = make1_str("identified"); }
3221 | SQL_IMMEDIATE { $$ = make1_str("immediate"); }
3222 | SQL_INDICATOR { $$ = make1_str("indicator"); }
3223 | SQL_INT { $$ = make1_str("int"); }
3224 | SQL_LONG { $$ = make1_str("long"); }
3225 | SQL_OFF { $$ = make1_str("off"); }
3226 | SQL_OPEN { $$ = make1_str("open"); }
3227 | SQL_PREPARE { $$ = make1_str("prepare"); }
3228 | SQL_RELEASE { $$ = make1_str("release"); }
3229 | SQL_SECTION { $$ = make1_str("section"); }
3230 | SQL_SHORT { $$ = make1_str("short"); }
3231 | SQL_SIGNED { $$ = make1_str("signed"); }
3232 | SQL_SQLERROR { $$ = make1_str("sqlerror"); }
3233 | SQL_SQLPRINT { $$ = make1_str("sqlprint"); }
3234 | SQL_SQLWARNING { $$ = make1_str("sqlwarning"); }
3235 | SQL_STOP { $$ = make1_str("stop"); }
3236 | SQL_STRUCT { $$ = make1_str("struct"); }
3237 | SQL_UNSIGNED { $$ = make1_str("unsigned"); }
3238 | SQL_VAR { $$ = make1_str("var"); }
3239 | SQL_WHENEVER { $$ = make1_str("whenever"); }
3242 /* SQL92 numeric data types
3243 * Check FLOAT() precision limits assuming IEEE floating types.
3244 * Provide real DECIMAL() and NUMERIC() implementations now - Jan 1998-12-30
3245 * - thomas 1997-09-18
3247 Numeric: FLOAT opt_float
3249 $$ = cat2_str(make1_str("float"), $2);
3253 $$ = make1_str("double precision");
3255 | DECIMAL opt_decimal
3257 $$ = cat2_str(make1_str("decimal"), $2);
3259 | NUMERIC opt_numeric
3261 $$ = cat2_str(make1_str("numeric"), $2);
3266 { $$ = make1_str("float"); }
3268 { $$ = make1_str("double precision"); }
3270 { $$ = make1_str("decimal"); }
3272 { $$ = make1_str("numeric"); }
3275 opt_float: '(' Iconst ')'
3278 yyerror("precision for FLOAT must be at least 1");
3279 else if (atol($2) >= 16)
3280 yyerror("precision for FLOAT must be less than 16");
3281 $$ = make3_str(make1_str("("), $2, make1_str(")"));
3289 opt_numeric: '(' Iconst ',' Iconst ')'
3291 if (atol($2) < 1 || atol($2) > NUMERIC_MAX_PRECISION) {
3292 sprintf(errortext, "NUMERIC precision %s must be between 1 and %d", $2, NUMERIC_MAX_PRECISION);
3295 if (atol($4) < 0 || atol($4) > atol($2)) {
3296 sprintf(errortext, "NUMERIC scale %s must be between 0 and precision %s", $4, $2);
3299 $$ = cat3_str(make2_str(make1_str("("), $2), make1_str(","), make2_str($4, make1_str(")")));
3303 if (atol($2) < 1 || atol($2) > NUMERIC_MAX_PRECISION) {
3304 sprintf(errortext, "NUMERIC precision %s must be between 1 and %d", $2, NUMERIC_MAX_PRECISION);
3307 $$ = make3_str(make1_str("("), $2, make1_str(")"));
3315 opt_decimal: '(' Iconst ',' Iconst ')'
3317 if (atol($2) < 1 || atol($2) > NUMERIC_MAX_PRECISION) {
3318 sprintf(errortext, "NUMERIC precision %s must be between 1 and %d", $2, NUMERIC_MAX_PRECISION);
3321 if (atol($4) < 0 || atol($4) > atol($2)) {
3322 sprintf(errortext, "NUMERIC scale %s must be between 0 and precision %s", $4, $2);
3325 $$ = cat3_str(make2_str(make1_str("("), $2), make1_str(","), make2_str($4, make1_str(")")));
3329 if (atol($2) < 1 || atol($2) > NUMERIC_MAX_PRECISION) {
3330 sprintf(errortext, "NUMERIC precision %s must be between 1 and %d", $2, NUMERIC_MAX_PRECISION);
3333 $$ = make3_str(make1_str("("), $2, make1_str(")"));
3341 /* SQL92 character data types
3342 * The following implements CHAR() and VARCHAR().
3345 Character: character '(' Iconst ')'
3347 if (strncasecmp($1, "char", strlen("char")) && strncasecmp($1, "varchar", strlen("varchar")))
3348 yyerror("internal parsing error; unrecognized character type");
3350 sprintf(errortext, "length for '%s' type must be at least 1",$1);
3353 else if (atol($3) > MaxAttrSize) {
3354 sprintf(errortext, "length for type '%s' cannot exceed %ld",$1,(long) MaxAttrSize);
3358 $$ = cat2_str($1, make3_str(make1_str("("), $3, make1_str(")")));
3366 character: CHARACTER opt_varying opt_charset opt_collate
3369 fprintf(stderr, "COLLATE %s not yet implemented",$4);
3371 $$ = cat4_str(make1_str("character"), $2, $3, $4);
3373 | CHAR opt_varying { $$ = cat2_str(make1_str("char"), $2); }
3374 | VARCHAR { $$ = make1_str("varchar"); }
3375 | NATIONAL CHARACTER opt_varying { $$ = cat2_str(make1_str("national character"), $3); }
3376 | NCHAR opt_varying { $$ = cat2_str(make1_str("nchar"), $2); }
3379 opt_varying: VARYING { $$ = make1_str("varying"); }
3380 | /*EMPTY*/ { $$ = make1_str(""); }
3383 opt_charset: CHARACTER SET ColId { $$ = cat2_str(make1_str("character set"), $3); }
3384 | /*EMPTY*/ { $$ = make1_str(""); }
3387 opt_collate: COLLATE ColId { $$ = cat2_str(make1_str("collate"), $2); }
3388 | /*EMPTY*/ { $$ = make1_str(""); }
3395 | TIMESTAMP opt_timezone
3397 $$ = cat2_str(make1_str("timestamp"), $2);
3401 $$ = make1_str("time");
3403 | INTERVAL opt_interval
3405 $$ = cat2_str(make1_str("interval"), $2);
3409 datetime: YEAR_P { $$ = make1_str("year"); }
3410 | MONTH_P { $$ = make1_str("month"); }
3411 | DAY_P { $$ = make1_str("day"); }
3412 | HOUR_P { $$ = make1_str("hour"); }
3413 | MINUTE_P { $$ = make1_str("minute"); }
3414 | SECOND_P { $$ = make1_str("second"); }
3417 opt_timezone: WITH TIME ZONE { $$ = make1_str("with time zone"); }
3418 | /*EMPTY*/ { $$ = make1_str(""); }
3421 opt_interval: datetime { $$ = $1; }
3422 | YEAR_P TO MONTH_P { $$ = make1_str("year to #month"); }
3423 | DAY_P TO HOUR_P { $$ = make1_str("day to hour"); }
3424 | DAY_P TO MINUTE_P { $$ = make1_str("day to minute"); }
3425 | DAY_P TO SECOND_P { $$ = make1_str("day to second"); }
3426 | HOUR_P TO MINUTE_P { $$ = make1_str("hour to minute"); }
3427 | MINUTE_P TO SECOND_P { $$ = make1_str("minute to second"); }
3428 | HOUR_P TO SECOND_P { $$ = make1_str("hour to second"); }
3429 | /*EMPTY*/ { $$ = make1_str(""); }
3433 /*****************************************************************************
3435 * expression grammar, still needs some cleanup
3437 *****************************************************************************/
3439 a_expr_or_null: a_expr
3443 $$ = make1_str("null");
3447 /* Expressions using row descriptors
3448 * Define row_descriptor to allow yacc to break the reduce/reduce conflict
3449 * with singleton expressions.
3450 * Eliminated lots of code by defining row_op and sub_type clauses.
3451 * However, can not consolidate EXPR_LINK case with others subselects
3452 * due to shift/reduce conflict with the non-subselect clause (the parser
3453 * would have to look ahead more than one token to resolve the conflict).
3454 * - thomas 1998-05-09
3456 row_expr: '(' row_descriptor ')' IN '(' SubSelect ')'
3458 $$ = make5_str(make1_str("("), $2, make1_str(") in ("), $6, make1_str(")"));
3460 | '(' row_descriptor ')' NOT IN '(' SubSelect ')'
3462 $$ = make5_str(make1_str("("), $2, make1_str(") not in ("), $7, make1_str(")"));
3464 | '(' row_descriptor ')' row_op sub_type '(' SubSelect ')'
3466 $$ = make4_str(make5_str(make1_str("("), $2, make1_str(")"), $4, $5), make1_str("("), $7, make1_str(")"));
3468 | '(' row_descriptor ')' row_op '(' SubSelect ')'
3470 $$ = make3_str(make5_str(make1_str("("), $2, make1_str(")"), $4, make1_str("(")), $6, make1_str(")"));
3472 | '(' row_descriptor ')' row_op '(' row_descriptor ')'
3474 $$ = cat3_str(make3_str(make1_str("("), $2, make1_str(")")), $4, make3_str(make1_str("("), $6, make1_str(")")));
3478 row_descriptor: row_list ',' a_expr
3480 $$ = cat3_str($1, make1_str(","), $3);
3484 row_op: Op { $$ = $1; }
3495 sub_type: ANY { $$ = make1_str("ANY"); }
3496 | ALL { $$ = make1_str("ALL"); }
3500 row_list: row_list ',' a_expr
3502 $$ = cat3_str($1, make1_str(","), $3);
3510 /* General expressions
3511 * This is the heart of the expression syntax.
3512 * Note that the BETWEEN clause looks similar to a boolean expression
3513 * and so we must define b_expr which is almost the same as a_expr
3514 * but without the boolean expressions.
3515 * All operations/expressions are allowed in a BETWEEN clause
3516 * if surrounded by parens.
3519 a_expr: attr opt_indirection
3521 $$ = cat2_str($1, $2);
3531 | '-' a_expr %prec UMINUS
3532 { $$ = cat2_str(make1_str("-"), $2); }
3534 { $$ = cat2_str(make1_str("%"), $2); }
3536 { $$ = cat2_str($1, make1_str("%")); }
3538 { $$ = cat3_str($1, make1_str("+"), $3); }
3540 { $$ = cat3_str($1, make1_str("-"), $3); }
3542 { $$ = cat3_str($1, make1_str("/"), $3); }
3544 { $$ = cat3_str($1, make1_str("%"), $3); }
3546 { $$ = cat3_str($1, make1_str("*"), $3); }
3548 { $$ = cat3_str($1, make1_str("<"), $3); }
3550 { $$ = cat3_str($1, make1_str(">"), $3); }
3552 { $$ = cat2_str($1, make1_str("= NULL")); }
3554 { $$ = cat2_str(make1_str("= NULL"), $3); }
3556 { $$ = cat3_str($1, make1_str("="), $3); }
3557 /* not possible in embedded sql | ':' a_expr
3558 { $$ = cat2_str(make1_str(":"), $2); }
3561 { $$ = cat2_str(make1_str(";"), $2); }
3563 { $$ = cat2_str(make1_str("|"), $2); }
3564 | a_expr TYPECAST Typename
3566 $$ = cat3_str($1, make1_str("::"), $3);
3568 | CAST '(' a_expr AS Typename ')'
3570 $$ = cat3_str(make2_str(make1_str("cast("), $3), make1_str("as"), make2_str($5, make1_str(")")));
3572 | '(' a_expr_or_null ')'
3573 { $$ = make3_str(make1_str("("), $2, make1_str(")")); }
3575 { $$ = cat3_str($1, $2, $3); }
3576 | a_expr LIKE a_expr
3577 { $$ = cat3_str($1, make1_str("like"), $3); }
3578 | a_expr NOT LIKE a_expr
3579 { $$ = cat3_str($1, make1_str("not like"), $4); }
3581 { $$ = cat2_str($1, $2); }
3583 { $$ = cat2_str($1, $2); }
3584 | func_name '(' '*' ')'
3586 $$ = cat2_str($1, make1_str("(*)"));
3590 $$ = cat2_str($1, make1_str("()"));
3592 | func_name '(' expr_list ')'
3594 $$ = make4_str($1, make1_str("("), $3, make1_str(")"));
3598 $$ = make1_str("current_date");
3602 $$ = make1_str("current_time");
3604 | CURRENT_TIME '(' Iconst ')'
3607 fprintf(stderr,"CURRENT_TIME(%s) precision not implemented; zero used instead", $3);
3608 $$ = make1_str("current_time");
3612 $$ = make1_str("current_timestamp");
3614 | CURRENT_TIMESTAMP '(' Iconst ')'
3617 fprintf(stderr,"CURRENT_TIMESTAMP(%s) precision not implemented; zero used instead",$3);
3618 $$ = make1_str("current_timestamp");
3622 $$ = make1_str("current_user");
3626 $$ = make1_str("user");
3628 | EXISTS '(' SubSelect ')'
3630 $$ = make3_str(make1_str("exists("), $3, make1_str(")"));
3632 | EXTRACT '(' extract_list ')'
3634 $$ = make3_str(make1_str("extract("), $3, make1_str(")"));
3636 | POSITION '(' position_list ')'
3638 $$ = make3_str(make1_str("position("), $3, make1_str(")"));
3640 | SUBSTRING '(' substr_list ')'
3642 $$ = make3_str(make1_str("substring("), $3, make1_str(")"));
3644 /* various trim expressions are defined in SQL92 - thomas 1997-07-19 */
3645 | TRIM '(' BOTH trim_list ')'
3647 $$ = make3_str(make1_str("trim(both"), $4, make1_str(")"));
3649 | TRIM '(' LEADING trim_list ')'
3651 $$ = make3_str(make1_str("trim(leading"), $4, make1_str(")"));
3653 | TRIM '(' TRAILING trim_list ')'
3655 $$ = make3_str(make1_str("trim(trailing"), $4, make1_str(")"));
3657 | TRIM '(' trim_list ')'
3659 $$ = make3_str(make1_str("trim("), $3, make1_str(")"));
3662 { $$ = cat2_str($1, make1_str("isnull")); }
3664 { $$ = cat2_str($1, make1_str("is null")); }
3666 { $$ = cat2_str($1, make1_str("notnull")); }
3667 | a_expr IS NOT NULL_P
3668 { $$ = cat2_str($1, make1_str("is not null")); }
3669 /* IS TRUE, IS FALSE, etc used to be function calls
3670 * but let's make them expressions to allow the optimizer
3671 * a chance to eliminate them if a_expr is a constant string.
3672 * - thomas 1997-12-22
3676 { $$ = cat2_str($1, make1_str("is true")); }
3678 | a_expr IS NOT FALSE_P
3680 { $$ = cat2_str($1, make1_str("is not false")); }
3684 { $$ = cat2_str($1, make1_str("is false")); }
3686 | a_expr IS NOT TRUE_P
3688 { $$ = cat2_str($1, make1_str("is not true")); }
3690 | a_expr BETWEEN b_expr AND b_expr
3692 $$ = cat5_str($1, make1_str("between"), $3, make1_str("and"), $5);
3694 | a_expr NOT BETWEEN b_expr AND b_expr
3696 $$ = cat5_str($1, make1_str("not between"), $4, make1_str("and"), $6);
3698 | a_expr IN '(' in_expr ')'
3700 $$ = make4_str($1, make1_str(" in ("), $4, make1_str(")"));
3702 | a_expr NOT IN '(' not_in_expr ')'
3704 $$ = make4_str($1, make1_str(" not in ("), $5, make1_str(")"));
3706 | a_expr Op '(' SubSelect ')'
3708 $$ = cat3_str($1, $2, make3_str(make1_str("("), $4, make1_str(")")));
3710 | a_expr '+' '(' SubSelect ')'
3712 $$ = make4_str($1, make1_str("+("), $4, make1_str(")"));
3714 | a_expr '-' '(' SubSelect ')'
3716 $$ = make4_str($1, make1_str("-("), $4, make1_str(")"));
3718 | a_expr '/' '(' SubSelect ')'
3720 $$ = make4_str($1, make1_str("/("), $4, make1_str(")"));
3722 | a_expr '%' '(' SubSelect ')'
3724 $$ = make4_str($1, make1_str("%("), $4, make1_str(")"));
3726 | a_expr '*' '(' SubSelect ')'
3728 $$ = make4_str($1, make1_str("*("), $4, make1_str(")"));
3730 | a_expr '<' '(' SubSelect ')'
3732 $$ = make4_str($1, make1_str("<("), $4, make1_str(")"));
3734 | a_expr '>' '(' SubSelect ')'
3736 $$ = make4_str($1, make1_str(">("), $4, make1_str(")"));
3738 | a_expr '=' '(' SubSelect ')'
3740 $$ = make4_str($1, make1_str("=("), $4, make1_str(")"));
3742 | a_expr Op ANY '(' SubSelect ')'
3744 $$ = cat3_str($1, $2, make3_str(make1_str("any("), $5, make1_str(")")));
3746 | a_expr '+' ANY '(' SubSelect ')'
3748 $$ = make4_str($1, make1_str("+ any("), $5, make1_str(")"));
3750 | a_expr '-' ANY '(' SubSelect ')'
3752 $$ = make4_str($1, make1_str("- any("), $5, make1_str(")"));
3754 | a_expr '/' ANY '(' SubSelect ')'
3756 $$ = make4_str($1, make1_str("/ any("), $5, make1_str(")"));
3758 | a_expr '%' ANY '(' SubSelect ')'
3760 $$ = make4_str($1, make1_str("% any("), $5, make1_str(")"));
3762 | a_expr '*' ANY '(' SubSelect ')'
3764 $$ = make4_str($1, make1_str("* any("), $5, make1_str(")"));
3766 | a_expr '<' ANY '(' SubSelect ')'
3768 $$ = make4_str($1, make1_str("< any("), $5, make1_str(")"));
3770 | a_expr '>' ANY '(' SubSelect ')'
3772 $$ = make4_str($1, make1_str("> any("), $5, make1_str(")"));
3774 | a_expr '=' ANY '(' SubSelect ')'
3776 $$ = make4_str($1, make1_str("= any("), $5, make1_str(")"));
3778 | a_expr Op ALL '(' SubSelect ')'
3780 $$ = cat3_str($1, $2, make3_str(make1_str("all ("), $5, make1_str(")")));
3782 | a_expr '+' ALL '(' SubSelect ')'
3784 $$ = make4_str($1, make1_str("+ all("), $5, make1_str(")"));
3786 | a_expr '-' ALL '(' SubSelect ')'
3788 $$ = make4_str($1, make1_str("- all("), $5, make1_str(")"));
3790 | a_expr '/' ALL '(' SubSelect ')'
3792 $$ = make4_str($1, make1_str("/ all("), $5, make1_str(")"));
3794 | a_expr '%' ALL '(' SubSelect ')'
3796 $$ = make4_str($1, make1_str("% all("), $5, make1_str(")"));
3798 | a_expr '*' ALL '(' SubSelect ')'
3800 $$ = make4_str($1, make1_str("* all("), $5, make1_str(")"));
3802 | a_expr '<' ALL '(' SubSelect ')'
3804 $$ = make4_str($1, make1_str("< all("), $5, make1_str(")"));
3806 | a_expr '>' ALL '(' SubSelect ')'
3808 $$ = make4_str($1, make1_str("> all("), $5, make1_str(")"));
3810 | a_expr '=' ALL '(' SubSelect ')'
3812 $$ = make4_str($1, make1_str("= all("), $5, make1_str(")"));
3815 { $$ = cat3_str($1, make1_str("and"), $3); }
3817 { $$ = cat3_str($1, make1_str("or"), $3); }
3819 { $$ = cat2_str(make1_str("not"), $2); }
3823 { $$ = make1_str("?"); }
3826 /* Restricted expressions
3827 * b_expr is a subset of the complete expression syntax
3828 * defined by a_expr. b_expr is used in BETWEEN clauses
3829 * to eliminate parser ambiguities stemming from the AND keyword.
3831 b_expr: attr opt_indirection
3833 $$ = cat2_str($1, $2);
3841 | '-' b_expr %prec UMINUS
3842 { $$ = cat2_str(make1_str("-"), $2); }
3844 { $$ = cat2_str(make1_str("%"), $2); }
3846 { $$ = cat2_str($1, make1_str("%")); }
3848 { $$ = cat3_str($1, make1_str("+"), $3); }
3850 { $$ = cat3_str($1, make1_str("-"), $3); }
3852 { $$ = cat3_str($1, make1_str("/"), $3); }
3854 { $$ = cat3_str($1, make1_str("%"), $3); }
3856 { $$ = cat3_str($1, make1_str("*"), $3); }
3857 /* not possible in embedded sql | ':' b_expr
3858 { $$ = cat2_str(make1_str(":"), $2); }
3861 { $$ = cat2_str(make1_str(";"), $2); }
3863 { $$ = cat2_str(make1_str("|"), $2); }
3864 | b_expr TYPECAST Typename
3866 $$ = cat3_str($1, make1_str("::"), $3);
3868 | CAST '(' b_expr AS Typename ')'
3870 $$ = cat3_str(make2_str(make1_str("cast("), $3), make1_str("as"), make2_str($5, make1_str(")")));
3873 { $$ = make3_str(make1_str("("), $2, make1_str(")")); }
3875 { $$ = cat3_str($1, $2, $3); }
3877 { $$ = cat2_str($1, $2); }
3879 { $$ = cat2_str($1, $2); }
3882 $$ = cat2_str($1, make1_str("()"));
3884 | func_name '(' expr_list ')'
3886 $$ = make4_str($1, make1_str("("), $3, make1_str(")"));
3890 $$ = make1_str("current_date");
3894 $$ = make1_str("current_time");
3896 | CURRENT_TIME '(' Iconst ')'
3899 fprintf(stderr,"CURRENT_TIME(%s) precision not implemented; zero used instead", $3);
3900 $$ = make1_str("current_time");
3904 $$ = make1_str("current_timestamp");
3906 | CURRENT_TIMESTAMP '(' Iconst ')'
3909 fprintf(stderr,"CURRENT_TIMESTAMP(%s) precision not implemented; zero used instead",$3);
3910 $$ = make1_str("current_timestamp");
3914 $$ = make1_str("current_user");
3918 $$ = make1_str("user");
3920 | POSITION '(' position_list ')'
3922 $$ = make3_str(make1_str("position ("), $3, make1_str(")"));
3924 | SUBSTRING '(' substr_list ')'
3926 $$ = make3_str(make1_str("substring ("), $3, make1_str(")"));
3928 /* various trim expressions are defined in SQL92 - thomas 1997-07-19 */
3929 | TRIM '(' BOTH trim_list ')'
3931 $$ = make3_str(make1_str("trim(both"), $4, make1_str(")"));
3933 | TRIM '(' LEADING trim_list ')'
3935 $$ = make3_str(make1_str("trim(leading"), $4, make1_str(")"));
3937 | TRIM '(' TRAILING trim_list ')'
3939 $$ = make3_str(make1_str("trim(trailing"), $4, make1_str(")"));
3941 | TRIM '(' trim_list ')'
3943 $$ = make3_str(make1_str("trim("), $3, make1_str(")"));
3949 opt_indirection: '[' ecpg_expr ']' opt_indirection
3951 $$ = cat4_str(make1_str("["), $2, make1_str("]"), $4);
3953 | '[' ecpg_expr ':' ecpg_expr ']' opt_indirection
3955 $$ = cat2_str(cat5_str(make1_str("["), $2, make1_str(":"), $4, make1_str("]")), $6);
3958 { $$ = make1_str(""); }
3961 expr_list: a_expr_or_null
3963 | expr_list ',' a_expr_or_null
3964 { $$ = cat3_str($1, make1_str(","), $3); }
3965 | expr_list USING a_expr
3966 { $$ = cat3_str($1, make1_str("using"), $3); }
3969 extract_list: extract_arg FROM a_expr
3971 $$ = cat3_str($1, make1_str("from"), $3);
3974 { $$ = make1_str(""); }
3976 { $$ = make1_str("?"); }
3979 extract_arg: datetime { $$ = $1; }
3980 | TIMEZONE_HOUR { $$ = make1_str("timezone_hour"); }
3981 | TIMEZONE_MINUTE { $$ = make1_str("timezone_minute"); }
3984 position_list: position_expr IN position_expr
3985 { $$ = cat3_str($1, make1_str("in"), $3); }
3987 { $$ = make1_str(""); }
3990 position_expr: attr opt_indirection
3992 $$ = cat2_str($1, $2);
3996 | '-' position_expr %prec UMINUS
3997 { $$ = cat2_str(make1_str("-"), $2); }
3998 | position_expr '+' position_expr
3999 { $$ = cat3_str($1, make1_str("+"), $3); }
4000 | position_expr '-' position_expr
4001 { $$ = cat3_str($1, make1_str("-"), $3); }
4002 | position_expr '/' position_expr
4003 { $$ = cat3_str($1, make1_str("/"), $3); }
4004 | position_expr '%' position_expr
4005 { $$ = cat3_str($1, make1_str("%"), $3); }
4006 | position_expr '*' position_expr
4007 { $$ = cat3_str($1, make1_str("*"), $3); }
4009 { $$ = cat2_str(make1_str("|"), $2); }
4010 | position_expr TYPECAST Typename
4012 $$ = cat3_str($1, make1_str("::"), $3);
4014 | CAST '(' position_expr AS Typename ')'
4016 $$ = cat3_str(make2_str(make1_str("cast("), $3), make1_str("as"), make2_str($5, make1_str(")")));
4018 | '(' position_expr ')'
4019 { $$ = make3_str(make1_str("("), $2, make1_str(")")); }
4020 | position_expr Op position_expr
4021 { $$ = cat3_str($1, $2, $3); }
4023 { $$ = cat2_str($1, $2); }
4025 { $$ = cat2_str($1, $2); }
4032 $$ = cat2_str($1, make1_str("()"));
4034 | func_name '(' expr_list ')'
4036 $$ = make4_str($1, make1_str("("), $3, make1_str(")"));
4038 | POSITION '(' position_list ')'
4040 $$ = make3_str(make1_str("position("), $3, make1_str(")"));
4042 | SUBSTRING '(' substr_list ')'
4044 $$ = make3_str(make1_str("substring("), $3, make1_str(")"));
4046 /* various trim expressions are defined in SQL92 - thomas 1997-07-19 */
4047 | TRIM '(' BOTH trim_list ')'
4049 $$ = make3_str(make1_str("trim(both"), $4, make1_str(")"));
4051 | TRIM '(' LEADING trim_list ')'
4053 $$ = make3_str(make1_str("trim(leading"), $4, make1_str(")"));
4055 | TRIM '(' TRAILING trim_list ')'
4057 $$ = make3_str(make1_str("trim(trailing"), $4, make1_str(")"));
4059 | TRIM '(' trim_list ')'
4061 $$ = make3_str(make1_str("trim("), $3, make1_str(")"));
4065 substr_list: expr_list substr_from substr_for
4067 $$ = cat3_str($1, $2, $3);
4070 { $$ = make1_str(""); }
4073 substr_from: FROM expr_list
4074 { $$ = cat2_str(make1_str("from"), $2); }
4081 substr_for: FOR expr_list
4082 { $$ = cat2_str(make1_str("for"), $2); }
4084 { $$ = make1_str(""); }
4087 trim_list: a_expr FROM expr_list
4088 { $$ = cat3_str($1, make1_str("from"), $3); }
4090 { $$ = cat2_str(make1_str("from"), $2); }
4103 in_expr_nodes: AexprConst
4105 | in_expr_nodes ',' AexprConst
4106 { $$ = cat3_str($1, make1_str(","), $3);}
4109 not_in_expr: SubSelect
4117 not_in_expr_nodes: AexprConst
4119 | not_in_expr_nodes ',' AexprConst
4120 { $$ = cat3_str($1, make1_str(","), $3);}
4124 * Define SQL92-style case clause.
4125 * Allow all four forms described in the standard:
4126 * - Full specification
4127 * CASE WHEN a = b THEN c ... ELSE d END
4128 * - Implicit argument
4129 * CASE a WHEN b THEN c ... ELSE d END
4130 * - Conditional NULL
4132 * same as CASE WHEN x = y THEN NULL ELSE x END
4133 * - Conditional substitution from list, use first non-null argument
4135 * same as CASE WHEN a IS NOT NULL THEN a WHEN b IS NOT NULL THEN b ... END
4136 * - thomas 1998-11-09
4138 case_expr: CASE case_arg when_clause_list case_default END_TRANS
4139 { $$ = cat5_str(make1_str("case"), $2, $3, $4, make1_str("end")); }
4140 | NULLIF '(' a_expr ',' a_expr ')'
4142 $$ = cat5_str(make1_str("nullif("), $3, make1_str(","), $5, make1_str(")"));
4144 fprintf(stderr, "NULLIF() not yet fully implemented");
4146 | COALESCE '(' expr_list ')'
4148 $$ = cat3_str(make1_str("coalesce("), $3, make1_str(")"));
4152 when_clause_list: when_clause_list when_clause
4153 { $$ = cat2_str($1, $2); }
4158 when_clause: WHEN a_expr THEN a_expr_or_null
4160 $$ = cat4_str(make1_str("when"), $2, make1_str("then"), $4);
4164 case_default: ELSE a_expr_or_null { $$ = cat2_str(make1_str("else"), $2); }
4165 | /*EMPTY*/ { $$ = make1_str(""); }
4168 case_arg: attr opt_indirection
4170 $$ = cat2_str($1, $2);
4177 { $$ = make1_str(""); }
4180 attr: relation_name '.' attrs
4182 $$ = make3_str($1, make1_str("."), $3);
4186 $$ = make3_str($1, make1_str("."), $3);
4192 | attrs '.' attr_name
4193 { $$ = make3_str($1, make1_str("."), $3); }
4195 { $$ = make2_str($1, make1_str(".*")); }
4199 /*****************************************************************************
4203 *****************************************************************************/
4205 res_target_list: res_target_list ',' res_target_el
4206 { $$ = cat3_str($1, make1_str(","),$3); }
4209 | '*' { $$ = make1_str("*"); }
4212 res_target_el: ColId opt_indirection '=' a_expr_or_null
4214 $$ = cat4_str($1, $2, make1_str("="), $4);
4216 | attr opt_indirection
4218 $$ = cat2_str($1, $2);
4220 | relation_name '.' '*'
4222 $$ = make2_str($1, make1_str(".*"));
4227 ** target list for select.
4228 ** should get rid of the other but is still needed by the defunct select into
4229 ** and update (uses a subset)
4231 res_target_list2: res_target_list2 ',' res_target_el2
4232 { $$ = cat3_str($1, make1_str(","), $3); }
4237 /* AS is not optional because shift/red conflict with unary ops */
4238 res_target_el2: a_expr_or_null AS ColLabel
4240 $$ = cat3_str($1, make1_str("as"), $3);
4246 | relation_name '.' '*'
4248 $$ = make2_str($1, make1_str(".*"));
4252 $$ = make1_str("*");
4256 opt_id: ColId { $$ = $1; }
4257 | /* EMPTY */ { $$ = make1_str(""); }
4260 relation_name: SpecialRuleRelation
4266 /* disallow refs to variable system tables */
4267 if (strcmp(LogRelationName, $1) == 0
4268 || strcmp(VariableRelationName, $1) == 0) {
4269 sprintf(errortext, make1_str("%s cannot be accessed by users"),$1);
4277 database_name: ColId { $$ = $1; };
4278 access_method: ident { $$ = $1; };
4279 attr_name: ColId { $$ = $1; };
4280 class: ident { $$ = $1; };
4281 index_name: ColId { $$ = $1; };
4284 * Include date/time keywords as SQL92 extension.
4285 * Include TYPE as a SQL92 unreserved keyword. - thomas 1997-10-05
4287 name: ColId { $$ = $1; };
4288 func_name: ColId { $$ = $1; };
4290 file_name: Sconst { $$ = $1; };
4291 /* NOT USED recipe_name: ident { $$ = $1; };*/
4294 * Include TRUE/FALSE for SQL3 support. - thomas 1997-10-24
4310 $$ = cat2_str($1, $2);
4316 $$ = make1_str("true");
4320 $$ = make1_str("false");
4324 ParamNo: PARAM opt_indirection
4326 $$ = cat2_str(make_name(), $2);
4330 Iconst: ICONST { $$ = make_name();};
4331 Fconst: FCONST { $$ = make_name();};
4333 $$ = (char *)mm_alloc(strlen($1) + 3);
4336 $$[strlen($1)+2]='\0';
4337 $$[strlen($1)+1]='\'';
4340 UserId: ident { $$ = $1;};
4342 /* Column and type identifier
4343 * Does not include explicit datetime types
4344 * since these must be decoupled in Typename syntax.
4345 * Use ColId for most identifiers. - thomas 1997-10-21
4354 /* Column identifier
4355 * Include date/time keywords as SQL92 extension.
4356 * Include TYPE as a SQL92 unreserved keyword. - thomas 1997-10-05
4357 * Add other keywords. Note that as the syntax expands,
4358 * some of these keywords will have to be removed from this
4359 * list due to shift/reduce conflicts in yacc. If so, move
4360 * down to the ColLabel entity. - thomas 1997-11-06
4362 ColId: ident { $$ = $1; }
4363 | datetime { $$ = $1; }
4364 | ABSOLUTE { $$ = make1_str("absolute"); }
4365 | ACCESS { $$ = make1_str("access"); }
4366 | ACTION { $$ = make1_str("action"); }
4367 | AFTER { $$ = make1_str("after"); }
4368 | AGGREGATE { $$ = make1_str("aggregate"); }
4369 | BACKWARD { $$ = make1_str("backward"); }
4370 | BEFORE { $$ = make1_str("before"); }
4371 | CACHE { $$ = make1_str("cache"); }
4372 | COMMITTED { $$ = make1_str("committed"); }
4373 | CREATEDB { $$ = make1_str("createdb"); }
4374 | CREATEUSER { $$ = make1_str("createuser"); }
4375 | CYCLE { $$ = make1_str("cycle"); }
4376 | DATABASE { $$ = make1_str("database"); }
4377 | DELIMITERS { $$ = make1_str("delimiters"); }
4378 | DOUBLE { $$ = make1_str("double"); }
4379 | EACH { $$ = make1_str("each"); }
4380 | ENCODING { $$ = make1_str("encoding"); }
4381 | EXCLUSIVE { $$ = make1_str("exclusive"); }
4382 | FORWARD { $$ = make1_str("forward"); }
4383 | FUNCTION { $$ = make1_str("function"); }
4384 | HANDLER { $$ = make1_str("handler"); }
4385 | INCREMENT { $$ = make1_str("increment"); }
4386 | INDEX { $$ = make1_str("index"); }
4387 | INHERITS { $$ = make1_str("inherits"); }
4388 | INSENSITIVE { $$ = make1_str("insensitive"); }
4389 | INSTEAD { $$ = make1_str("instead"); }
4390 | ISNULL { $$ = make1_str("isnull"); }
4391 | KEY { $$ = make1_str("key"); }
4392 | LANGUAGE { $$ = make1_str("language"); }
4393 | LANCOMPILER { $$ = make1_str("lancompiler"); }
4394 | LOCATION { $$ = make1_str("location"); }
4395 | MATCH { $$ = make1_str("match"); }
4396 | MAXVALUE { $$ = make1_str("maxvalue"); }
4397 | MINVALUE { $$ = make1_str("minvalue"); }
4398 | MODE { $$ = make1_str("mode"); }
4399 | NEXT { $$ = make1_str("next"); }
4400 | NOCREATEDB { $$ = make1_str("nocreatedb"); }
4401 | NOCREATEUSER { $$ = make1_str("nocreateuser"); }
4402 | NOTHING { $$ = make1_str("nothing"); }
4403 | NOTNULL { $$ = make1_str("notnull"); }
4404 | OF { $$ = make1_str("of"); }
4405 | OIDS { $$ = make1_str("oids"); }
4406 | ONLY { $$ = make1_str("only"); }
4407 | OPERATOR { $$ = make1_str("operator"); }
4408 | OPTION { $$ = make1_str("option"); }
4409 | PASSWORD { $$ = make1_str("password"); }
4410 | PRIOR { $$ = make1_str("prior"); }
4411 | PRIVILEGES { $$ = make1_str("privileges"); }
4412 | PROCEDURAL { $$ = make1_str("procedural"); }
4413 | READ { $$ = make1_str("read"); }
4414 /* NOT USED | RECIPE { $$ = make1_str("recipe"); } */
4415 | RELATIVE { $$ = make1_str("relative"); }
4416 | RENAME { $$ = make1_str("rename"); }
4417 | RETURNS { $$ = make1_str("returns"); }
4418 | ROW { $$ = make1_str("row"); }
4419 | RULE { $$ = make1_str("rule"); }
4420 | SCROLL { $$ = make1_str("scroll"); }
4421 | SEQUENCE { $$ = make1_str("sequence"); }
4422 | SERIAL { $$ = make1_str("serial"); }
4423 | SERIALIZABLE { $$ = make1_str("serializable"); }
4424 | SHARE { $$ = make1_str("share"); }
4425 | START { $$ = make1_str("start"); }
4426 | STATEMENT { $$ = make1_str("statement"); }
4427 | STDIN { $$ = make1_str("stdin"); }
4428 | STDOUT { $$ = make1_str("stdout"); }
4429 | TIME { $$ = make1_str("time"); }
4430 | TIMESTAMP { $$ = make1_str("timestamp"); }
4431 | TIMEZONE_HOUR { $$ = make1_str("timezone_hour"); }
4432 | TIMEZONE_MINUTE { $$ = make1_str("timezone_minute"); }
4433 | TRIGGER { $$ = make1_str("trigger"); }
4434 | TRUSTED { $$ = make1_str("trusted"); }
4435 | TYPE_P { $$ = make1_str("type"); }
4436 | VALID { $$ = make1_str("valid"); }
4437 | VERSION { $$ = make1_str("version"); }
4438 | ZONE { $$ = make1_str("zone"); }
4439 | SQL_AT { $$ = make1_str("at"); }
4440 | SQL_BOOL { $$ = make1_str("bool"); }
4441 | SQL_BREAK { $$ = make1_str("break"); }
4442 | SQL_CALL { $$ = make1_str("call"); }
4443 | SQL_CONNECT { $$ = make1_str("connect"); }
4444 | SQL_CONTINUE { $$ = make1_str("continue"); }
4445 | SQL_DEALLOCATE { $$ = make1_str("deallocate"); }
4446 | SQL_DISCONNECT { $$ = make1_str("disconnect"); }
4447 | SQL_FOUND { $$ = make1_str("found"); }
4448 | SQL_GO { $$ = make1_str("go"); }
4449 | SQL_GOTO { $$ = make1_str("goto"); }
4450 | SQL_IDENTIFIED { $$ = make1_str("identified"); }
4451 | SQL_IMMEDIATE { $$ = make1_str("immediate"); }
4452 | SQL_INDICATOR { $$ = make1_str("indicator"); }
4453 | SQL_INT { $$ = make1_str("int"); }
4454 | SQL_LONG { $$ = make1_str("long"); }
4455 | SQL_OFF { $$ = make1_str("off"); }
4456 | SQL_OPEN { $$ = make1_str("open"); }
4457 | SQL_PREPARE { $$ = make1_str("prepare"); }
4458 | SQL_RELEASE { $$ = make1_str("release"); }
4459 | SQL_SECTION { $$ = make1_str("section"); }
4460 | SQL_SHORT { $$ = make1_str("short"); }
4461 | SQL_SIGNED { $$ = make1_str("signed"); }
4462 | SQL_SQLERROR { $$ = make1_str("sqlerror"); }
4463 | SQL_SQLPRINT { $$ = make1_str("sqlprint"); }
4464 | SQL_SQLWARNING { $$ = make1_str("sqlwarning"); }
4465 | SQL_STOP { $$ = make1_str("stop"); }
4466 | SQL_STRUCT { $$ = make1_str("struct"); }
4467 | SQL_UNSIGNED { $$ = make1_str("unsigned"); }
4468 | SQL_VAR { $$ = make1_str("var"); }
4469 | SQL_WHENEVER { $$ = make1_str("whenever"); }
4472 * Allowed labels in "AS" clauses.
4473 * Include TRUE/FALSE SQL3 reserved words for Postgres backward
4474 * compatibility. Cannot allow this for column names since the
4475 * syntax would not distinguish between the constant value and
4476 * a column name. - thomas 1997-10-24
4477 * Add other keywords to this list. Note that they appear here
4478 * rather than in ColId if there was a shift/reduce conflict
4479 * when used as a full identifier. - thomas 1997-11-06
4481 ColLabel: ColId { $$ = $1; }
4482 | ABORT_TRANS { $$ = make1_str("abort"); }
4483 | ANALYZE { $$ = make1_str("analyze"); }
4484 | BINARY { $$ = make1_str("binary"); }
4485 | CASE { $$ = make1_str("case"); }
4486 | CLUSTER { $$ = make1_str("cluster"); }
4487 | COALESCE { $$ = make1_str("coalesce"); }
4488 | CONSTRAINT { $$ = make1_str("constraint"); }
4489 | COPY { $$ = make1_str("copy"); }
4490 | CURRENT { $$ = make1_str("current"); }
4491 | DO { $$ = make1_str("do"); }
4492 | ELSE { $$ = make1_str("else"); }
4493 | END_TRANS { $$ = make1_str("end"); }
4494 | EXPLAIN { $$ = make1_str("explain"); }
4495 | EXTEND { $$ = make1_str("extend"); }
4496 | FALSE_P { $$ = make1_str("false"); }
4497 | FOREIGN { $$ = make1_str("foreign"); }
4498 | GROUP { $$ = make1_str("group"); }
4499 | LISTEN { $$ = make1_str("listen"); }
4500 | LOAD { $$ = make1_str("load"); }
4501 | LOCK_P { $$ = make1_str("lock"); }
4502 | MOVE { $$ = make1_str("move"); }
4503 | NEW { $$ = make1_str("new"); }
4504 | NONE { $$ = make1_str("none"); }
4505 | NULLIF { $$ = make1_str("nullif"); }
4506 | ORDER { $$ = make1_str("order"); }
4507 | POSITION { $$ = make1_str("position"); }
4508 | PRECISION { $$ = make1_str("precision"); }
4509 | RESET { $$ = make1_str("reset"); }
4510 | SETOF { $$ = make1_str("setof"); }
4511 | SHOW { $$ = make1_str("show"); }
4512 | TABLE { $$ = make1_str("table"); }
4513 | THEN { $$ = make1_str("then"); }
4514 | TRANSACTION { $$ = make1_str("transaction"); }
4515 | TRUE_P { $$ = make1_str("true"); }
4516 | VACUUM { $$ = make1_str("vacuum"); }
4517 | VERBOSE { $$ = make1_str("verbose"); }
4518 | WHEN { $$ = make1_str("when"); }
4521 SpecialRuleRelation: CURRENT
4524 $$ = make1_str("current");
4526 yyerror("CURRENT used in non-rule query");
4531 $$ = make1_str("new");
4533 yyerror("NEW used in non-rule query");
4538 * and now special embedded SQL stuff
4542 * the exec sql connect statement: connect to the given database
4544 ECPGConnect: SQL_CONNECT TO connection_target opt_connection_name opt_user
4546 $$ = make5_str($3, make1_str(","), $5, make1_str(","), $4);
4548 | SQL_CONNECT TO DEFAULT
4550 $$ = make1_str("NULL,NULL,NULL,\"DEFAULT\"");
4552 /* also allow ORACLE syntax */
4553 | SQL_CONNECT ora_user
4555 $$ = make3_str(make1_str("NULL,"), $2, make1_str(",NULL"));
4558 connection_target: database_name opt_server opt_port
4560 /* old style: dbname[@server][:port] */
4561 if (strlen($2) > 0 && *($2) != '@')
4563 sprintf(errortext, "parse error at or near '%s'", $2);
4567 $$ = make5_str(make1_str("\""), $1, $2, $3, make1_str("\""));
4569 | db_prefix server opt_port '/' database_name opt_options
4571 /* new style: <tcp|unix>:postgresql://server[:port][/dbname] */
4572 if (strncmp($2, "://", 3) != 0)
4574 sprintf(errortext, "parse error at or near '%s'", $2);
4578 if (strncmp($1, "unix", 4) == 0 && strncmp($2 + 3, "localhost", 9) != 0)
4580 sprintf(errortext, "unix domain sockets only work on 'localhost' but not on '%9.9s'", $2);
4584 if (strncmp($1, "unix", 4) != 0 && strncmp($1, "tcp", 3) != 0)
4586 sprintf(errortext, "only protocols 'tcp' and 'unix' are supported");
4590 $$ = make4_str(make5_str(make1_str("\""), $1, $2, $3, make1_str("/")), $5, $6, make1_str("\""));
4600 $$[strlen($$) - 1] = '\"';
4604 db_prefix: ident cvariable
4606 if (strcmp($2, "postgresql") != 0 && strcmp($2, "postgres") != 0)
4608 sprintf(errortext, "parse error at or near '%s'", $2);
4612 if (strcmp($1, "tcp") != 0 && strcmp($1, "unix") != 0)
4614 sprintf(errortext, "Illegal connection type %s", $1);
4618 $$ = make3_str($1, make1_str(":"), $2);
4621 server: Op server_name
4623 if (strcmp($1, "@") != 0 && strcmp($1, "://") != 0)
4625 sprintf(errortext, "parse error at or near '%s'", $1);
4629 $$ = make2_str($1, $2);
4632 opt_server: server { $$ = $1; }
4633 | /* empty */ { $$ = make1_str(""); }
4635 server_name: ColId { $$ = $1; }
4636 | ColId '.' server_name { $$ = make3_str($1, make1_str("."), $3); }
4638 opt_port: ':' Iconst { $$ = make2_str(make1_str(":"), $2); }
4639 | /* empty */ { $$ = make1_str(""); }
4641 opt_connection_name: AS connection_target { $$ = $2; }
4642 | /* empty */ { $$ = make1_str("NULL"); }
4644 opt_user: USER ora_user { $$ = $2; }
4645 | /* empty */ { $$ = make1_str("NULL,NULL"); }
4649 $$ = make2_str($1, make1_str(",NULL"));
4651 | user_name '/' user_name
4653 $$ = make3_str($1, make1_str(","), $3);
4655 | user_name SQL_IDENTIFIED BY user_name
4657 $$ = make3_str($1, make1_str(","), $4);
4659 | user_name USING user_name
4661 $$ = make3_str($1, make1_str(","), $3);
4664 user_name: UserId { if ($1[0] == '\"')
4667 $$ = make3_str(make1_str("\""), $1, make1_str("\""));
4669 | char_variable { $$ = $1; }
4670 | SCONST { $$ = make3_str(make1_str("\""), $1, make1_str("\"")); }
4672 char_variable: cvariable
4673 { /* check if we have a char variable */
4674 struct variable *p = find_variable($1);
4675 enum ECPGttype typ = p->type->typ;
4677 /* if array see what's inside */
4678 if (typ == ECPGt_array)
4679 typ = p->type->u.element->typ;
4684 case ECPGt_unsigned_char:
4688 $$ = make2_str($1, make1_str(".arr"));
4691 yyerror("invalid datatype");
4696 opt_options: Op ColId
4698 if (strlen($1) == 0)
4699 yyerror("parse error");
4701 if (strcmp($1, "?") != 0)
4703 sprintf(errortext, "parse error at or near %s", $1);
4707 $$ = make2_str(make1_str("?"), $2);
4709 | /* empty */ { $$ = make1_str(""); }
4712 * Declare a prepared cursor. The syntax is different from the standard
4713 * declare statement, so we create a new rule.
4715 ECPGCursorStmt: DECLARE name opt_cursor CURSOR FOR ident
4717 struct cursor *ptr, *this;
4718 struct variable *thisquery = (struct variable *)mm_alloc(sizeof(struct variable));
4720 for (ptr = cur; ptr != NULL; ptr = ptr->next)
4722 if (strcmp($2, ptr->name) == 0)
4724 /* re-definition is a bug */
4725 sprintf(errortext, "cursor %s already defined", $2);
4730 this = (struct cursor *) mm_alloc(sizeof(struct cursor));
4732 /* initial definition */
4735 this->connection = connection;
4736 this->command = cat4_str(make1_str("declare"), mm_strdup($2), $3, make1_str("cursor for ?"));
4737 this->argsresult = NULL;
4739 thisquery->type = &ecpg_query;
4740 thisquery->brace_level = 0;
4741 thisquery->next = NULL;
4742 thisquery->name = (char *) mm_alloc(sizeof("ECPGprepared_statement(\"\")") + strlen($6));
4743 sprintf(thisquery->name, "ECPGprepared_statement(\"%s\")", $6);
4745 this->argsinsert = NULL;
4746 add_variable(&(this->argsinsert), thisquery, &no_indicator);
4750 $$ = cat3_str(make1_str("/*"), mm_strdup(this->command), make1_str("*/"));
4755 * the exec sql deallocate prepare command to deallocate a previously
4756 * prepared statement
4758 ECPGDeallocate: SQL_DEALLOCATE SQL_PREPARE ident { $$ = make3_str(make1_str("ECPGdeallocate(__LINE__, \""), $3, make1_str("\");")); }
4761 * variable declaration inside the exec sql declare block
4763 ECPGDeclaration: sql_startdeclare
4765 fputs("/* exec sql begin declare section */", yyout);
4766 output_line_number();
4768 variable_declarations sql_enddeclare
4770 fprintf(yyout, "%s/* exec sql end declare section */", $3);
4772 output_line_number();
4775 sql_startdeclare : ecpgstart BEGIN_TRANS DECLARE SQL_SECTION ';' {}
4777 sql_enddeclare: ecpgstart END_TRANS DECLARE SQL_SECTION ';' {}
4779 variable_declarations: /* empty */
4783 | declaration variable_declarations
4785 $$ = cat2_str($1, $2);
4788 declaration: storage_clause
4790 actual_storage[struct_level] = mm_strdup($1);
4794 actual_type[struct_level].type_enum = $3.type_enum;
4795 actual_type[struct_level].type_dimension = $3.type_dimension;
4796 actual_type[struct_level].type_index = $3.type_index;
4800 $$ = cat4_str($1, $3.type_str, $5, make1_str(";\n"));
4803 storage_clause : S_EXTERN { $$ = make1_str("extern"); }
4804 | S_STATIC { $$ = make1_str("static"); }
4805 | S_SIGNED { $$ = make1_str("signed"); }
4806 | S_CONST { $$ = make1_str("const"); }
4807 | S_REGISTER { $$ = make1_str("register"); }
4808 | S_AUTO { $$ = make1_str("auto"); }
4809 | /* empty */ { $$ = make1_str(""); }
4814 $$.type_str = mm_strdup(ECPGtype_name($1));
4815 $$.type_dimension = -1;
4820 $$.type_enum = ECPGt_varchar;
4821 $$.type_str = make1_str("");
4822 $$.type_dimension = -1;
4827 $$.type_enum = ECPGt_struct;
4829 $$.type_dimension = -1;
4834 $$.type_enum = ECPGt_union;
4836 $$.type_dimension = -1;
4842 $$.type_enum = ECPGt_int;
4844 $$.type_dimension = -1;
4849 /* this is for typedef'ed types */
4850 struct typedefs *this = get_typedef($1);
4852 $$.type_str = (this->type->type_enum == ECPGt_varchar) ? make1_str("") : mm_strdup(this->name);
4853 $$.type_enum = this->type->type_enum;
4854 $$.type_dimension = this->type->type_dimension;
4855 $$.type_index = this->type->type_index;
4856 struct_member_list[struct_level] = ECPGstruct_member_dup(this->struct_member_list);
4859 enum_type: s_enum '{' c_line '}'
4861 $$ = cat4_str($1, make1_str("{"), $3, make1_str("}"));
4864 s_enum: S_ENUM opt_symbol { $$ = cat2_str(make1_str("enum"), $2); }
4866 struct_type: s_struct '{' variable_declarations '}'
4868 ECPGfree_struct_member(struct_member_list[struct_level]);
4869 free(actual_storage[struct_level--]);
4870 $$ = cat4_str($1, make1_str("{"), $3, make1_str("}"));
4873 union_type: s_union '{' variable_declarations '}'
4875 ECPGfree_struct_member(struct_member_list[struct_level]);
4876 free(actual_storage[struct_level--]);
4877 $$ = cat4_str($1, make1_str("{"), $3, make1_str("}"));
4880 s_struct : S_STRUCT opt_symbol
4882 struct_member_list[struct_level++] = NULL;
4883 if (struct_level >= STRUCT_DEPTH)
4884 yyerror("Too many levels in nested structure definition");
4885 $$ = cat2_str(make1_str("struct"), $2);
4888 s_union : S_UNION opt_symbol
4890 struct_member_list[struct_level++] = NULL;
4891 if (struct_level >= STRUCT_DEPTH)
4892 yyerror("Too many levels in nested structure definition");
4893 $$ = cat2_str(make1_str("union"), $2);
4896 opt_symbol: /* empty */ { $$ = make1_str(""); }
4897 | symbol { $$ = $1; }
4899 simple_type: S_SHORT { $$ = ECPGt_short; }
4900 | S_UNSIGNED S_SHORT { $$ = ECPGt_unsigned_short; }
4901 | S_INT { $$ = ECPGt_int; }
4902 | S_UNSIGNED S_INT { $$ = ECPGt_unsigned_int; }
4903 | S_LONG { $$ = ECPGt_long; }
4904 | S_UNSIGNED S_LONG { $$ = ECPGt_unsigned_long; }
4905 | S_FLOAT { $$ = ECPGt_float; }
4906 | S_DOUBLE { $$ = ECPGt_double; }
4907 | S_BOOL { $$ = ECPGt_bool; };
4908 | S_CHAR { $$ = ECPGt_char; }
4909 | S_UNSIGNED S_CHAR { $$ = ECPGt_unsigned_char; }
4911 varchar_type: S_VARCHAR { $$ = ECPGt_varchar; }
4913 variable_list: variable
4917 | variable_list ',' variable
4919 $$ = cat3_str($1, make1_str(","), $3);
4922 variable: opt_pointer symbol opt_array_bounds opt_initializer
4924 struct ECPGtype * type;
4925 int dimension = $3.index1; /* dimension of array */
4926 int length = $3.index2; /* lenght of string */
4927 char dim[14L], ascii_len[12];
4929 adjust_array(actual_type[struct_level].type_enum, &dimension, &length, actual_type[struct_level].type_dimension, actual_type[struct_level].type_index, strlen($1));
4931 switch (actual_type[struct_level].type_enum)
4936 type = ECPGmake_struct_type(struct_member_list[struct_level], actual_type[struct_level].type_enum);
4938 type = ECPGmake_array_type(ECPGmake_struct_type(struct_member_list[struct_level], actual_type[struct_level].type_enum), dimension);
4940 $$ = make4_str($1, mm_strdup($2), $3.str, $4);
4943 if (dimension == -1)
4944 type = ECPGmake_simple_type(actual_type[struct_level].type_enum, length);
4946 type = ECPGmake_array_type(ECPGmake_simple_type(actual_type[struct_level].type_enum, length), dimension);
4956 sprintf(dim, "[%d]", dimension);
4959 sprintf(ascii_len, "%d", length);
4962 yyerror ("pointer to varchar are not implemented");
4965 $$ = 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);
4967 $$ = 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);
4971 case ECPGt_unsigned_char:
4972 if (dimension == -1)
4973 type = ECPGmake_simple_type(actual_type[struct_level].type_enum, length);
4975 type = ECPGmake_array_type(ECPGmake_simple_type(actual_type[struct_level].type_enum, length), dimension);
4977 $$ = make4_str($1, mm_strdup($2), $3.str, $4);
4981 type = ECPGmake_simple_type(actual_type[struct_level].type_enum, 1);
4983 type = ECPGmake_array_type(ECPGmake_simple_type(actual_type[struct_level].type_enum, 1), dimension);
4985 $$ = make4_str($1, mm_strdup($2), $3.str, $4);
4989 if (struct_level == 0)
4990 new_variable($2, type);
4992 ECPGmake_struct_member($2, type, &(struct_member_list[struct_level - 1]));
4997 opt_initializer: /* empty */ { $$ = make1_str(""); }
4998 | '=' vartext { $$ = make2_str(make1_str("="), $2); }
5000 opt_pointer: /* empty */ { $$ = make1_str(""); }
5001 | '*' { $$ = make1_str("*"); }
5004 * As long as the prepare statement is not supported by the backend, we will
5005 * try to simulate it here so we get dynamic SQL
5007 ECPGDeclare: DECLARE STATEMENT ident
5009 /* this is only supported for compatibility */
5010 $$ = cat3_str(make1_str("/* declare statement"), $3, make1_str("*/"));
5013 * the exec sql disconnect statement: disconnect from the given database
5015 ECPGDisconnect: SQL_DISCONNECT dis_name { $$ = $2; }
5017 dis_name: connection_object { $$ = $1; }
5018 | CURRENT { $$ = make1_str("CURRENT"); }
5019 | ALL { $$ = make1_str("ALL"); }
5020 | /* empty */ { $$ = make1_str("CURRENT"); }
5022 connection_object: connection_target { $$ = $1; }
5023 | DEFAULT { $$ = make1_str("DEFAULT"); }
5026 * execute a given string as sql command
5028 ECPGExecute : EXECUTE SQL_IMMEDIATE execstring
5030 struct variable *thisquery = (struct variable *)mm_alloc(sizeof(struct variable));
5032 thisquery->type = &ecpg_query;
5033 thisquery->brace_level = 0;
5034 thisquery->next = NULL;
5035 thisquery->name = $3;
5037 add_variable(&argsinsert, thisquery, &no_indicator);
5039 $$ = make1_str("?");
5043 struct variable *thisquery = (struct variable *)mm_alloc(sizeof(struct variable));
5045 thisquery->type = &ecpg_query;
5046 thisquery->brace_level = 0;
5047 thisquery->next = NULL;
5048 thisquery->name = (char *) mm_alloc(sizeof("ECPGprepared_statement(\"\")") + strlen($2));
5049 sprintf(thisquery->name, "ECPGprepared_statement(\"%s\")", $2);
5051 add_variable(&argsinsert, thisquery, &no_indicator);
5054 $$ = make1_str("?");
5057 execstring: char_variable |
5058 CSTRING { $$ = make3_str(make1_str("\""), $1, make1_str("\"")); };
5061 * the exec sql free command to deallocate a previously
5062 * prepared statement
5064 ECPGFree: SQL_FREE ident { $$ = $2; }
5067 * open is an open cursor, at the moment this has to be removed
5069 ECPGOpen: SQL_OPEN name opt_using {
5073 opt_using: /* empty */ { $$ = make1_str(""); }
5074 | USING variablelist {
5075 /* yyerror ("open cursor with variables not implemented yet"); */
5079 variablelist: cinputvariable | cinputvariable ',' variablelist
5082 * As long as the prepare statement is not supported by the backend, we will
5083 * try to simulate it here so we get dynamic SQL
5085 ECPGPrepare: SQL_PREPARE ident FROM execstring
5087 $$ = make4_str(make1_str("\""), $2, make1_str("\", "), $4);
5091 * for compatibility with ORACLE we will also allow the keyword RELEASE
5092 * after a transaction statement to disconnect from the database.
5095 ECPGRelease: TransactionStmt SQL_RELEASE
5097 if (strncmp($1, "begin", 5) == 0)
5098 yyerror("RELEASE does not make sense when beginning a transaction");
5100 fprintf(yyout, "ECPGtrans(__LINE__, %s, \"%s\");", connection, $1);
5102 fprintf(yyout, "ECPGdisconnect(\"\");");
5108 * set/reset the automatic transaction mode, this needs a differnet handling
5109 * as the other set commands
5111 ECPGSetAutocommit: SET SQL_AUTOCOMMIT to_equal on_off
5116 on_off: ON { $$ = make1_str("on"); }
5117 | SQL_OFF { $$ = make1_str("off"); }
5122 * set the actual connection, this needs a differnet handling as the other
5125 ECPGSetConnection: SET SQL_CONNECTION to_equal connection_object
5131 * define a new type for embedded SQL
5133 ECPGTypedef: TYPE_P symbol IS ctype opt_type_array_bounds opt_reference
5135 /* add entry to list */
5136 struct typedefs *ptr, *this;
5137 int dimension = $5.index1;
5138 int length = $5.index2;
5140 for (ptr = types; ptr != NULL; ptr = ptr->next)
5142 if (strcmp($2, ptr->name) == 0)
5144 /* re-definition is a bug */
5145 sprintf(errortext, "type %s already defined", $2);
5150 adjust_array($4.type_enum, &dimension, &length, $4.type_dimension, $4.type_index, strlen($6));
5152 this = (struct typedefs *) mm_alloc(sizeof(struct typedefs));
5154 /* initial definition */
5157 this->type = (struct this_type *) mm_alloc(sizeof(struct this_type));
5158 this->type->type_enum = $4.type_enum;
5159 this->type->type_str = mm_strdup($2);
5160 this->type->type_dimension = dimension; /* dimension of array */
5161 this->type->type_index = length; /* lenght of string */
5162 this->struct_member_list = struct_member_list[struct_level];
5164 if ($4.type_enum != ECPGt_varchar &&
5165 $4.type_enum != ECPGt_char &&
5166 $4.type_enum != ECPGt_unsigned_char &&
5167 this->type->type_index >= 0)
5168 yyerror("No multi-dimensional array support for simple data types");
5172 $$ = 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("*/"));
5175 opt_type_array_bounds: '[' ']' nest_type_array_bounds
5178 $$.index2 = $3.index1;
5179 $$.str = cat2_str(make1_str("[]"), $3.str);
5181 | '(' ')' nest_type_array_bounds
5184 $$.index2 = $3.index1;
5185 $$.str = cat2_str(make1_str("[]"), $3.str);
5187 | '[' Iresult ']' nest_type_array_bounds
5189 char *txt = mm_alloc(20L);
5191 sprintf (txt, "%d", $2);
5193 $$.index2 = $4.index1;
5194 $$.str = cat4_str(make1_str("["), txt, make1_str("]"), $4.str);
5196 | '(' Iresult ')' nest_type_array_bounds
5198 char *txt = mm_alloc(20L);
5200 sprintf (txt, "%d", $2);
5202 $$.index2 = $4.index1;
5203 $$.str = cat4_str(make1_str("["), txt, make1_str("]"), $4.str);
5209 $$.str= make1_str("");
5213 nest_type_array_bounds: '[' ']' nest_type_array_bounds
5216 $$.index2 = $3.index1;
5217 $$.str = cat2_str(make1_str("[]"), $3.str);
5219 | '(' ')' nest_type_array_bounds
5222 $$.index2 = $3.index1;
5223 $$.str = cat2_str(make1_str("[]"), $3.str);
5225 | '[' Iresult ']' nest_type_array_bounds
5227 char *txt = mm_alloc(20L);
5229 sprintf (txt, "%d", $2);
5231 $$.index2 = $4.index1;
5232 $$.str = cat4_str(make1_str("["), txt, make1_str("]"), $4.str);
5234 | '(' Iresult ')' nest_type_array_bounds
5236 char *txt = mm_alloc(20L);
5238 sprintf (txt, "%d", $2);
5240 $$.index2 = $4.index1;
5241 $$.str = cat4_str(make1_str("["), txt, make1_str("]"), $4.str);
5247 $$.str= make1_str("");
5250 opt_reference: SQL_REFERENCE { $$ = make1_str("reference"); }
5251 | /* empty */ { $$ = make1_str(""); }
5255 $$.type_str = make1_str("char");
5256 $$.type_enum = ECPGt_char;
5258 $$.type_dimension = -1;
5262 $$.type_str = make1_str("varchar");
5263 $$.type_enum = ECPGt_varchar;
5265 $$.type_dimension = -1;
5269 $$.type_str = make1_str("float");
5270 $$.type_enum = ECPGt_float;
5272 $$.type_dimension = -1;
5276 $$.type_str = make1_str("double");
5277 $$.type_enum = ECPGt_double;
5279 $$.type_dimension = -1;
5281 | opt_signed SQL_INT
5283 $$.type_str = make1_str("int");
5284 $$.type_enum = ECPGt_int;
5286 $$.type_dimension = -1;
5290 $$.type_str = make1_str("int");
5291 $$.type_enum = ECPGt_int;
5293 $$.type_dimension = -1;
5295 | opt_signed SQL_SHORT
5297 $$.type_str = make1_str("short");
5298 $$.type_enum = ECPGt_short;
5300 $$.type_dimension = -1;
5302 | opt_signed SQL_LONG
5304 $$.type_str = make1_str("long");
5305 $$.type_enum = ECPGt_long;
5307 $$.type_dimension = -1;
5311 $$.type_str = make1_str("bool");
5312 $$.type_enum = ECPGt_bool;
5314 $$.type_dimension = -1;
5316 | SQL_UNSIGNED SQL_INT
5318 $$.type_str = make1_str("unsigned int");
5319 $$.type_enum = ECPGt_unsigned_int;
5321 $$.type_dimension = -1;
5323 | SQL_UNSIGNED SQL_SHORT
5325 $$.type_str = make1_str("unsigned short");
5326 $$.type_enum = ECPGt_unsigned_short;
5328 $$.type_dimension = -1;
5330 | SQL_UNSIGNED SQL_LONG
5332 $$.type_str = make1_str("unsigned long");
5333 $$.type_enum = ECPGt_unsigned_long;
5335 $$.type_dimension = -1;
5339 struct_member_list[struct_level++] = NULL;
5340 if (struct_level >= STRUCT_DEPTH)
5341 yyerror("Too many levels in nested structure definition");
5342 } '{' sql_variable_declarations '}'
5344 ECPGfree_struct_member(struct_member_list[struct_level--]);
5345 $$.type_str = cat3_str(make1_str("struct {"), $4, make1_str("}"));
5346 $$.type_enum = ECPGt_struct;
5348 $$.type_dimension = -1;
5352 struct_member_list[struct_level++] = NULL;
5353 if (struct_level >= STRUCT_DEPTH)
5354 yyerror("Too many levels in nested structure definition");
5355 } '{' sql_variable_declarations '}'
5357 ECPGfree_struct_member(struct_member_list[struct_level--]);
5358 $$.type_str = cat3_str(make1_str("union {"), $4, make1_str("}"));
5359 $$.type_enum = ECPGt_union;
5361 $$.type_dimension = -1;
5365 struct typedefs *this = get_typedef($1);
5367 $$.type_str = mm_strdup($1);
5368 $$.type_enum = this->type->type_enum;
5369 $$.type_dimension = this->type->type_dimension;
5370 $$.type_index = this->type->type_index;
5371 struct_member_list[struct_level] = this->struct_member_list;
5374 opt_signed: SQL_SIGNED | /* empty */
5376 sql_variable_declarations: /* empty */
5380 | sql_declaration sql_variable_declarations
5382 $$ = cat2_str($1, $2);
5386 sql_declaration: ctype
5388 actual_type[struct_level].type_enum = $1.type_enum;
5389 actual_type[struct_level].type_dimension = $1.type_dimension;
5390 actual_type[struct_level].type_index = $1.type_index;
5392 sql_variable_list ';'
5394 $$ = cat3_str($1.type_str, $3, make1_str(";"));
5397 sql_variable_list: sql_variable
5401 | sql_variable_list ',' sql_variable
5403 $$ = make3_str($1, make1_str(","), $3);
5406 sql_variable: opt_pointer symbol opt_array_bounds
5408 int dimension = $3.index1;
5409 int length = $3.index2;
5410 struct ECPGtype * type;
5413 adjust_array(actual_type[struct_level].type_enum, &dimension, &length, actual_type[struct_level].type_dimension, actual_type[struct_level].type_index, strlen($1));
5415 switch (actual_type[struct_level].type_enum)
5420 type = ECPGmake_struct_type(struct_member_list[struct_level], actual_type[struct_level].type_enum);
5422 type = ECPGmake_array_type(ECPGmake_struct_type(struct_member_list[struct_level], actual_type[struct_level].type_enum), dimension);
5426 if (dimension == -1)
5427 type = ECPGmake_simple_type(actual_type[struct_level].type_enum, length);
5429 type = ECPGmake_array_type(ECPGmake_simple_type(actual_type[struct_level].type_enum, length), dimension);
5441 sprintf(dim, "[%d]", dimension);
5447 case ECPGt_unsigned_char:
5448 if (dimension == -1)
5449 type = ECPGmake_simple_type(actual_type[struct_level].type_enum, length);
5451 type = ECPGmake_array_type(ECPGmake_simple_type(actual_type[struct_level].type_enum, length), dimension);
5456 yyerror("No multi-dimensional array support for simple data types");
5459 type = ECPGmake_simple_type(actual_type[struct_level].type_enum, 1);
5461 type = ECPGmake_array_type(ECPGmake_simple_type(actual_type[struct_level].type_enum, 1), dimension);
5466 if (struct_level == 0)
5467 new_variable($2, type);
5469 ECPGmake_struct_member($2, type, &(struct_member_list[struct_level - 1]));
5471 $$ = cat3_str($1, $2, $3.str);
5475 * define the type of one variable for embedded SQL
5477 ECPGVar: SQL_VAR symbol IS ctype opt_type_array_bounds opt_reference
5479 struct variable *p = find_variable($2);
5480 int dimension = $5.index1;
5481 int length = $5.index2;
5482 struct ECPGtype * type;
5484 adjust_array($4.type_enum, &dimension, &length, $4.type_dimension, $4.type_index, strlen($6));
5486 switch ($4.type_enum)
5491 type = ECPGmake_struct_type(struct_member_list[struct_level], $4.type_enum);
5493 type = ECPGmake_array_type(ECPGmake_struct_type(struct_member_list[struct_level], $4.type_enum), dimension);
5496 if (dimension == -1)
5497 type = ECPGmake_simple_type($4.type_enum, length);
5499 type = ECPGmake_array_type(ECPGmake_simple_type($4.type_enum, length), dimension);
5503 case ECPGt_unsigned_char:
5504 if (dimension == -1)
5505 type = ECPGmake_simple_type($4.type_enum, length);
5507 type = ECPGmake_array_type(ECPGmake_simple_type($4.type_enum, length), dimension);
5512 yyerror("No multi-dimensional array support for simple data types");
5515 type = ECPGmake_simple_type($4.type_enum, 1);
5517 type = ECPGmake_array_type(ECPGmake_simple_type($4.type_enum, 1), dimension);
5522 ECPGfree_type(p->type);
5525 $$ = 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("*/"));
5529 * whenever statement: decide what to do in case of error/no data found
5530 * according to SQL standards we lack: SQLSTATE, CONSTRAINT and SQLEXCEPTION
5532 ECPGWhenever: SQL_WHENEVER SQL_SQLERROR action {
5533 when_error.code = $<action>3.code;
5534 when_error.command = $<action>3.command;
5535 $$ = cat3_str(make1_str("/* exec sql whenever sqlerror "), $3.str, make1_str("; */\n"));
5537 | SQL_WHENEVER NOT SQL_FOUND action {
5538 when_nf.code = $<action>4.code;
5539 when_nf.command = $<action>4.command;
5540 $$ = cat3_str(make1_str("/* exec sql whenever not found "), $4.str, make1_str("; */\n"));
5542 | SQL_WHENEVER SQL_SQLWARNING action {
5543 when_warn.code = $<action>3.code;
5544 when_warn.command = $<action>3.command;
5545 $$ = cat3_str(make1_str("/* exec sql whenever sql_warning "), $3.str, make1_str("; */\n"));
5548 action : SQL_CONTINUE {
5549 $<action>$.code = W_NOTHING;
5550 $<action>$.command = NULL;
5551 $<action>$.str = make1_str("continue");
5554 $<action>$.code = W_SQLPRINT;
5555 $<action>$.command = NULL;
5556 $<action>$.str = make1_str("sqlprint");
5559 $<action>$.code = W_STOP;
5560 $<action>$.command = NULL;
5561 $<action>$.str = make1_str("stop");
5564 $<action>$.code = W_GOTO;
5565 $<action>$.command = strdup($2);
5566 $<action>$.str = cat2_str(make1_str("goto "), $2);
5569 $<action>$.code = W_GOTO;
5570 $<action>$.command = strdup($3);
5571 $<action>$.str = cat2_str(make1_str("goto "), $3);
5573 | DO name '(' dotext ')' {
5574 $<action>$.code = W_DO;
5575 $<action>$.command = make4_str($2, make1_str("("), $4, make1_str(")"));
5576 $<action>$.str = cat2_str(make1_str("do"), mm_strdup($<action>$.command));
5579 $<action>$.code = W_BREAK;
5580 $<action>$.command = NULL;
5581 $<action>$.str = make1_str("break");
5583 | SQL_CALL name '(' dotext ')' {
5584 $<action>$.code = W_DO;
5585 $<action>$.command = make4_str($2, make1_str("("), $4, make1_str(")"));
5586 $<action>$.str = cat2_str(make1_str("call"), mm_strdup($<action>$.command));
5589 /* some other stuff for ecpg */
5590 ecpg_expr: attr opt_indirection
5592 $$ = cat2_str($1, $2);
5602 | '-' ecpg_expr %prec UMINUS
5603 { $$ = cat2_str(make1_str("-"), $2); }
5605 { $$ = cat2_str(make1_str("%"), $2); }
5607 { $$ = cat2_str($1, make1_str("%")); }
5608 | a_expr '+' ecpg_expr
5609 { $$ = cat3_str($1, make1_str("+"), $3); }
5610 | a_expr '-' ecpg_expr
5611 { $$ = cat3_str($1, make1_str("-"), $3); }
5612 | a_expr '/' ecpg_expr
5613 { $$ = cat3_str($1, make1_str("/"), $3); }
5614 | a_expr '%' ecpg_expr
5615 { $$ = cat3_str($1, make1_str("%"), $3); }
5616 | a_expr '*' ecpg_expr
5617 { $$ = cat3_str($1, make1_str("*"), $3); }
5618 | a_expr '<' ecpg_expr
5619 { $$ = cat3_str($1, make1_str("<"), $3); }
5620 | a_expr '>' ecpg_expr
5621 { $$ = cat3_str($1, make1_str(">"), $3); }
5623 { $$ = cat2_str($1, make1_str("= NULL")); }
5625 { $$ = cat2_str(make1_str("= NULL"), $3); }
5626 | a_expr '=' ecpg_expr
5627 { $$ = cat3_str($1, make1_str("="), $3); }
5629 { $$ = cat2_str(make1_str(":"), $2); }*/
5631 { $$ = cat2_str(make1_str(";"), $2); }
5633 { $$ = cat2_str(make1_str("|"), $2); }
5634 | a_expr TYPECAST Typename
5636 $$ = cat3_str($1, make1_str("::"), $3);
5638 | CAST '(' a_expr AS Typename ')'
5640 $$ = cat3_str(make2_str(make1_str("cast("), $3), make1_str("as"), make2_str($5, make1_str(")")));
5642 | '(' a_expr_or_null ')'
5643 { $$ = make3_str(make1_str("("), $2, make1_str(")")); }
5644 | a_expr Op ecpg_expr
5645 { $$ = cat3_str($1, $2, $3); }
5646 | a_expr LIKE ecpg_expr
5647 { $$ = cat3_str($1, make1_str("like"), $3); }
5648 | a_expr NOT LIKE ecpg_expr
5649 { $$ = cat3_str($1, make1_str("not like"), $4); }
5651 { $$ = cat2_str($1, $2); }
5653 { $$ = cat2_str($1, $2); }
5654 | func_name '(' '*' ')'
5656 $$ = cat2_str($1, make1_str("(*)"));
5660 $$ = cat2_str($1, make1_str("()"));
5662 | func_name '(' expr_list ')'
5664 $$ = make4_str($1, make1_str("("), $3, make1_str(")"));
5668 $$ = make1_str("current_date");
5672 $$ = make1_str("current_time");
5674 | CURRENT_TIME '(' Iconst ')'
5677 fprintf(stderr,"CURRENT_TIME(%s) precision not implemented; zero used instead", $3);
5678 $$ = make1_str("current_time");
5682 $$ = make1_str("current_timestamp");
5684 | CURRENT_TIMESTAMP '(' Iconst ')'
5687 fprintf(stderr,"CURRENT_TIMESTAMP(%s) precision not implemented; zero used instead",$3);
5688 $$ = make1_str("current_timestamp");
5692 $$ = make1_str("current_user");
5696 $$ = make1_str("user");
5698 | EXISTS '(' SubSelect ')'
5700 $$ = make3_str(make1_str("exists("), $3, make1_str(")"));
5702 | EXTRACT '(' extract_list ')'
5704 $$ = make3_str(make1_str("extract("), $3, make1_str(")"));
5706 | POSITION '(' position_list ')'
5708 $$ = make3_str(make1_str("position("), $3, make1_str(")"));
5710 | SUBSTRING '(' substr_list ')'
5712 $$ = make3_str(make1_str("substring("), $3, make1_str(")"));
5714 /* various trim expressions are defined in SQL92 - thomas 1997-07-19 */
5715 | TRIM '(' BOTH trim_list ')'
5717 $$ = make3_str(make1_str("trim(both"), $4, make1_str(")"));
5719 | TRIM '(' LEADING trim_list ')'
5721 $$ = make3_str(make1_str("trim(leading"), $4, make1_str(")"));
5723 | TRIM '(' TRAILING trim_list ')'
5725 $$ = make3_str(make1_str("trim(trailing"), $4, make1_str(")"));
5727 | TRIM '(' trim_list ')'
5729 $$ = make3_str(make1_str("trim("), $3, make1_str(")"));
5732 { $$ = cat2_str($1, make1_str("isnull")); }
5734 { $$ = cat2_str($1, make1_str("is null")); }
5736 { $$ = cat2_str($1, make1_str("notnull")); }
5737 | a_expr IS NOT NULL_P
5738 { $$ = cat2_str($1, make1_str("is not null")); }
5739 /* IS TRUE, IS FALSE, etc used to be function calls
5740 * but let's make them expressions to allow the optimizer
5741 * a chance to eliminate them if a_expr is a constant string.
5742 * - thomas 1997-12-22
5746 { $$ = cat2_str($1, make1_str("is true")); }
5748 | a_expr IS NOT FALSE_P
5750 { $$ = cat2_str($1, make1_str("is not false")); }
5754 { $$ = cat2_str($1, make1_str("is false")); }
5756 | a_expr IS NOT TRUE_P
5758 { $$ = cat2_str($1, make1_str("is not true")); }
5760 | a_expr BETWEEN b_expr AND b_expr
5762 $$ = cat5_str($1, make1_str("between"), $3, make1_str("and"), $5);
5764 | a_expr NOT BETWEEN b_expr AND b_expr
5766 $$ = cat5_str($1, make1_str("not between"), $4, make1_str("and"), $6);
5768 | a_expr IN '(' in_expr ')'
5770 $$ = make4_str($1, make1_str(" in ("), $4, make1_str(")"));
5772 | a_expr NOT IN '(' not_in_expr ')'
5774 $$ = make4_str($1, make1_str(" not in ("), $5, make1_str(")"));
5776 | a_expr Op '(' SubSelect ')'
5778 $$ = cat3_str($1, $2, make3_str(make1_str("("), $4, make1_str(")")));
5780 | a_expr '+' '(' SubSelect ')'
5782 $$ = make4_str($1, make1_str("+("), $4, make1_str(")"));
5784 | a_expr '-' '(' SubSelect ')'
5786 $$ = make4_str($1, make1_str("-("), $4, make1_str(")"));
5788 | a_expr '/' '(' SubSelect ')'
5790 $$ = make4_str($1, make1_str("/("), $4, make1_str(")"));
5792 | a_expr '%' '(' SubSelect ')'
5794 $$ = make4_str($1, make1_str("%("), $4, make1_str(")"));
5796 | a_expr '*' '(' SubSelect ')'
5798 $$ = make4_str($1, make1_str("*("), $4, make1_str(")"));
5800 | a_expr '<' '(' SubSelect ')'
5802 $$ = make4_str($1, make1_str("<("), $4, make1_str(")"));
5804 | a_expr '>' '(' SubSelect ')'
5806 $$ = make4_str($1, make1_str(">("), $4, make1_str(")"));
5808 | a_expr '=' '(' SubSelect ')'
5810 $$ = make4_str($1, make1_str("=("), $4, make1_str(")"));
5812 | a_expr Op ANY '(' SubSelect ')'
5814 $$ = cat3_str($1, $2, make3_str(make1_str("any ("), $5, make1_str(")")));
5816 | a_expr '+' ANY '(' SubSelect ')'
5818 $$ = make4_str($1, make1_str("+ any("), $5, make1_str(")"));
5820 | a_expr '-' ANY '(' SubSelect ')'
5822 $$ = make4_str($1, make1_str("- any("), $5, make1_str(")"));
5824 | a_expr '/' ANY '(' SubSelect ')'
5826 $$ = make4_str($1, make1_str("/ any("), $5, make1_str(")"));
5828 | a_expr '%' ANY '(' SubSelect ')'
5830 $$ = make4_str($1, make1_str("% any("), $5, make1_str(")"));
5832 | a_expr '*' ANY '(' SubSelect ')'
5834 $$ = make4_str($1, make1_str("* any("), $5, make1_str(")"));
5836 | a_expr '<' ANY '(' SubSelect ')'
5838 $$ = make4_str($1, make1_str("< any("), $5, make1_str(")"));
5840 | a_expr '>' ANY '(' SubSelect ')'
5842 $$ = make4_str($1, make1_str("> any("), $5, make1_str(")"));
5844 | a_expr '=' ANY '(' SubSelect ')'
5846 $$ = make4_str($1, make1_str("= any("), $5, make1_str(")"));
5848 | a_expr Op ALL '(' SubSelect ')'
5850 $$ = cat3_str($1, $2, make3_str(make1_str("all ("), $5, make1_str(")")));
5852 | a_expr '+' ALL '(' SubSelect ')'
5854 $$ = make4_str($1, make1_str("+ all("), $5, make1_str(")"));
5856 | a_expr '-' ALL '(' SubSelect ')'
5858 $$ = make4_str($1, make1_str("- all("), $5, make1_str(")"));
5860 | a_expr '/' ALL '(' SubSelect ')'
5862 $$ = make4_str($1, make1_str("/ all("), $5, make1_str(")"));
5864 | a_expr '%' ALL '(' SubSelect ')'
5866 $$ = make4_str($1, make1_str("% all("), $5, make1_str(")"));
5868 | a_expr '*' ALL '(' SubSelect ')'
5870 $$ = make4_str($1, make1_str("* all("), $5, make1_str(")"));
5872 | a_expr '<' ALL '(' SubSelect ')'
5874 $$ = make4_str($1, make1_str("< all("), $5, make1_str(")"));
5876 | a_expr '>' ALL '(' SubSelect ')'
5878 $$ = make4_str($1, make1_str("> all("), $5, make1_str(")"));
5880 | a_expr '=' ALL '(' SubSelect ')'
5882 $$ = make4_str($1, make1_str("=all("), $5, make1_str(")"));
5884 | a_expr AND ecpg_expr
5885 { $$ = cat3_str($1, make1_str("and"), $3); }
5886 | a_expr OR ecpg_expr
5887 { $$ = cat3_str($1, make1_str("or"), $3); }
5889 { $$ = cat2_str(make1_str("not"), $2); }
5896 into_list : coutputvariable | into_list ',' coutputvariable;
5898 ecpgstart: SQL_START { reset_variables();}
5900 dotext: /* empty */ { $$ = make1_str(""); }
5901 | dotext do_anything { $$ = make2_str($1, $2); }
5903 vartext: var_anything { $$ = $1; }
5904 | vartext var_anything { $$ = make2_str($1, $2); }
5906 coutputvariable : cvariable indicator {
5907 add_variable(&argsresult, find_variable($1), ($2 == NULL) ? &no_indicator : find_variable($2));
5910 cinputvariable : cvariable indicator {
5911 add_variable(&argsinsert, find_variable($1), ($2 == NULL) ? &no_indicator : find_variable($2));
5914 civariableonly : cvariable {
5915 add_variable(&argsinsert, find_variable($1), &no_indicator);
5916 $$ = make1_str("?");
5919 cvariable: CVARIABLE { $$ = $1; }
5921 indicator: /* empty */ { $$ = NULL; }
5922 | cvariable { check_indicator((find_variable($1))->type); $$ = $1; }
5923 | SQL_INDICATOR cvariable { check_indicator((find_variable($2))->type); $$ = $2; }
5924 | SQL_INDICATOR name { check_indicator((find_variable($2))->type); $$ = $2; }
5926 ident: IDENT { $$ = $1; }
5927 | CSTRING { $$ = $1; }
5932 symbol: IDENT { $$ = $1; }
5934 cpp_line: CPP_LINE { $$ = $1; }
5936 c_line: c_anything { $$ = $1; }
5939 $$ = make2_str($1, $2);
5942 c_thing: c_anything | ';' { $$ = make1_str(";"); }
5944 c_anything: IDENT { $$ = $1; }
5945 | CSTRING { $$ = make3_str(make1_str("\""), $1, make1_str("\"")); }
5946 | Iconst { $$ = $1; }
5947 | Fconst { $$ = $1; }
5948 | '*' { $$ = make1_str("*"); }
5949 | '+' { $$ = make1_str("+"); }
5950 | '-' { $$ = make1_str("-"); }
5951 | '/' { $$ = make1_str("/"); }
5952 | '%' { $$ = make1_str("%"); }
5953 | S_AUTO { $$ = make1_str("auto"); }
5954 | S_BOOL { $$ = make1_str("bool"); }
5955 | S_CHAR { $$ = make1_str("char"); }
5956 | S_CONST { $$ = make1_str("const"); }
5957 | S_DOUBLE { $$ = make1_str("double"); }
5958 | S_ENUM { $$ = make1_str("enum"); }
5959 | S_EXTERN { $$ = make1_str("extern"); }
5960 | S_FLOAT { $$ = make1_str("float"); }
5961 | S_INT { $$ = make1_str("int"); }
5962 | S_LONG { $$ = make1_str("long"); }
5963 | S_REGISTER { $$ = make1_str("register"); }
5964 | S_SHORT { $$ = make1_str("short"); }
5965 | S_SIGNED { $$ = make1_str("signed"); }
5966 | S_STATIC { $$ = make1_str("static"); }
5967 | S_STRUCT { $$ = make1_str("struct"); }
5968 | S_UNION { $$ = make1_str("union"); }
5969 | S_UNSIGNED { $$ = make1_str("unsigned"); }
5970 | S_VARCHAR { $$ = make1_str("varchar"); }
5971 | S_ANYTHING { $$ = make_name(); }
5972 | '[' { $$ = make1_str("["); }
5973 | ']' { $$ = make1_str("]"); }
5974 | '(' { $$ = make1_str("("); }
5975 | ')' { $$ = make1_str(")"); }
5976 | '=' { $$ = make1_str("="); }
5977 | ',' { $$ = make1_str(","); }
5979 do_anything: IDENT { $$ = $1; }
5980 | CSTRING { $$ = make3_str(make1_str("\""), $1, make1_str("\""));}
5981 | Iconst { $$ = $1; }
5982 | Fconst { $$ = $1; }
5983 | ',' { $$ = make1_str(","); }
5985 var_anything: IDENT { $$ = $1; }
5986 | CSTRING { $$ = make3_str(make1_str("\""), $1, make1_str("\"")); }
5987 | Iconst { $$ = $1; }
5988 | Fconst { $$ = $1; }
5989 | '{' c_line '}' { $$ = make3_str(make1_str("{"), $2, make1_str("}")); }
5993 $$ = make1_str("{");
5997 remove_variables(braces_open--);
5998 $$ = make1_str("}");
6003 void yyerror(char * error)
6005 fprintf(stderr, "%s:%d: %s\n", input_filename, yylineno, error);