summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Meskes2003-06-29 16:52:58 +0000
committerMichael Meskes2003-06-29 16:52:58 +0000
commitcf883ea95c4bad69910300cbd6c0ef5cb84a9178 (patch)
treeb63f0ec4b5df349900007d35f0b431083200bfbf
parent4355d4fb215f0f795241871b30eb3b7e949387cd (diff)
- Made sure Informix style decimal vars are initialized. They use a
fixed amount of digits and not an allocated one. So we have to work around. PostgreSQL numeric type remains the same. - In INFORMIX_SE mode with autcommit set, make all cursors be "with hold". Is this really they way SE behaves?
-rw-r--r--src/interfaces/ecpg/ChangeLog5
-rw-r--r--src/interfaces/ecpg/include/ecpgtype.h1
-rw-r--r--src/interfaces/ecpg/preproc/preproc.y28
-rw-r--r--src/interfaces/ecpg/test/num_test.pgc2
-rw-r--r--src/interfaces/ecpg/test/test_informix.pgc16
5 files changed, 41 insertions, 11 deletions
diff --git a/src/interfaces/ecpg/ChangeLog b/src/interfaces/ecpg/ChangeLog
index 0185496fe06..32cb6f40ec8 100644
--- a/src/interfaces/ecpg/ChangeLog
+++ b/src/interfaces/ecpg/ChangeLog
@@ -1528,6 +1528,11 @@ Thu Jun 26 13:26:13 CEST 2003
Sun Jun 29 11:22:48 CEST 2003
- Just another sync.
+ - Made sure Informix style decimal vars are initialized. They use a
+ fixed amount of digits and not an allocated one. So we have to work
+ around. PostgreSQL numeric type remains the same.
+ - In INFORMIX_SE mode with autcommit set, make all cursors be "with
+ hold". Is this really they way SE behaves?
- Set ecpg version to 3.0.0
- Set ecpg library to 4.0.0
- Set pgtypes library to 1.0.0
diff --git a/src/interfaces/ecpg/include/ecpgtype.h b/src/interfaces/ecpg/include/ecpgtype.h
index bd1902a093e..94899413da5 100644
--- a/src/interfaces/ecpg/include/ecpgtype.h
+++ b/src/interfaces/ecpg/include/ecpgtype.h
@@ -45,6 +45,7 @@ enum ECPGttype
ECPGt_float, ECPGt_double,
ECPGt_varchar, ECPGt_varchar2,
ECPGt_numeric,
+ ECPGt_decimal, /* only used internally */
ECPGt_date,
ECPGt_timestamp,
ECPGt_interval,
diff --git a/src/interfaces/ecpg/preproc/preproc.y b/src/interfaces/ecpg/preproc/preproc.y
index 6c6006c175e..b82adfa7325 100644
--- a/src/interfaces/ecpg/preproc/preproc.y
+++ b/src/interfaces/ecpg/preproc/preproc.y
@@ -1,4 +1,4 @@
-/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/Attic/preproc.y,v 1.242 2003/06/29 09:25:19 meskes Exp $ */
+/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/Attic/preproc.y,v 1.243 2003/06/29 16:52:58 meskes Exp $ */
/* Copyright comment */
%{
@@ -2706,7 +2706,10 @@ cursor_options: /* EMPTY */ { $$ = EMPTY; }
| cursor_options NO SCROLL { $$ = cat2_str($1, make_str("no scroll")); }
;
-opt_hold: /* EMPTY */ { $$ = EMPTY; }
+opt_hold: /* EMPTY */ { if (compat == ECPG_COMPAT_INFORMIX_SE && autocommit == true)
+ $$ = make_str("with hold");
+ else
+ $$ = EMPTY; }
| WITH HOLD { $$ = make_str("with hold"); }
| WITHOUT HOLD { $$ = make_str("without hold"); }
;
@@ -4449,7 +4452,7 @@ single_vt_type: common_type
}
else if (strcmp($1, "decimal") == 0)
{
- $$.type_enum = ECPGt_numeric;
+ $$.type_enum = ECPGt_decimal;
$$.type_str = make_str("Numeric");
$$.type_dimension = make_str("-1");
$$.type_index = make_str("-1");
@@ -4751,7 +4754,7 @@ common_type: simple_type
if (strcmp($1, "numeric") != 0 && strcmp($1, "decimal") != 0)
mmerror(PARSE_ERROR, ET_ERROR, "Only numeric/decimal have precision/scale argument");
- $$.type_enum = ECPGt_numeric;
+ $$.type_enum = (strcmp($1, "numeric") != 0) ? ECPGt_decimal : ECPGt_numeric;
$$.type_str = make_str("Numeric");
$$.type_dimension = make_str("-1");
$$.type_index = make_str("-1");
@@ -4803,7 +4806,7 @@ var_type: common_type
}
else if (strcmp($1, "decimal") == 0)
{
- $$.type_enum = ECPGt_numeric;
+ $$.type_enum = ECPGt_decimal;
$$.type_str = make_str("Numeric");
$$.type_dimension = make_str("-1");
$$.type_index = make_str("-1");
@@ -5073,6 +5076,21 @@ variable: opt_pointer ECPGColLabelCommon opt_array_bounds opt_initializer
$$ = cat_str(4, $1, mm_strdup($2), $3.str, $4);
break;
+ case ECPGt_decimal: /* this is used by informix and need to be initialized */
+ if (atoi(dimension) < 0)
+ type = ECPGmake_simple_type(ECPGt_numeric, make_str("1"));
+ else
+ type = ECPGmake_array_type(ECPGmake_simple_type(ECPGt_numeric, make_str("1")), dimension);
+
+ if (strlen($4) == 0)
+ {
+ $4 = mm_alloc(sizeof(" = {0, 0, 0, 0, 0, NULL, NULL}"));
+ strcpy($4, " = {0, 0, 0, 0, 0, NULL, NULL}");
+ }
+
+ $$ = cat_str(4, $1, mm_strdup($2), $3.str, $4);
+
+ break;
default:
if (atoi(dimension) < 0)
type = ECPGmake_simple_type(actual_type[struct_level].type_enum, make_str("1"));
diff --git a/src/interfaces/ecpg/test/num_test.pgc b/src/interfaces/ecpg/test/num_test.pgc
index 4e921bb33e2..5b83af5bd07 100644
--- a/src/interfaces/ecpg/test/num_test.pgc
+++ b/src/interfaces/ecpg/test/num_test.pgc
@@ -8,7 +8,7 @@ main()
char *text="error\n";
Numeric *value1, *value2, *res;
exec sql begin declare section;
- decimal(14,7) des = {0, 0, 0, 0, 0, NULL, NULL} ;
+ numeric(14,7) des = {0, 0, 0, 0, 0, NULL, NULL} ;
exec sql end declare section;
double d;
FILE *dbgs;
diff --git a/src/interfaces/ecpg/test/test_informix.pgc b/src/interfaces/ecpg/test/test_informix.pgc
index fdc9a97954f..0ca4c0647fc 100644
--- a/src/interfaces/ecpg/test/test_informix.pgc
+++ b/src/interfaces/ecpg/test/test_informix.pgc
@@ -5,7 +5,7 @@ void openit(void);
int main()
{
$int i = 14;
- $int j;
+ $decimal j;
FILE *dbgs;
if ((dbgs = fopen("log", "w")) != NULL)
@@ -15,24 +15,30 @@ int main()
$create table test(i int primary key, j int);
- rsetnull(CINTTYPE, (char *)&j);
+ rsetnull(CDECIMALTYPE, (char *)&j);
$insert into test (i, j) values (7, :j);
$insert into test (i, j) values (:i, 1);
$declare c cursor for select * from test where i <= :i;
openit();
- j=0;
+ deccvint(0, &j);
+
while (1)
{
$fetch in c into :i, :j;
if (sqlca.sqlcode == 100) break;
else if (sqlca.sqlcode != 0) printf ("Error: %ld\n", sqlca.sqlcode);
- if (risnull(CINTTYPE, (char *)&j))
+ if (risnull(CDECIMALTYPE, (char *)&j))
printf("%d\n", i);
else
- printf("%d %d\n", i, j);
+ {
+ int a;
+
+ dectoint(&j, &a);
+ printf("%d %d\n", i, a);
+ }
}
$delete from test where i=87;