- Fixed segfault due to missing check for variable declaration.
- Added check for multidimensional array usage.
This commit is contained in:
parent
c934cf1e96
commit
f3c6d592d2
@ -1754,6 +1754,11 @@ Tue Feb 24 16:48:57 CET 2004
|
|||||||
Mon Mar 1 08:56:37 CET 2004
|
Mon Mar 1 08:56:37 CET 2004
|
||||||
|
|
||||||
- Added partly missing VOLATILE keyword.
|
- 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 pgtypeslib version to 1.2.
|
||||||
- Set ecpg version to 3.2.0.
|
- Set ecpg version to 3.2.0.
|
||||||
|
|
||||||
|
@ -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 */
|
/* Copyright comment */
|
||||||
%{
|
%{
|
||||||
@ -541,7 +541,7 @@ add_additional_variables(char *name, bool insert)
|
|||||||
%type <str> ECPGTypeName using_list ECPGColLabelCommon UsingConst
|
%type <str> ECPGTypeName using_list ECPGColLabelCommon UsingConst
|
||||||
%type <str> inf_val_list inf_col_list using_descriptor into_descriptor
|
%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> 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
|
%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)
|
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 */
|
/* check if we have a char variable */
|
||||||
struct variable *p = find_variable($1);
|
struct variable *p = find_variable($1);
|
||||||
@ -5241,14 +5241,14 @@ ECPGAllocateDescr: SQL_ALLOCATE SQL_DESCRIPTOR quoted_ident_stringvar
|
|||||||
* read from descriptor
|
* read from descriptor
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ECPGGetDescHeaderItem: CVARIABLE '=' desc_header_item
|
ECPGGetDescHeaderItem: cvariable '=' desc_header_item
|
||||||
{ push_assignment($1, $3); }
|
{ push_assignment($1, $3); }
|
||||||
;
|
;
|
||||||
|
|
||||||
desc_header_item: SQL_COUNT { $$ = ECPGd_count; }
|
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; }
|
descriptor_item: SQL_CARDINALITY { $$ = ECPGd_cardinality; }
|
||||||
| SQL_DATA { $$ = ECPGd_data; }
|
| SQL_DATA { $$ = ECPGd_data; }
|
||||||
@ -5280,7 +5280,7 @@ ECPGGetDescriptorHeader: GET SQL_DESCRIPTOR quoted_ident_stringvar
|
|||||||
{ $$ = $3; }
|
{ $$ = $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; }
|
{ $$.str = $5; $$.name = $3; }
|
||||||
| GET SQL_DESCRIPTOR quoted_ident_stringvar SQL_VALUE Iconst ECPGGetDescItems
|
| GET SQL_DESCRIPTOR quoted_ident_stringvar SQL_VALUE Iconst ECPGGetDescItems
|
||||||
{ $$.str = $5; $$.name = $3; }
|
{ $$.str = $5; $$.name = $3; }
|
||||||
@ -6047,14 +6047,14 @@ c_args: /*EMPTY*/ { $$ = EMPTY; }
|
|||||||
| c_list { $$ = $1; }
|
| c_list { $$ = $1; }
|
||||||
;
|
;
|
||||||
|
|
||||||
coutputvariable: CVARIABLE indicator
|
coutputvariable: cvariable indicator
|
||||||
{ add_variable_to_head(&argsresult, find_variable($1), find_variable($2)); }
|
{ add_variable_to_head(&argsresult, find_variable($1), find_variable($2)); }
|
||||||
| CVARIABLE
|
| cvariable
|
||||||
{ add_variable_to_head(&argsresult, find_variable($1), &no_indicator); }
|
{ add_variable_to_head(&argsresult, find_variable($1), &no_indicator); }
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
civarind: CVARIABLE indicator
|
civarind: cvariable indicator
|
||||||
{
|
{
|
||||||
if (find_variable($2)->type->type == ECPGt_array)
|
if (find_variable($2)->type->type == ECPGt_array)
|
||||||
mmerror(PARSE_ERROR, ET_ERROR, "arrays of indicators are not allowed on input");
|
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);
|
add_variable_to_head(&argsinsert, find_variable($1), &no_indicator);
|
||||||
$$ = create_questionmarks($1, false);
|
$$ = create_questionmarks($1, false);
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
indicator: CVARIABLE { check_indicator((find_variable($1))->type); $$ = $1; }
|
indicator: cvariable { check_indicator((find_variable($1))->type); $$ = $1; }
|
||||||
| SQL_INDICATOR CVARIABLE { check_indicator((find_variable($2))->type); $$ = $2; }
|
| SQL_INDICATOR cvariable { check_indicator((find_variable($2))->type); $$ = $2; }
|
||||||
| SQL_INDICATOR name { 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; }
|
ident: IDENT { $$ = $1; }
|
||||||
| CSTRING { $$ = make3_str(make_str("\""), $1, make_str("\"")); }
|
| CSTRING { $$ = make3_str(make_str("\""), $1, make_str("\"")); }
|
||||||
;
|
;
|
||||||
|
@ -218,7 +218,7 @@ find_variable(char *name)
|
|||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* We don't care about what's inside the array braces so just
|
* 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++)
|
for (count = 1, end = next + 1; count; end++)
|
||||||
{
|
{
|
||||||
@ -242,6 +242,11 @@ find_variable(char *name)
|
|||||||
|
|
||||||
*next = '\0';
|
*next = '\0';
|
||||||
p = find_simple(name);
|
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;
|
*next = c;
|
||||||
switch (p->type->u.element->type)
|
switch (p->type->u.element->type)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user