aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Meskes <meskes@postgresql.org>2001-12-05 15:32:07 +0000
committerMichael Meskes <meskes@postgresql.org>2001-12-05 15:32:07 +0000
commitee14711ce889698dfc2b3357b1eb8aab04c53a6c (patch)
tree8515d1318835c50ac7887cda5a54388c004ae9b2 /src
parent15790465c2e05173e015e5cd37150aee97476c29 (diff)
downloadpostgresql-ee14711ce889698dfc2b3357b1eb8aab04c53a6c.tar.gz
postgresql-ee14711ce889698dfc2b3357b1eb8aab04c53a6c.zip
- 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.
Diffstat (limited to 'src')
-rw-r--r--src/interfaces/ecpg/ChangeLog7
-rw-r--r--src/interfaces/ecpg/lib/connect.c6
-rw-r--r--src/interfaces/ecpg/lib/data.c18
-rw-r--r--src/interfaces/ecpg/preproc/preproc.y24
-rw-r--r--src/interfaces/ecpg/test/test1.pgc5
5 files changed, 41 insertions, 19 deletions
diff --git a/src/interfaces/ecpg/ChangeLog b/src/interfaces/ecpg/ChangeLog
index c4250260b5b..9fca8d3c305 100644
--- a/src/interfaces/ecpg/ChangeLog
+++ b/src/interfaces/ecpg/ChangeLog
@@ -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.
diff --git a/src/interfaces/ecpg/lib/connect.c b/src/interfaces/ecpg/lib/connect.c
index 2f02e92da37..4520e1bf609 100644
--- a/src/interfaces/ecpg/lib/connect.c
+++ b/src/interfaces/ecpg/lib/connect.c
@@ -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);
diff --git a/src/interfaces/ecpg/lib/data.c b/src/interfaces/ecpg/lib/data.c
index 81bdad751bf..b0d91b9453a 100644
--- a/src/interfaces/ecpg/lib/data.c
+++ b/src/interfaces/ecpg/lib/data.c
@@ -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;
diff --git a/src/interfaces/ecpg/preproc/preproc.y b/src/interfaces/ecpg/preproc/preproc.y
index 4a585dae608..7241770fd55 100644
--- a/src/interfaces/ecpg/preproc/preproc.y
+++ b/src/interfaces/ecpg/preproc/preproc.y
@@ -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: <tcp|unix>: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("\"")));
}
diff --git a/src/interfaces/ecpg/test/test1.pgc b/src/interfaces/ecpg/test/test1.pgc
index d8bafde3317..d29b21df43b 100644
--- a/src/interfaces/ecpg/test/test1.pgc
+++ b/src/interfaces/ecpg/test/test1.pgc
@@ -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<j; 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<j; i++)