Commit 4505653e authored by Michael Meskes's avatar Michael Meskes

Added just another compatibility level for Informix.

parent b1432106
...@@ -1514,6 +1514,16 @@ Fri Jun 20 15:34:29 CEST 2003 ...@@ -1514,6 +1514,16 @@ Fri Jun 20 15:34:29 CEST 2003
Sun Jun 22 11:20:29 CEST 2003 Sun Jun 22 11:20:29 CEST 2003
- Fixed missing '\0' in output char pointer. - Fixed missing '\0' in output char pointer.
Wed Jun 25 09:29:34 CEST 2003
- Synced keyword.x and preproc.y/gram.y.
- Implemented Informix special way to treat NULLs.
Thu Jun 26 13:26:13 CEST 2003
- Added another compatibility level INFORMIX_SE.
- Synced again.
- Set ecpg version to 3.0.0 - Set ecpg version to 3.0.0
- Set ecpg library to 4.0.0 - Set ecpg library to 4.0.0
- Set pgtypes library to 1.0.0 - Set pgtypes library to 1.0.0
......
/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/connect.c,v 1.8 2003/06/25 10:44:21 meskes Exp $ */ /* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/connect.c,v 1.9 2003/06/26 11:37:05 meskes Exp $ */
#define POSTGRES_ECPG_INTERNAL #define POSTGRES_ECPG_INTERNAL
#include "postgres_fe.h" #include "postgres_fe.h"
...@@ -304,7 +304,7 @@ ECPGconnect(int lineno, int c, const char *name, const char *user, const char *p ...@@ -304,7 +304,7 @@ ECPGconnect(int lineno, int c, const char *name, const char *user, const char *p
ECPGinit_sqlca(sqlca); ECPGinit_sqlca(sqlca);
if (compat == ECPG_COMPAT_INFORMIX) if (INFORMIX_MODE(compat))
{ {
char *envname; char *envname;
......
/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/data.c,v 1.8 2003/06/25 10:44:21 meskes Exp $ */ /* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/data.c,v 1.9 2003/06/26 11:37:05 meskes Exp $ */
#define POSTGRES_ECPG_INTERNAL #define POSTGRES_ECPG_INTERNAL
#include "postgres_fe.h" #include "postgres_fe.h"
...@@ -78,7 +78,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno, ...@@ -78,7 +78,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
break; break;
#endif /* HAVE_LONG_LONG_INT_64 */ #endif /* HAVE_LONG_LONG_INT_64 */
case ECPGt_NO_INDICATOR: case ECPGt_NO_INDICATOR:
if (force_indicator == false && compat == ECPG_COMPAT_INFORMIX) if (force_indicator == false)
{ {
/* Informix has an additional way to specify NULLs /* Informix has an additional way to specify NULLs
* note that this uses special values to denote NULL */ * note that this uses special values to denote NULL */
......
/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.12 2003/06/25 10:44:21 meskes Exp $ */ /* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.13 2003/06/26 11:37:05 meskes Exp $ */
/* /*
* The aim is to get a simpler inteface to the database routines. * The aim is to get a simpler inteface to the database routines.
...@@ -508,7 +508,7 @@ ECPGstore_input(const struct statement * stmt, const struct variable * var, ...@@ -508,7 +508,7 @@ ECPGstore_input(const struct statement * stmt, const struct variable * var,
break; break;
#endif /* HAVE_LONG_LONG_INT_64 */ #endif /* HAVE_LONG_LONG_INT_64 */
case ECPGt_NO_INDICATOR: case ECPGt_NO_INDICATOR:
if (stmt->force_indicator == false && stmt->compat == ECPG_COMPAT_INFORMIX) if (stmt->force_indicator == false)
{ {
if (ECPGis_informix_null(var->type, var->value)) if (ECPGis_informix_null(var->type, var->value))
*tobeinserted_p = "null"; *tobeinserted_p = "null";
...@@ -1186,7 +1186,9 @@ ECPGexecute(struct statement * stmt) ...@@ -1186,7 +1186,9 @@ ECPGexecute(struct statement * stmt)
sqlca->sqlerrd[1] = PQoidValue(results); sqlca->sqlerrd[1] = PQoidValue(results);
sqlca->sqlerrd[2] = atol(PQcmdTuples(results)); sqlca->sqlerrd[2] = atol(PQcmdTuples(results));
ECPGlog("ECPGexecute line %d Ok: %s\n", stmt->lineno, cmdstat); ECPGlog("ECPGexecute line %d Ok: %s\n", stmt->lineno, cmdstat);
if (!sqlca->sqlerrd[2] && ( !strncmp(cmdstat, "UPDATE", 6) if (stmt->compat != ECPG_COMPAT_INFORMIX_SE &&
!sqlca->sqlerrd[2] &&
( !strncmp(cmdstat, "UPDATE", 6)
|| !strncmp(cmdstat, "INSERT", 6) || !strncmp(cmdstat, "INSERT", 6)
|| !strncmp(cmdstat, "DELETE", 6))) || !strncmp(cmdstat, "DELETE", 6)))
ECPGraise(stmt->lineno, ECPG_NOT_FOUND, NULL); ECPGraise(stmt->lineno, ECPG_NOT_FOUND, NULL);
......
...@@ -5,7 +5,8 @@ ...@@ -5,7 +5,8 @@
#include "libpq-fe.h" #include "libpq-fe.h"
#include "sqlca.h" #include "sqlca.h"
enum COMPAT_MODE { ECPG_COMPAT_PGSQL = 0, ECPG_COMPAT_INFORMIX}; enum COMPAT_MODE { ECPG_COMPAT_PGSQL = 0, ECPG_COMPAT_INFORMIX, ECPG_COMPAT_INFORMIX_SE};
#define INFORMIX_MODE(X) ((X) == ECPG_COMPAT_INFORMIX || (X) == ECPG_COMPAT_INFORMIX_SE)
/* Here are some methods used by the lib. */ /* Here are some methods used by the lib. */
......
/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/prepare.c,v 1.4 2003/06/25 10:44:21 meskes Exp $ */ /* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/prepare.c,v 1.5 2003/06/26 11:37:05 meskes Exp $ */
#define POSTGRES_ECPG_INTERNAL #define POSTGRES_ECPG_INTERNAL
#include "postgres_fe.h" #include "postgres_fe.h"
...@@ -110,7 +110,7 @@ ECPGdeallocate(int lineno, int c, char *name) ...@@ -110,7 +110,7 @@ ECPGdeallocate(int lineno, int c, char *name)
bool ret = ECPGdeallocate_one(lineno, name); bool ret = ECPGdeallocate_one(lineno, name);
enum COMPAT_MODE compat = c; enum COMPAT_MODE compat = c;
if (compat == ECPG_COMPAT_INFORMIX) if (INFORMIX_MODE(compat))
{ {
/* Just ignore all errors since we do not know the list of cursors we /* Just ignore all errors since we do not know the list of cursors we
* are allowed to free. We have to trust that the software. */ * are allowed to free. We have to trust that the software. */
......
/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/ecpg.c,v 1.74 2003/06/25 10:44:21 meskes Exp $ */ /* $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/ecpg.c,v 1.75 2003/06/26 11:37:05 meskes Exp $ */
/* New main for ecpg, the PostgreSQL embedded SQL precompiler. */ /* New main for ecpg, the PostgreSQL embedded SQL precompiler. */
/* (C) Michael Meskes <meskes@postgresql.org> Feb 5th, 1998 */ /* (C) Michael Meskes <meskes@postgresql.org> Feb 5th, 1998 */
...@@ -45,7 +45,9 @@ help(const char *progname) ...@@ -45,7 +45,9 @@ help(const char *progname)
printf(" -d generate parser debug output\n"); printf(" -d generate parser debug output\n");
#endif #endif
printf(" -C <mode> set compatibility mode\n" printf(" -C <mode> set compatibility mode\n"
" mode may be \"INFORMIX\" only at the moment\n"); " mode may be one of\n"
" \"INFORMIX\"\n"
" \"INFORMIX_SE\"\n");
printf(" -r <option> specify runtime behaviour\n" printf(" -r <option> specify runtime behaviour\n"
" option may be only \"no_indicator\" at the moment\n"); " option may be only \"no_indicator\" at the moment\n");
printf(" -D SYMBOL define SYMBOL\n"); printf(" -D SYMBOL define SYMBOL\n");
...@@ -165,9 +167,9 @@ main(int argc, char *const argv[]) ...@@ -165,9 +167,9 @@ main(int argc, char *const argv[])
system_includes = true; system_includes = true;
break; break;
case 'C': case 'C':
if (strcmp(optarg, "INFORMIX") == 0) if (strncmp(optarg, "INFORMIX", strlen("INFORMIX")) == 0)
{ {
compat = ECPG_COMPAT_INFORMIX; compat = (strcmp(optarg, "INFORMIX") == 0) ? ECPG_COMPAT_INFORMIX : ECPG_COMPAT_INFORMIX_SE;
/* system_includes = true; */ /* system_includes = true; */
add_preprocessor_define("dec_t=Numeric"); add_preprocessor_define("dec_t=Numeric");
add_preprocessor_define("intrvl_t=Interval"); add_preprocessor_define("intrvl_t=Interval");
...@@ -383,7 +385,7 @@ main(int argc, char *const argv[]) ...@@ -383,7 +385,7 @@ main(int argc, char *const argv[])
fprintf(yyout, "/* Processed by ecpg (%d.%d.%d) */\n/* These four include files are added by the preprocessor */\n#include <ecpgtype.h>\n#include <ecpglib.h>\n#include <ecpgerrno.h>\n#include <sqlca.h>\n#line 1 \"%s\"\n", MAJOR_VERSION, MINOR_VERSION, PATCHLEVEL, input_filename); fprintf(yyout, "/* Processed by ecpg (%d.%d.%d) */\n/* These four include files are added by the preprocessor */\n#include <ecpgtype.h>\n#include <ecpglib.h>\n#include <ecpgerrno.h>\n#include <sqlca.h>\n#line 1 \"%s\"\n", MAJOR_VERSION, MINOR_VERSION, PATCHLEVEL, input_filename);
/* add some compatibility headers */ /* add some compatibility headers */
if (compat == ECPG_COMPAT_INFORMIX) if (INFORMIX_MODE)
fprintf(yyout, "/* Needed for informix compatibility */\n#include <ecpg_informix.h>\n"); fprintf(yyout, "/* Needed for informix compatibility */\n#include <ecpg_informix.h>\n");
/* and parse the source */ /* and parse the source */
......
...@@ -96,7 +96,8 @@ extern ScanKeyword *ScanKeywordLookup(char *text); ...@@ -96,7 +96,8 @@ extern ScanKeyword *ScanKeywordLookup(char *text);
#define INDICATOR_NOT_STRUCT 6 #define INDICATOR_NOT_STRUCT 6
#define INDICATOR_NOT_SIMPLE 7 #define INDICATOR_NOT_SIMPLE 7
enum COMPAT_MODE { ECPG_COMPAT_PGSQL = 0, ECPG_COMPAT_INFORMIX}; enum COMPAT_MODE { ECPG_COMPAT_PGSQL = 0, ECPG_COMPAT_INFORMIX, ECPG_COMPAT_INFORMIX_SE};
extern enum COMPAT_MODE compat; extern enum COMPAT_MODE compat;
#define INFORMIX_MODE (compat == ECPG_COMPAT_INFORMIX || compat == ECPG_COMPAT_INFORMIX_SE)
#endif /* _ECPG_PREPROC_EXTERN_H */ #endif /* _ECPG_PREPROC_EXTERN_H */
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/pgc.l,v 1.117 2003/06/20 15:16:06 meskes Exp $ * $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/pgc.l,v 1.118 2003/06/26 11:37:05 meskes Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -420,7 +420,7 @@ cppline {space}*#(.*\\{space})+.* ...@@ -420,7 +420,7 @@ cppline {space}*#(.*\\{space})+.*
<SQL>{typecast} { return TYPECAST; } <SQL>{typecast} { return TYPECAST; }
<SQL>{informix_special} { <SQL>{informix_special} {
/* are we simulating Informix? */ /* are we simulating Informix? */
if (compat == ECPG_COMPAT_INFORMIX) if (INFORMIX_MODE)
{ {
unput(':'); unput(':');
} }
...@@ -605,7 +605,7 @@ cppline {space}*#(.*\\{space})+.* ...@@ -605,7 +605,7 @@ cppline {space}*#(.*\\{space})+.*
<C>{exec_sql} { BEGIN SQL; return SQL_START; } <C>{exec_sql} { BEGIN SQL; return SQL_START; }
<C>{informix_special} { <C>{informix_special} {
/* are we simulating Informix? */ /* are we simulating Informix? */
if (compat == ECPG_COMPAT_INFORMIX) if (INFORMIX_MODE)
{ {
BEGIN SQL; BEGIN SQL;
return SQL_START; return SQL_START;
...@@ -715,7 +715,7 @@ cppline {space}*#(.*\\{space})+.* ...@@ -715,7 +715,7 @@ cppline {space}*#(.*\\{space})+.*
<C>{exec_sql}{define}{space}* { BEGIN(def_ident); } <C>{exec_sql}{define}{space}* { BEGIN(def_ident); }
<C>{informix_special}{define}{space}* { <C>{informix_special}{define}{space}* {
/* are we simulating Informix? */ /* are we simulating Informix? */
if (compat == ECPG_COMPAT_INFORMIX) if (INFORMIX_MODE)
{ {
BEGIN(def_ident); BEGIN(def_ident);
} }
...@@ -730,7 +730,7 @@ cppline {space}*#(.*\\{space})+.* ...@@ -730,7 +730,7 @@ cppline {space}*#(.*\\{space})+.*
<C>{exec_sql}{include}{space}* { BEGIN(incl); } <C>{exec_sql}{include}{space}* { BEGIN(incl); }
<C>{informix_special}{include}{space}* { <C>{informix_special}{include}{space}* {
/* are we simulating Informix? */ /* are we simulating Informix? */
if (compat == ECPG_COMPAT_INFORMIX) if (INFORMIX_MODE)
{ {
BEGIN(incl); BEGIN(incl);
} }
...@@ -745,7 +745,7 @@ cppline {space}*#(.*\\{space})+.* ...@@ -745,7 +745,7 @@ cppline {space}*#(.*\\{space})+.*
<C,xskip>{exec_sql}{ifdef}{space}* { ifcond = TRUE; BEGIN(xcond); } <C,xskip>{exec_sql}{ifdef}{space}* { ifcond = TRUE; BEGIN(xcond); }
<C,xskip>{informix_special}{ifdef}{space}* { <C,xskip>{informix_special}{ifdef}{space}* {
/* are we simulating Informix? */ /* are we simulating Informix? */
if (compat == ECPG_COMPAT_INFORMIX) if (INFORMIX_MODE)
{ {
ifcond = TRUE; ifcond = TRUE;
BEGIN(xcond); BEGIN(xcond);
...@@ -761,7 +761,7 @@ cppline {space}*#(.*\\{space})+.* ...@@ -761,7 +761,7 @@ cppline {space}*#(.*\\{space})+.*
<C,xskip>{exec_sql}{ifndef}{space}* { ifcond = FALSE; BEGIN(xcond); } <C,xskip>{exec_sql}{ifndef}{space}* { ifcond = FALSE; BEGIN(xcond); }
<C,xskip>{informix_special}{ifndef}{space}* { <C,xskip>{informix_special}{ifndef}{space}* {
/* are we simulating Informix? */ /* are we simulating Informix? */
if (compat == ECPG_COMPAT_INFORMIX) if (INFORMIX_MODE)
{ {
ifcond = FALSE; ifcond = FALSE;
BEGIN(xcond); BEGIN(xcond);
...@@ -787,7 +787,7 @@ cppline {space}*#(.*\\{space})+.* ...@@ -787,7 +787,7 @@ cppline {space}*#(.*\\{space})+.*
} }
<C,xskip>{informix_special}{elif}{space}* { <C,xskip>{informix_special}{elif}{space}* {
/* are we simulating Informix? */ /* are we simulating Informix? */
if (compat == ECPG_COMPAT_INFORMIX) if (INFORMIX_MODE)
{ {
if ( preproc_tos == 0 ) { if ( preproc_tos == 0 ) {
mmerror(PARSE_ERROR, ET_FATAL, "Missing matching 'EXEC SQL IFDEF / EXEC SQL IFNDEF'"); mmerror(PARSE_ERROR, ET_FATAL, "Missing matching 'EXEC SQL IFDEF / EXEC SQL IFNDEF'");
...@@ -826,7 +826,7 @@ cppline {space}*#(.*\\{space})+.* ...@@ -826,7 +826,7 @@ cppline {space}*#(.*\\{space})+.*
} }
<C,xskip>{informix_special}{else}{space}* { <C,xskip>{informix_special}{else}{space}* {
/* are we simulating Informix? */ /* are we simulating Informix? */
if (compat == ECPG_COMPAT_INFORMIX) if (INFORMIX_MODE)
{ {
if ( stacked_if_value[preproc_tos].else_branch ) { if ( stacked_if_value[preproc_tos].else_branch ) {
mmerror(PARSE_ERROR, ET_FATAL, "Duplicated 'EXEC SQL ELSE;'"); mmerror(PARSE_ERROR, ET_FATAL, "Duplicated 'EXEC SQL ELSE;'");
...@@ -864,7 +864,7 @@ cppline {space}*#(.*\\{space})+.* ...@@ -864,7 +864,7 @@ cppline {space}*#(.*\\{space})+.*
} }
<C,xskip>{informix_special}{endif}{space}*";" { <C,xskip>{informix_special}{endif}{space}*";" {
/* are we simulating Informix? */ /* are we simulating Informix? */
if (compat == ECPG_COMPAT_INFORMIX) if (INFORMIX_MODE)
{ {
if ( preproc_tos == 0 ) if ( preproc_tos == 0 )
mmerror(PARSE_ERROR, ET_FATAL, "Unmatched 'EXEC SQL ENDIF;'"); mmerror(PARSE_ERROR, ET_FATAL, "Unmatched 'EXEC SQL ENDIF;'");
......
/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/Attic/preproc.y,v 1.239 2003/06/25 21:30:33 momjian Exp $ */ /* $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/Attic/preproc.y,v 1.240 2003/06/26 11:37:05 meskes Exp $ */
/* Copyright comment */ /* Copyright comment */
%{ %{
...@@ -2674,7 +2674,7 @@ DeclareCursorStmt: DECLARE name cursor_options CURSOR opt_hold FOR SelectStmt ...@@ -2674,7 +2674,7 @@ DeclareCursorStmt: DECLARE name cursor_options CURSOR opt_hold FOR SelectStmt
argsinsert = argsresult = NULL; argsinsert = argsresult = NULL;
cur = this; cur = this;
if (compat == ECPG_COMPAT_INFORMIX) if (INFORMIX_MODE)
$$ = cat_str(5, adjust_informix(this->argsinsert), adjust_informix(this->argsresult), make_str("/*"), mm_strdup(this->command), make_str("*/")); $$ = cat_str(5, adjust_informix(this->argsinsert), adjust_informix(this->argsresult), make_str("/*"), mm_strdup(this->command), make_str("*/"));
else else
$$ = cat_str(3, make_str("/*"), mm_strdup(this->command), make_str("*/")); $$ = cat_str(3, make_str("/*"), mm_strdup(this->command), make_str("*/"));
...@@ -3476,8 +3476,6 @@ a_expr: c_expr ...@@ -3476,8 +3476,6 @@ a_expr: c_expr
{ $$ = cat_str(3, $1, make_str("not in"), $4); } { $$ = cat_str(3, $1, make_str("not in"), $4); }
| a_expr qual_all_Op sub_type select_with_parens %prec Op | a_expr qual_all_Op sub_type select_with_parens %prec Op
{ $$ = cat_str(4, $1, $2, $3, $4); } { $$ = cat_str(4, $1, $2, $3, $4); }
| a_expr qual_all_Op sub_type '(' a_expr ')' %prec Op
{ $$ = cat_str(6, $1, $2, $3, make_str("("), $5, make_str(")")); }
| UNIQUE select_with_parens %prec Op | UNIQUE select_with_parens %prec Op
{ $$ = cat2_str(make_str("unique"), $2); } { $$ = cat2_str(make_str("unique"), $2); }
| r_expr | r_expr
......
...@@ -34,8 +34,13 @@ int main() ...@@ -34,8 +34,13 @@ int main()
else else
printf("%d %d\n", i, j); printf("%d %d\n", i, j);
} }
$delete from test where i=87;
printf("delete: %ld\n", sqlca.sqlcode);
$commit;
$drop table test; $drop table test;
$commit;
$disconnect; $disconnect;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment