- Fixed variable handling in AT statement.
authorMichael Meskes
Wed, 5 Dec 2001 15:32:07 +0000 (15:32 +0000)
committerMichael Meskes
Wed, 5 Dec 2001 15:32:07 +0000 (15:32 +0000)
        - Fixed bug that caused segfault when given incorrect DB name.
        - Fixed bug in ecpglib causing indicator to list the size of the
          variable instead of the size of the data.

src/interfaces/ecpg/ChangeLog
src/interfaces/ecpg/lib/connect.c
src/interfaces/ecpg/lib/data.c
src/interfaces/ecpg/preproc/preproc.y
src/interfaces/ecpg/test/test1.pgc

index c4250260b5bfe022e238b4a894633c75635d563b..9fca8d3c305a078733e31fd825a5b2ef34814ef3 100644 (file)
@@ -1154,5 +1154,12 @@ Wed Nov 14 11:50:27 CET 2001
 Tue Dec  4 13:30:32 CET 2001
 
    - Fixed dumping of structures without indicators.
+
+Wed Dec  5 12:27:25 CET 2001
+
+   - Fixed variable handling in AT statement.
+   - Fixed bug that caused segfault when given incorrect DB name.
+   - Fixed bug in ecpglib causing indicator to list the size of the
+     variable instead of the size of the data.
    - Set ecpg version to 2.9.0.
         - Set library version to 3.3.0.
index 2f02e92da377f5f0e7463d0836808add4830d406..4520e1bf609c876035b78deb5334213e48104108 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/connect.c,v 1.15 2001/11/14 11:11:49 meskes Exp $ */
+/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/connect.c,v 1.16 2001/12/05 15:32:06 meskes Exp $ */
 
 #include "postgres_fe.h"
 
@@ -387,6 +387,10 @@ ECPGconnect(int lineno, const char *name, const char *user, const char *passwd,
                host = strdup(dbname + offset);
 
        }
+       else
+       {
+           realname = strdup(dbname);
+       }
    }
    else
        realname = strdup(dbname);
index 81bdad751bf112d6aeb3d636b36094c2a59d177b..b0d91b9453a67f78a45baf83481f99e33fd4420e 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/data.c,v 1.19 2001/11/14 11:11:49 meskes Exp $ */
+/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/data.c,v 1.20 2001/12/05 15:32:06 meskes Exp $ */
 
 #include "postgres_fe.h"
 
@@ -277,15 +277,15 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
                        {
                            case ECPGt_short:
                            case ECPGt_unsigned_short:
-                               ((short *) ind)[act_tuple] = varcharsize;
+                               ((short *) ind)[act_tuple] = strlen(pval);
                                break;
                            case ECPGt_int:
                            case ECPGt_unsigned_int:
-                               ((int *) ind)[act_tuple] = varcharsize;
+                               ((int *) ind)[act_tuple] = strlen(pval);
                                break;
                            case ECPGt_long:
                            case ECPGt_unsigned_long:
-                               ((long *) ind)[act_tuple] = varcharsize;
+                               ((long *) ind)[act_tuple] = strlen(pval);
                                break;
                            default:
                                break;
@@ -300,12 +300,12 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
                    struct ECPGgeneric_varchar *variable =
                    (struct ECPGgeneric_varchar *) ((long) var + offset * act_tuple);
 
+                   variable->len = strlen(pval);
                    if (varcharsize == 0)
-                       strncpy(variable->arr, pval, strlen(pval));
+                       strncpy(variable->arr, pval, variable->len);
                    else
                        strncpy(variable->arr, pval, varcharsize);
 
-                   variable->len = strlen(pval);
                    if (varcharsize > 0 && variable->len > varcharsize)
                    {
                        /* truncation */
@@ -313,15 +313,15 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
                        {
                            case ECPGt_short:
                            case ECPGt_unsigned_short:
-                               ((short *) ind)[act_tuple] = varcharsize;
+                               ((short *) ind)[act_tuple] = variable->len;
                                break;
                            case ECPGt_int:
                            case ECPGt_unsigned_int:
-                               ((int *) ind)[act_tuple] = varcharsize;
+                               ((int *) ind)[act_tuple] = variable->len;
                                break;
                            case ECPGt_long:
                            case ECPGt_unsigned_long:
-                               ((long *) ind)[act_tuple] = varcharsize;
+                               ((long *) ind)[act_tuple] = variable->len;
                                break;
                            default:
                                break;
index 4a585dae6084724d26bfda9dd2617d70627db178..7241770fd553ee5d0731c8bc2835b5abe1511971 100644 (file)
@@ -392,7 +392,16 @@ statement: ecpgstart opt_at stmt ';'   { connection = NULL; }
    | blockend          { fputs($1, yyout); free($1); }
    ;
 
-opt_at:    AT connection_target    { connection = $2; };
+opt_at:    AT connection_target        {
+                       connection = $2;
+                       /* 
+                          if we have a variable as connection
+                          target, remove it from the variable
+                          list or else it will be used twice
+                       */
+                       if (argsinsert != NULL)
+                           argsinsert = NULL;
+                   };
 
 stmt:  AlterSchemaStmt             { output_statement($1, 0, connection); }
        | AlterTableStmt    { output_statement($1, 0, connection); }
@@ -3877,6 +3886,13 @@ connection_target: database_name opt_server opt_port
         |  db_prefix ':' server opt_port '/' database_name opt_options
                 {
          /* new style: :postgresql://server[:port][/dbname] */
+           printf("%s\n", $1);
+         if (strncmp($1, "unix:postgresql", strlen("unix:postgresql")) != 0 && strncmp($1, "tcp:postgresql", strlen("tcp:postgresql")) != 0)
+         {
+           sprintf(errortext, "only protocols 'tcp' and 'unix' and database type 'postgresql' are supported");
+                    mmerror(ET_ERROR, errortext);
+         }
+
                   if (strncmp($3, "//", strlen("//")) != 0)
          {
            sprintf(errortext, "Expected '://', found '%s'", $3);
@@ -3890,12 +3906,6 @@ connection_target: database_name opt_server opt_port
            sprintf(errortext, "unix domain sockets only work on 'localhost' but not on '%9.9s'", $3 + strlen("//"));
                     mmerror(ET_ERROR, errortext);
          }
-
-         if (strncmp($1, "unix", strlen("unix")) != 0 && strncmp($1, "tcp", strlen("tcp")) != 0)
-         {
-           sprintf(errortext, "only protocols 'tcp' and 'unix' are supported");
-                    mmerror(ET_ERROR, errortext);
-         }
    
          $$ = make3_str(make3_str(make_str("\""), $1, make_str(":")), $3, make3_str(make3_str($4, make_str("/"), $6),  $7, make_str("\"")));
        }
index d8bafde331719116c013a64aaf660f5391dd8463..d29b21df43b0b29dc3503a5e055dfcdfde36d425 100644 (file)
@@ -35,6 +35,7 @@ exec sql begin declare section;
         char name[AMOUNT][8];
    char letter[AMOUNT][1];
    char command[128];
+   char *connection="pm";
 exec sql end declare section;
    exec sql var name is string(AMOUNT);
    char msg[128];
@@ -94,7 +95,7 @@ exec sql end declare section;
    exec sql at pm begin transaction;
 
         strcpy(msg, "select");
-        exec sql select name, amount, letter into :name, :amount, :letter from "Test";
+        exec sql select * into :name, :amount, :letter from "Test";
 
    printf("Database: mm\n");
         for (i=0, j=sqlca.sqlerrd[2]; i
@@ -113,7 +114,7 @@ exec sql end declare section;
    }
 
         strcpy(msg, "select");
-        exec sql at pm select * into :name, :amount, :letter from "Test";
+        exec sql at :connection select name, amount, letter into :name, :amount, :letter from "Test";
 
    printf("Database: pm\n");
         for (i=0, j=sqlca.sqlerrd[2]; i