aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Meskes <meskes@postgresql.org>2004-03-04 07:32:02 +0000
committerMichael Meskes <meskes@postgresql.org>2004-03-04 07:32:02 +0000
commitf3c6d592d21b81e60f6a2358c68bc527d49302f7 (patch)
tree38cb2ea9fd62046bba955cdfb54eea350fd9f52e /src
parentc934cf1e962d79eaa70b99739bb325b429d31a77 (diff)
downloadpostgresql-f3c6d592d21b81e60f6a2358c68bc527d49302f7.tar.gz
postgresql-f3c6d592d21b81e60f6a2358c68bc527d49302f7.zip
- Fixed segfault due to missing check for variable declaration.
- Added check for multidimensional array usage.
Diffstat (limited to 'src')
-rw-r--r--src/interfaces/ecpg/ChangeLog5
-rw-r--r--src/interfaces/ecpg/preproc/preproc.y55
-rw-r--r--src/interfaces/ecpg/preproc/variable.c7
3 files changed, 53 insertions, 14 deletions
diff --git a/src/interfaces/ecpg/ChangeLog b/src/interfaces/ecpg/ChangeLog
index 1ef50c177a1..922def7031e 100644
--- a/src/interfaces/ecpg/ChangeLog
+++ b/src/interfaces/ecpg/ChangeLog
@@ -1754,6 +1754,11 @@ Tue Feb 24 16:48:57 CET 2004
Mon Mar 1 08:56:37 CET 2004
- Added partly missing VOLATILE keyword.
+
+Thu Mar 4 08:29:02 CET 2004
+
+ - Fixed segfault due to missing check for variable declaration.
+ - Added check for multidimensional array usage.
- Set pgtypeslib version to 1.2.
- Set ecpg version to 3.2.0.
diff --git a/src/interfaces/ecpg/preproc/preproc.y b/src/interfaces/ecpg/preproc/preproc.y
index 3e106f3bbc2..96f3bb074b0 100644
--- a/src/interfaces/ecpg/preproc/preproc.y
+++ b/src/interfaces/ecpg/preproc/preproc.y
@@ -1,4 +1,4 @@
-/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/preproc.y,v 1.276 2004/03/02 06:45:05 meskes Exp $ */
+/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/preproc.y,v 1.277 2004/03/04 07:32:01 meskes Exp $ */
/* Copyright comment */
%{
@@ -541,7 +541,7 @@ add_additional_variables(char *name, bool insert)
%type <str> ECPGTypeName using_list ECPGColLabelCommon UsingConst
%type <str> inf_val_list inf_col_list using_descriptor into_descriptor
%type <str> ecpg_into_using prepared_name struct_union_type_with_symbol
-%type <str> ECPGunreserved ECPGunreserved_interval
+%type <str> ECPGunreserved ECPGunreserved_interval cvariable
%type <struct_union> s_struct_union_symbol
@@ -4220,7 +4220,7 @@ connection_target: database_name opt_server opt_port
}
;
-db_prefix: ident CVARIABLE
+db_prefix: ident cvariable
{
if (strcmp($2, "postgresql") != 0 && strcmp($2, "postgres") != 0)
{
@@ -4311,7 +4311,7 @@ user_name: UserId
}
;
-char_variable: CVARIABLE
+char_variable: cvariable
{
/* check if we have a char variable */
struct variable *p = find_variable($1);
@@ -5241,14 +5241,14 @@ ECPGAllocateDescr: SQL_ALLOCATE SQL_DESCRIPTOR quoted_ident_stringvar
* read from descriptor
*/
-ECPGGetDescHeaderItem: CVARIABLE '=' desc_header_item
+ECPGGetDescHeaderItem: cvariable '=' desc_header_item
{ push_assignment($1, $3); }
;
desc_header_item: SQL_COUNT { $$ = ECPGd_count; }
;
-ECPGGetDescItem: CVARIABLE '=' descriptor_item { push_assignment($1, $3); };
+ECPGGetDescItem: cvariable '=' descriptor_item { push_assignment($1, $3); };
descriptor_item: SQL_CARDINALITY { $$ = ECPGd_cardinality; }
| SQL_DATA { $$ = ECPGd_data; }
@@ -5280,7 +5280,7 @@ ECPGGetDescriptorHeader: GET SQL_DESCRIPTOR quoted_ident_stringvar
{ $$ = $3; }
;
-ECPGGetDescriptor: GET SQL_DESCRIPTOR quoted_ident_stringvar SQL_VALUE CVARIABLE ECPGGetDescItems
+ECPGGetDescriptor: GET SQL_DESCRIPTOR quoted_ident_stringvar SQL_VALUE cvariable ECPGGetDescItems
{ $$.str = $5; $$.name = $3; }
| GET SQL_DESCRIPTOR quoted_ident_stringvar SQL_VALUE Iconst ECPGGetDescItems
{ $$.str = $5; $$.name = $3; }
@@ -6047,14 +6047,14 @@ c_args: /*EMPTY*/ { $$ = EMPTY; }
| c_list { $$ = $1; }
;
-coutputvariable: CVARIABLE indicator
+coutputvariable: cvariable indicator
{ add_variable_to_head(&argsresult, find_variable($1), find_variable($2)); }
- | CVARIABLE
+ | cvariable
{ add_variable_to_head(&argsresult, find_variable($1), &no_indicator); }
;
-civarind: CVARIABLE indicator
+civarind: cvariable indicator
{
if (find_variable($2)->type->type == ECPGt_array)
mmerror(PARSE_ERROR, ET_ERROR, "arrays of indicators are not allowed on input");
@@ -6064,18 +6064,47 @@ civarind: CVARIABLE indicator
}
;
-civar: CVARIABLE
+civar: cvariable
{
add_variable_to_head(&argsinsert, find_variable($1), &no_indicator);
$$ = create_questionmarks($1, false);
}
;
-indicator: CVARIABLE { check_indicator((find_variable($1))->type); $$ = $1; }
- | SQL_INDICATOR CVARIABLE { check_indicator((find_variable($2))->type); $$ = $2; }
+indicator: cvariable { check_indicator((find_variable($1))->type); $$ = $1; }
+ | SQL_INDICATOR cvariable { check_indicator((find_variable($2))->type); $$ = $2; }
| SQL_INDICATOR name { check_indicator((find_variable($2))->type); $$ = $2; }
;
+cvariable: CVARIABLE
+ {
+ /* As long as multidimensional arrays are not implemented we have to check for those here */
+ char *ptr = $1;
+ int brace_open=0, brace = false;
+
+ for (; *ptr; ptr++)
+ {
+ switch (*ptr)
+ {
+ case '[': if (brace)
+ {
+ mmerror(PARSE_ERROR, ET_FATAL, "No multidimensional array support for simple data types");
+ }
+ brace_open++;
+ break;
+ case ']': brace_open--;
+ if (brace_open == 0) brace = true;
+ break;
+ case '\t':
+ case ' ': break;
+ default: if (brace_open == 0) brace = false;
+ break;
+ }
+ }
+
+ $$ = $1;
+ }
+ ;
ident: IDENT { $$ = $1; }
| CSTRING { $$ = make3_str(make_str("\""), $1, make_str("\"")); }
;
diff --git a/src/interfaces/ecpg/preproc/variable.c b/src/interfaces/ecpg/preproc/variable.c
index e12b9434998..f1a875f0ccc 100644
--- a/src/interfaces/ecpg/preproc/variable.c
+++ b/src/interfaces/ecpg/preproc/variable.c
@@ -218,7 +218,7 @@ find_variable(char *name)
{
/*
* We don't care about what's inside the array braces so just
- * eat up the character
+ * eat up the characters
*/
for (count = 1, end = next + 1; count; end++)
{
@@ -242,6 +242,11 @@ find_variable(char *name)
*next = '\0';
p = find_simple(name);
+ if (p == NULL)
+ {
+ snprintf(errortext, sizeof(errortext), "The variable %s is not declared", name);
+ mmerror(PARSE_ERROR, ET_FATAL, errortext);
+ }
*next = c;
switch (p->type->u.element->type)
{