From e4274d60a5c2ccadec7b81b42a90580c109ffcc0 Mon Sep 17 00:00:00 2001 From: Michael Meskes Date: Sat, 20 Mar 1999 19:46:54 +0000 Subject: [PATCH] *** empty log message *** --- src/interfaces/ecpg/ChangeLog | 16 ++++++ src/interfaces/ecpg/include/ecpgerrno.h | 2 - src/interfaces/ecpg/include/ecpglib.h | 1 + src/interfaces/ecpg/lib/ecpglib.c | 76 +++++++++++++++---------- src/interfaces/ecpg/preproc/keywords.c | 3 +- src/interfaces/ecpg/preproc/pgc.l | 22 +++---- src/interfaces/ecpg/preproc/preproc.y | 17 +++--- 7 files changed, 85 insertions(+), 52 deletions(-) diff --git a/src/interfaces/ecpg/ChangeLog b/src/interfaces/ecpg/ChangeLog index 1ecce5d471..36b592670c 100644 --- a/src/interfaces/ecpg/ChangeLog +++ b/src/interfaces/ecpg/ChangeLog @@ -519,5 +519,21 @@ Thu Mar 18 18:57:31 CET 1999 - Synced preproc.y with gram.y. - Added '%' operator. + +Thu Mar 18 19:44:10 CET 1999 + + - Added ECPGstatus() function. + - Cleaned up some error messages. + +Fri Mar 19 08:49:32 CET 1999 + + - Synced preproc.y with gram.y. + - Synced keywords.c. + - Synced pgc.l with scan.l. + +Sat Mar 20 19:57:42 CET 1999 + + - Synced preproc.y with gram.y. + - Fixed handling of ';' character. - Set library version to 3.0.0 - Set ecpg version to 2.6.0 diff --git a/src/interfaces/ecpg/include/ecpgerrno.h b/src/interfaces/ecpg/include/ecpgerrno.h index 5fa7e70471..a3bc132497 100644 --- a/src/interfaces/ecpg/include/ecpgerrno.h +++ b/src/interfaces/ecpg/include/ecpgerrno.h @@ -23,8 +23,6 @@ #define ECPG_CONVERT_BOOL -207 #define ECPG_EMPTY -208 -#define ECPG_UNDECLARED_CURSOR -210 - #define ECPG_NO_CONN -220 #define ECPG_NOT_CONN -221 diff --git a/src/interfaces/ecpg/include/ecpglib.h b/src/interfaces/ecpg/include/ecpglib.h index 98153747f6..a5af239f79 100644 --- a/src/interfaces/ecpg/include/ecpglib.h +++ b/src/interfaces/ecpg/include/ecpglib.h @@ -6,6 +6,7 @@ extern "C" #endif void ECPGdebug(int, FILE *); + bool ECPGstatus(int, const char *); bool ECPGsetconn(int, const char *); bool ECPGconnect(int, const char *, const char *, const char *, const char *); bool ECPGdo(int, const char *, char *,...); diff --git a/src/interfaces/ecpg/lib/ecpglib.c b/src/interfaces/ecpg/lib/ecpglib.c index 742cc5a1d8..4d13f6dcb1 100644 --- a/src/interfaces/ecpg/lib/ecpglib.c +++ b/src/interfaces/ecpg/lib/ecpglib.c @@ -183,7 +183,7 @@ ecpg_alloc(long size, int lineno) if (!new) { ECPGlog("out of memory\n"); - register_error(ECPG_OUT_OF_MEMORY, "out of memory in line %d", lineno); + register_error(ECPG_OUT_OF_MEMORY, "Out of memory in line %d", lineno); return NULL; } @@ -199,7 +199,7 @@ ecpg_strdup(const char *string, int lineno) if (!new) { ECPGlog("out of memory\n"); - register_error(ECPG_OUT_OF_MEMORY, "out of memory in line %d", lineno); + register_error(ECPG_OUT_OF_MEMORY, "Out of memory in line %d", lineno); return NULL; } @@ -336,7 +336,7 @@ create_statement(int lineno, struct connection *connection, struct statement ** if (var->pointer == NULL) { ECPGlog("create_statement: invalid statement name\n"); - register_error(ECPG_INVALID_STMT, "Invalid statement name in line %d", lineno); + register_error(ECPG_INVALID_STMT, "Invalid statement name in line %d.", lineno); free(var); return false; } @@ -387,7 +387,7 @@ next_insert(char *text) static bool ECPGexecute(struct statement * stmt) { - bool status = false; + bool status = false; char *copiedquery; PGresult *results; PGnotify *notify; @@ -637,7 +637,7 @@ ECPGexecute(struct statement * stmt) { if ((results = PQexec(stmt->connection->connection, "begin transaction")) == NULL) { - register_error(ECPG_TRANS, "Error starting transaction line %d.", stmt->lineno); + register_error(ECPG_TRANS, "Error in transaction processing line %d.", stmt->lineno); return false; } PQclear(results); @@ -708,7 +708,7 @@ ECPGexecute(struct statement * stmt) /* * allocate memory for NULL pointers */ - if (var->arrsize == 0 || var->varcharsize == 0) + if ((var->arrsize == 0 || var->varcharsize == 0) && var->value == NULL) { int len = 0; @@ -716,34 +716,28 @@ ECPGexecute(struct statement * stmt) { case ECPGt_char: case ECPGt_unsigned_char: - if (var->value == NULL) + var->varcharsize = 0; + /* check strlen for each tuple */ + for (act_tuple = 0; act_tuple < ntuples; act_tuple++) { - var->varcharsize = 0; - /* check strlen for each tuple */ - for (act_tuple = 0; act_tuple < ntuples; act_tuple++) - { - int len = strlen(PQgetvalue(results, act_tuple, act_field)) + 1; - - if (len > var->varcharsize) - var->varcharsize = len; - } - var->offset *= var->varcharsize; - len = var->offset * ntuples; + int len = strlen(PQgetvalue(results, act_tuple, act_field)) + 1; + + if (len > var->varcharsize) + var->varcharsize = len; } + var->offset *= var->varcharsize; + len = var->offset * ntuples; break; case ECPGt_varchar: - if (var->value == NULL) - len = ntuples * (var->varcharsize + sizeof (int)); + len = ntuples * (var->varcharsize + sizeof (int)); break; default: - if (var->value == NULL) - len = var->offset * ntuples; + len = var->offset * ntuples; break; } - - var->pointer = (void *) ecpg_alloc(len, stmt->lineno); - var->value = (void **) var->pointer; - add_mem((void *) var->value, stmt->lineno); + var->value = (void *) ecpg_alloc(len, stmt->lineno); + *((void **) var->pointer) = var->value; + add_mem(var->value, stmt->lineno); } for (act_tuple = 0; act_tuple < ntuples && status; act_tuple++) @@ -1004,7 +998,7 @@ ECPGexecute(struct statement * stmt) case PGRES_BAD_RESPONSE: ECPGlog("ECPGexecute line %d: Error: %s", stmt->lineno, PQerrorMessage(stmt->connection->connection)); - register_error(ECPG_PGSQL, "Error: %s line %d.", + register_error(ECPG_PGSQL, "Postgres error: %s line %d.", PQerrorMessage(stmt->connection->connection), stmt->lineno); status = false; break; @@ -1019,7 +1013,8 @@ ECPGexecute(struct statement * stmt) default: ECPGlog("ECPGexecute line %d: Got something else, postgres error.\n", stmt->lineno); - register_error(ECPG_PGSQL, "Postgres error line %d.", stmt->lineno); + register_error(ECPG_PGSQL, "Postgres error: %s line %d.", + PQerrorMessage(stmt->connection->connection), stmt->lineno); status = false; break; } @@ -1046,7 +1041,7 @@ ECPGdo(int lineno, const char *connection_name, char *query,...) if (con == NULL) { - register_error(ECPG_NO_CONN, "No such connection %s in line %d", connection_name, lineno); + register_error(ECPG_NO_CONN, "No such connection %s in line %d.", connection_name, lineno); return (false); } @@ -1059,13 +1054,34 @@ ECPGdo(int lineno, const char *connection_name, char *query,...) if (con == NULL || con->connection == NULL) { ECPGlog("ECPGdo: not connected to %s\n", con->name); - register_error(ECPG_NOT_CONN, "Not connected in line %d", lineno); + register_error(ECPG_NOT_CONN, "Not connected in line %d.", lineno); return false; } return (ECPGexecute(stmt)); } +bool +ECPGstatus(int lineno, const char *connection_name) +{ + struct connection *con = get_connection(connection_name); + + if (con == NULL) + { + register_error(ECPG_NO_CONN, "No such connection %s in line %d", connection_name, lineno); + return (false); + } + + /* are we connected? */ + if (con->connection == NULL) + { + ECPGlog("ECPGdo: not connected to %s\n", con->name); + register_error(ECPG_NOT_CONN, "Not connected in line %d", lineno); + return false; + } + + return (true); +} bool ECPGtrans(int lineno, const char *connection_name, const char *transaction) diff --git a/src/interfaces/ecpg/preproc/keywords.c b/src/interfaces/ecpg/preproc/keywords.c index bcbb3242de..dbfd7002e6 100644 --- a/src/interfaces/ecpg/preproc/keywords.c +++ b/src/interfaces/ecpg/preproc/keywords.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/keywords.c,v 1.11 1999/02/20 07:01:00 scrappy Exp $ + * $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/keywords.c,v 1.12 1999/03/20 19:46:53 meskes Exp $ * *------------------------------------------------------------------------- */ @@ -188,7 +188,6 @@ static ScanKeyword ScanKeywords[] = { {"procedure", PROCEDURE}, {"public", PUBLIC}, {"read", READ}, - {"recipe", RECIPE}, {"references", REFERENCES}, {"relative", RELATIVE}, {"rename", RENAME}, diff --git a/src/interfaces/ecpg/preproc/pgc.l b/src/interfaces/ecpg/preproc/pgc.l index 8236969076..ab75a552cf 100644 --- a/src/interfaces/ecpg/preproc/pgc.l +++ b/src/interfaces/ecpg/preproc/pgc.l @@ -134,8 +134,8 @@ identifier {letter}{letter_or_digit}* typecast "::" -self [,()\[\].$\:\+\-\*\/\<\>\=\|] -op_and_self [\~\!\@\#\%\^\&\|\`\?\$\:\+\-\*\/\<\>\=] +self [,()\[\].;$\:\+\-\*\/\%\<\>\=\|] +op_and_self [\~\!\@\#\^\&\|\?\$\:\+\-\*\/\%\<\>\=] operator {op_and_self}+ xmstop - @@ -299,7 +299,15 @@ cppline {space}*#.*(\\{space}*\n)*\n* BEGIN(xm); return yytext[0]; } -{self} { return yytext[0]; } +{self} { /* + * We may find a ';' inside a structure + * definition in a TYPE or VAR statement. + * This is not an EOL marker. + */ + if (yytext[0] == ';' && struct_level == 0) + BEGIN C; + return yytext[0]; + } {operator}/-[\.0-9] { yylval.str = mm_strdup((char*)yytext); return Op; @@ -510,14 +518,6 @@ cppline {space}*#.*(\\{space}*\n)*\n* } } {space} { /* ignore */ } -";" { /* - * We may find a ';' inside a structure - * definition in a TYPE or VAR statement. - * This is not a EOL marker. - */ - if (struct_level == 0) - BEGIN C; - return SQL_SEMI; } {other} { return yytext[0]; } {exec}{space}{sql} { BEGIN SQL; return SQL_START; } {ccomment} { /* ignore */ } diff --git a/src/interfaces/ecpg/preproc/preproc.y b/src/interfaces/ecpg/preproc/preproc.y index f2728af7ed..820a941719 100644 --- a/src/interfaces/ecpg/preproc/preproc.y +++ b/src/interfaces/ecpg/preproc/preproc.y @@ -652,7 +652,7 @@ adjust_array(enum ECPGttype type_enum, int *dimension, int *length, int type_dim %token SQL_FOUND SQL_FREE SQL_GO SQL_GOTO %token SQL_IDENTIFIED SQL_IMMEDIATE SQL_INDICATOR SQL_INT SQL_LONG %token SQL_OPEN SQL_PREPARE SQL_RELEASE SQL_REFERENCE -%token SQL_SECTION SQL_SEMI SQL_SHORT SQL_SIGNED SQL_SQLERROR SQL_SQLPRINT +%token SQL_SECTION SQL_SHORT SQL_SIGNED SQL_SQLERROR SQL_SQLPRINT %token SQL_SQLWARNING SQL_START SQL_STOP SQL_STRUCT SQL_UNSIGNED %token SQL_VAR SQL_WHENEVER @@ -710,7 +710,7 @@ adjust_array(enum ECPGttype type_enum, int *dimension, int *length, int type_dim LANCOMPILER, LIMIT, LISTEN, UNLISTEN, LOAD, LOCATION, LOCK_P, MAXVALUE, MINVALUE, MOVE, NEW, NOCREATEDB, NOCREATEUSER, NONE, NOTHING, NOTIFY, NOTNULL, OFFSET, OIDS, OPERATOR, PASSWORD, PROCEDURAL, - RECIPE, RENAME, RESET, RETURNS, ROW, RULE, + RENAME, RESET, RETURNS, ROW, RULE, SERIAL, SEQUENCE, SETOF, SHOW, START, STATEMENT, STDIN, STDOUT, TRUSTED, UNLISTEN, UNTIL, VACUUM, VALID, VERBOSE, VERSION @@ -734,6 +734,7 @@ adjust_array(enum ECPGttype type_enum, int *dimension, int *length, int type_dim %left Op /* multi-character ops and user-defined operators */ %nonassoc NOTNULL %nonassoc ISNULL +%nonassoc NULL_P %nonassoc IS %left '+' '-' %left '*' '/' '%' @@ -839,8 +840,8 @@ prog: statements; statements: /* empty */ | statements statement -statement: ecpgstart opt_at stmt SQL_SEMI { connection = NULL; } - | ecpgstart stmt SQL_SEMI +statement: ecpgstart opt_at stmt ';' { connection = NULL; } + | ecpgstart stmt ';' | ECPGDeclaration | c_thing { fprintf(yyout, "%s", $1); free($1); } | cpp_line { fprintf(yyout, "%s", $1); free($1); } @@ -3587,6 +3588,8 @@ a_expr: attr opt_indirection { $$ = cat3_str($1, make1_str(">"), $3); } | a_expr '=' NULL_P { $$ = cat2_str($1, make1_str("= NULL")); } + | NULL_P '=' a_expr + { $$ = cat2_str(make1_str("= NULL"), $3); } | a_expr '=' a_expr { $$ = cat3_str($1, make1_str("="), $3); } /* not possible in embedded sql | ':' a_expr @@ -4798,9 +4801,9 @@ ECPGDeclaration: sql_startdeclare output_line_number(); } -sql_startdeclare : ecpgstart BEGIN_TRANS DECLARE SQL_SECTION SQL_SEMI {} +sql_startdeclare : ecpgstart BEGIN_TRANS DECLARE SQL_SECTION ';' {} -sql_enddeclare: ecpgstart END_TRANS DECLARE SQL_SECTION SQL_SEMI {} +sql_enddeclare: ecpgstart END_TRANS DECLARE SQL_SECTION ';' {} variable_declarations: /* empty */ { @@ -5389,7 +5392,7 @@ sql_declaration: ctype actual_type[struct_level].type_dimension = $1.type_dimension; actual_type[struct_level].type_index = $1.type_index; } - sql_variable_list SQL_SEMI + sql_variable_list ';' { $$ = cat3_str($1.type_str, $3, make1_str(";")); } -- 2.40.0