From abd310a3b1bace1177ce7d9f94120785deccab1a Mon Sep 17 00:00:00 2001 From: Michael Meskes Date: Fri, 20 Jun 2003 12:00:59 +0000 Subject: [PATCH] Allow constants in using clauses. --- src/interfaces/ecpg/ChangeLog | 4 ++++ src/interfaces/ecpg/ecpglib/execute.c | 5 +++-- src/interfaces/ecpg/ecpglib/typename.c | 4 +++- src/interfaces/ecpg/include/ecpgtype.h | 1 + src/interfaces/ecpg/preproc/preproc.y | 18 +++++++++++++++--- src/interfaces/ecpg/preproc/type.c | 11 +++++++++++ src/interfaces/ecpg/test/test2.pgc | 3 +-- 7 files changed, 38 insertions(+), 8 deletions(-) diff --git a/src/interfaces/ecpg/ChangeLog b/src/interfaces/ecpg/ChangeLog index a50d7affd4..617d6588e2 100644 --- a/src/interfaces/ecpg/ChangeLog +++ b/src/interfaces/ecpg/ChangeLog @@ -1501,6 +1501,10 @@ Thu Jun 19 10:08:26 CEST 2003 - Added missing rdayofweek function for Informix compatibility. - Fixed fetch into char pointer. + +Fri Jun 20 13:23:07 CEST 2003 + + - Enabled constants in using clause. - Set ecpg version to 3.0.0 - Set ecpg library to 4.0.0 - Set pgtypes library to 1.0.0 diff --git a/src/interfaces/ecpg/ecpglib/execute.c b/src/interfaces/ecpg/ecpglib/execute.c index 108bbe05ab..4bc0ba8017 100644 --- a/src/interfaces/ecpg/ecpglib/execute.c +++ b/src/interfaces/ecpg/ecpglib/execute.c @@ -1,4 +1,4 @@ -/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.10 2003/06/15 04:07:58 momjian Exp $ */ +/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.11 2003/06/20 12:00:59 meskes Exp $ */ /* * The aim is to get a simpler inteface to the database routines. @@ -775,6 +775,7 @@ ECPGstore_input(const struct statement * stmt, const struct variable * var, *malloced_p = true; } break; + case ECPGt_const: case ECPGt_char_variable: { int slen = strlen((char *) var->value); @@ -1214,7 +1215,7 @@ ECPGexecute(struct statement * stmt) { ECPGlog("ECPGexecute line %d: ASYNC NOTIFY of '%s' from backend pid '%d' received\n", stmt->lineno, notify->relname, notify->be_pid); - PQfreemem(notify); + PQfreemem(notify); } return status; diff --git a/src/interfaces/ecpg/ecpglib/typename.c b/src/interfaces/ecpg/ecpglib/typename.c index 4967674e19..e8ffec94df 100644 --- a/src/interfaces/ecpg/ecpglib/typename.c +++ b/src/interfaces/ecpg/ecpglib/typename.c @@ -1,4 +1,4 @@ -/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/typename.c,v 1.5 2003/06/17 07:28:22 meskes Exp $ */ +/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/typename.c,v 1.6 2003/06/20 12:00:59 meskes Exp $ */ #define POSTGRES_ECPG_INTERNAL #include "postgres_fe.h" @@ -56,6 +56,8 @@ ECPGtype_name(enum ECPGttype typ) return "Timestamp"; case ECPGt_interval: return "Interval"; + case ECPGt_char_const: + return "Const"; default: abort(); } diff --git a/src/interfaces/ecpg/include/ecpgtype.h b/src/interfaces/ecpg/include/ecpgtype.h index 51f090c844..bd1902a093 100644 --- a/src/interfaces/ecpg/include/ecpgtype.h +++ b/src/interfaces/ecpg/include/ecpgtype.h @@ -53,6 +53,7 @@ enum ECPGttype ECPGt_union, ECPGt_descriptor, /* sql descriptor, no C variable */ ECPGt_char_variable, + ECPGt_const, /* a constant is needed sometimes */ ECPGt_EOIT, /* End of insert types. */ ECPGt_EORT, /* End of result types. */ ECPGt_NO_INDICATOR /* no indicator */ diff --git a/src/interfaces/ecpg/preproc/preproc.y b/src/interfaces/ecpg/preproc/preproc.y index d096dd220b..107d84251f 100644 --- a/src/interfaces/ecpg/preproc/preproc.y +++ b/src/interfaces/ecpg/preproc/preproc.y @@ -1,4 +1,4 @@ -/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/Attic/preproc.y,v 1.234 2003/06/19 09:52:11 meskes Exp $ */ +/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/Attic/preproc.y,v 1.235 2003/06/20 12:00:59 meskes Exp $ */ /* Copyright comment */ %{ @@ -475,7 +475,7 @@ adjust_informix(struct arguments *list) %type ECPGGetDescriptorHeader ECPGColLabel single_var_declaration %type reserved_keyword unreserved_keyword ecpg_interval opt_ecpg_using %type col_name_keyword func_name_keyword precision opt_scale -%type ECPGTypeName using_list ECPGColLabelCommon +%type ECPGTypeName using_list ECPGColLabelCommon UsingConst %type inf_val_list inf_col_list using_descriptor into_descriptor %type ecpg_into_using @@ -5196,7 +5196,19 @@ ecpg_into: INTO into_list { $$ = EMPTY; } | into_descriptor { $$ = $1; } ; -using_list: civar | civar ',' using_list; +using_list: UsingConst | UsingConst ',' using_list; + +UsingConst: AllConst + { + if ($1[1] != '?') /* found a constant */ + { + char *length = mm_alloc(sizeof("INT_MAX")+1); + + sprintf(length, "%d", strlen($1)); + add_variable(&argsinsert, new_variable($1, ECPGmake_simple_type(ECPGt_const, length), 0), &no_indicator); + } + } + ; /* * As long as the prepare statement is not supported by the backend, we will diff --git a/src/interfaces/ecpg/preproc/type.c b/src/interfaces/ecpg/preproc/type.c index 7ac5c55a28..5f2dd86bb5 100644 --- a/src/interfaces/ecpg/preproc/type.c +++ b/src/interfaces/ecpg/preproc/type.c @@ -169,6 +169,9 @@ get_type(enum ECPGttype type) * quoted */ return ("ECPGt_char_variable"); break; + case ECPGt_const: /* constant string quoted */ + return ("ECPGt_const"); + break; case ECPGt_numeric: return ("ECPGt_numeric"); break; @@ -381,6 +384,14 @@ ECPGdump_a_simple(FILE *o, const char *name, enum ECPGttype type, sprintf(variable, "&(%s%s)", prefix ? prefix : "", name); sprintf(offset, "sizeof(Date)"); break; + case ECPGt_const: + + /* + * just dump the const as string + */ + sprintf(variable, "\"%s\"", name); + sprintf(offset, "strlen(\"%s\")", name); + break; default: /* diff --git a/src/interfaces/ecpg/test/test2.pgc b/src/interfaces/ecpg/test/test2.pgc index 0d11c0c38a..8e2160a0ec 100644 --- a/src/interfaces/ecpg/test/test2.pgc +++ b/src/interfaces/ecpg/test/test2.pgc @@ -27,7 +27,6 @@ exec sql begin declare section; struct birthinfo ind_birth; } ind_personal, *i; ind ind_children; - c testname="Petra"; char *query="select name, born, age, married, children from meskes where name = :var1"; exec sql end declare section; @@ -92,7 +91,7 @@ exec sql end declare section; exec sql declare prep cursor for MM; strcpy(msg, "open"); - exec sql open prep using :testname; + exec sql open prep using 'Petra'; exec sql whenever not found do break; -- 2.40.0