| /*EMPTY*/ { $$ = make1_str(""); }
;
-user_valid_clause: VALID UNTIL Sconst { $$ = cat2_str(make1_str("valid until"), $3);; }
+user_valid_clause: VALID UNTIL Sconst { $$ = cat2_str(make1_str("valid until"), $3); }
| /*EMPTY*/ { $$ = make1_str(""); }
;
RemoveStmt: DROP remove_type name
{
- $$ = cat3_str(make1_str("drop"), $2, $3);;
+ $$ = cat3_str(make1_str("drop"), $2, $3);
}
;
| LIMIT select_limit_value OFFSET select_offset_value
{ $$ = cat4_str(make1_str("limit"), $2, make1_str("offset"), $4); }
| LIMIT select_limit_value
- { $$ = cat2_str(make1_str("limit"), $2);; }
+ { $$ = cat2_str(make1_str("limit"), $2); }
| OFFSET select_offset_value LIMIT select_limit_value
{ $$ = cat4_str(make1_str("offset"), $2, make1_str("limit"), $4); }
| OFFSET select_offset_value
| case_expr
{ $$ = $1; }
| cinputvariable
- { $$ = make1_str(";;"); }
+ { $$ = make1_str("?"); }
;
/* Restricted expressions
| /* EMPTY */
{ $$ = make1_str(""); }
| cinputvariable
- { $$ = make1_str(";;"); }
+ { $$ = make1_str("?"); }
;
extract_arg: datetime { $$ = $1; }
this->next = cur;
this->name = $2;
this->connection = connection;
- this->command = cat5_str(make1_str("declare"), mm_strdup($2), $3, make1_str("cursor for ;;"), $7);
+ this->command = cat5_str(make1_str("declare"), mm_strdup($2), $3, make1_str("cursor for ?"), $7);
this->argsresult = NULL;
thisquery->type = &ecpg_query;
add_variable(&argsinsert, thisquery, &no_indicator);
- $$ = make1_str(";;");
+ $$ = make1_str("?");
}
| EXECUTE ident
{
add_variable(&argsinsert, thisquery, &no_indicator);
} opt_using
{
- $$ = make1_str(";;");
+ $$ = make1_str("?");
}
execstring: char_variable |
civariableonly : cvariable {
add_variable(&argsinsert, find_variable($1), &no_indicator);
- $$ = make1_str(";;");
+ $$ = make1_str("?");
}
cvariable: CVARIABLE { $$ = $1; }
--- /dev/null
+#include <stdio.h>
+
+exec sql include header_test;
+
+exec sql type str is varchar[10];
+
+int
+main ()
+{
+ typedef struct { long born; short age; } birthinfo;
+ exec sql type birthinfo is struct { long born; short age; };
+exec sql begin declare section;
+ struct personal_struct { str name;
+ birthinfo birth;
+ } personal;
+ struct personal_indicator { int ind_name;
+ birthinfo ind_birth;
+ } ind_personal;
+ int *ind_married = NULL;
+ int children;
+ int ind_children;
+ str *married = NULL;
+ char *testname="Petra";
+ char *query="select name, born, age, married, children from meskes where name = :var1";
+exec sql end declare section;
+
+ exec sql declare cur cursor for
+ select name, born, age, married, children from meskes;
+
+ char msg[128], command[128];
+ FILE *dbgs;
+
+ if ((dbgs = fopen("log", "w")) != NULL)
+ ECPGdebug(1, dbgs);
+
+ strcpy(msg, "connect");
+ exec sql connect to unix:postgresql://localhost:5432/mm;
+
+ strcpy(msg, "create");
+ exec sql create table meskes(name char(8), born integer, age smallint, married date, children integer);
+
+ strcpy(msg, "insert");
+ exec sql insert into meskes(name, married, children) values ('Petra', '19900404', 3);
+ exec sql insert into meskes(name, born, age, married, children) values ('Michael', 19660117, 33, '19900404', 3);
+ exec sql insert into meskes(name, born, age) values ('Carsten', 19910103, 8);
+ exec sql insert into meskes(name, born, age) values ('Marc', 19930907, 5);
+ exec sql insert into meskes(name, born, age) values ('Chris', 19970923, 1);
+
+ strcpy(msg, "commit");
+ exec sql commit;
+
+ strcpy(msg, "open");
+ exec sql open cur;
+
+ exec sql whenever not found do break;
+
+ while (1) {
+ strcpy(msg, "fetch");
+ exec sql fetch in cur into :personal:ind_personal, :married:ind_married, :children:ind_children;
+ printf("%8.8s", personal.name.arr);
+ if (ind_personal.ind_birth.born >= 0)
+ printf(", born %d", personal.birth.born);
+ if (ind_personal.ind_birth.age >= 0)
+ printf(", age = %d", personal.birth.age);
+ if (ind_married >= 0)
+ printf(", married %10.10s", married->arr);
+ if (ind_children >= 0)
+ printf(", children = %d", children);
+ putchar('\n');
+
+ free(married);
+ married = NULL;
+ }
+
+ strcpy(msg, "close");
+ exec sql close cur;
+
+ /* and now the same query with prepare */
+ exec sql prepare MM from :query;
+ exec sql declare prep cursor for MM;
+
+ strcpy(msg, "open");
+ exec sql open prep using :testname;
+
+ exec sql whenever not found do break;
+
+ while (1) {
+ strcpy(msg, "fetch");
+ exec sql fetch in prep into :personal:ind_personal, :married:ind_married, :children:ind_children;
+ printf("%8.8s", personal.name.arr);
+ if (ind_personal.ind_birth.born >= 0)
+ printf(", born %d", personal.birth.born);
+ if (ind_personal.ind_birth.age >= 0)
+ printf(", age = %d", personal.birth.age);
+ if (ind_married >= 0)
+ printf(", married %10.10s", married->arr);
+ if (ind_children >= 0)
+ printf(", children = %d", children);
+ putchar('\n');
+ }
+
+ free(married);
+
+ strcpy(msg, "close");
+ exec sql close prep;
+
+ strcpy(msg, "drop");
+ exec sql drop table meskes;
+
+ strcpy(msg, "commit");
+ exec sql commit;
+
+ strcpy(msg, "disconnect");
+
+ exec sql disconnect;
+ if (dbgs != NULL)
+ fclose(dbgs);
+
+ return (0);
+}
+#include <stdio.h>
+
+exec sql include header_test;
+
+exec sql type str is varchar[10];
+
+int
+main ()
+{
+ typedef struct { long born; short age; } birthinfo;
+ exec sql type birthinfo is struct { long born; short age; };
+exec sql begin declare section;
+ struct personal_struct { str name;
+ birthinfo birth;
+ } personal;
+ struct personal_indicator { int ind_name;
+ birthinfo ind_birth;
+ } ind_personal;
+ int *ind_married = NULL;
+ int children;
+ int ind_children;
+ str *married = NULL;
+ char *testname="Petra";
+ char *query="select name, born, age, married, children from meskes where name = :var1";
+exec sql end declare section;
+
+ exec sql declare cur cursor for
+ select name, born, age, married, children from meskes;
+
+ char msg[128], command[128];
+ FILE *dbgs;
+
+ if ((dbgs = fopen("log", "w")) != NULL)
+ ECPGdebug(1, dbgs);
+
+ strcpy(msg, "connect");
+ exec sql connect to unix:postgresql://localhost:5432/mm;
+
+ strcpy(msg, "create");
+ exec sql create table meskes(name char(8), born integer, age smallint, married date, children integer);
+
+ strcpy(msg, "insert");
+ exec sql insert into meskes(name, married, children) values ('Petra', '19900404', 3);
+ exec sql insert into meskes(name, born, age, married, children) values ('Michael', 19660117, 33, '19900404', 3);
+ exec sql insert into meskes(name, born, age) values ('Carsten', 19910103, 8);
+ exec sql insert into meskes(name, born, age) values ('Marc', 19930907, 5);
+ exec sql insert into meskes(name, born, age) values ('Chris', 19970923, 1);
+
+ strcpy(msg, "commit");
+ exec sql commit;
+
+ strcpy(msg, "open");
+ exec sql open cur;
+
+ exec sql whenever not found do break;
+
+ while (1) {
+ strcpy(msg, "fetch");
+ exec sql fetch in cur into :personal:ind_personal, :married:ind_married, :children:ind_children;
+ printf("%8.8s", personal.name.arr);
+ if (ind_personal.ind_birth.born >= 0)
+ printf(", born %d", personal.birth.born);
+ if (ind_personal.ind_birth.age >= 0)
+ printf(", age = %d", personal.birth.age);
+ if (ind_married >= 0)
+ printf(", married %10.10s", married->arr);
+ if (ind_children >= 0)
+ printf(", children = %d", children);
+ putchar('\n');
+
+ free(married);
+ married = NULL;
+ }
+
+ strcpy(msg, "close");
+ exec sql close cur;
+
+ /* and now the same query with prepare */
+ exec sql prepare MM from :query;
+ exec sql declare prep cursor for MM;
+
+ strcpy(msg, "open");
+ exec sql open prep using :testname;
+
+ exec sql whenever not found do break;
+
+ while (1) {
+ strcpy(msg, "fetch");
+ exec sql fetch in prep into :personal:ind_personal, :married:ind_married, :children:ind_children;
+ printf("%8.8s", personal.name.arr);
+ if (ind_personal.ind_birth.born >= 0)
+ printf(", born %d", personal.birth.born);
+ if (ind_personal.ind_birth.age >= 0)
+ printf(", age = %d", personal.birth.age);
+ if (ind_married >= 0)
+ printf(", married %10.10s", married->arr);
+ if (ind_children >= 0)
+ printf(", children = %d", children);
+ putchar('\n');
+ }
+
+ free(married);
+
+ strcpy(msg, "close");
+ exec sql close prep;
+
+ strcpy(msg, "drop");
+ exec sql drop table meskes;
+
+ strcpy(msg, "commit");
+ exec sql commit;
+
+ strcpy(msg, "disconnect");
+
+ exec sql disconnect;
+ if (dbgs != NULL)
+ fclose(dbgs);
+
+ return (0);
+}