]> granicus.if.org Git - postgresql/commitdiff
Allow constants in using clauses.
authorMichael Meskes <meskes@postgresql.org>
Fri, 20 Jun 2003 12:00:59 +0000 (12:00 +0000)
committerMichael Meskes <meskes@postgresql.org>
Fri, 20 Jun 2003 12:00:59 +0000 (12:00 +0000)
src/interfaces/ecpg/ChangeLog
src/interfaces/ecpg/ecpglib/execute.c
src/interfaces/ecpg/ecpglib/typename.c
src/interfaces/ecpg/include/ecpgtype.h
src/interfaces/ecpg/preproc/preproc.y
src/interfaces/ecpg/preproc/type.c
src/interfaces/ecpg/test/test2.pgc

index a50d7affd432283370e0c607478085bfd8fb6ad1..617d6588e207564924b8d82d5696527fb79db2eb 100644 (file)
@@ -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
index 108bbe05aba6bcbc12802045b3da5d97df7617c4..4bc0ba801749fa788d9850cadf0e360eb50b3c35 100644 (file)
@@ -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;
index 4967674e19b3801995e1250cff611b9f84b7dca9..e8ffec94df9e9731c76778ab317b4057b6345a01 100644 (file)
@@ -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();
        }
index 51f090c844382128dd3d24baea0a8082e20c7ef3..bd1902a093e32cc1e8f9ec9c95ef93e7448bb7ed 100644 (file)
@@ -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 */
index d096dd220ba39e9ff4f6992f1e7f16fa11f10420..107d84251f50667045b96b4ad4ea53d6a36a0a8b 100644 (file)
@@ -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  <str>   ECPGGetDescriptorHeader ECPGColLabel single_var_declaration
 %type  <str>   reserved_keyword unreserved_keyword ecpg_interval opt_ecpg_using
 %type  <str>   col_name_keyword func_name_keyword precision opt_scale
-%type  <str>   ECPGTypeName using_list ECPGColLabelCommon 
+%type  <str>   ECPGTypeName using_list ECPGColLabelCommon UsingConst
 %type  <str>   inf_val_list inf_col_list using_descriptor into_descriptor 
 %type  <str>   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
index 7ac5c55a2896f835adde6576ba0e16cae5494e88..5f2dd86bb55f15fedccc6e005aa36cd255b2118a 100644 (file)
@@ -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:
 
                                /*
index 0d11c0c38a8613a5ed98ceaf48c73cdc1aebafce..8e2160a0ec8ef60c42068e6bcc24e5a1209867b5 100644 (file)
@@ -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;