Skip to content

Commit 196d0dd

Browse files
author
Michael Meskes
committed
Changed variable parsing so struct[n].attr works.
1 parent bbe9902 commit 196d0dd

File tree

9 files changed

+121
-159
lines changed

9 files changed

+121
-159
lines changed

src/interfaces/ecpg/ChangeLog

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1453,6 +1453,11 @@ Tue May 27 16:33:36 CEST 2003
14531453
Thu May 29 13:58:25 CEST 2003
14541454

14551455
- ecpg should now be able to parse forward struct definition.
1456+
1457+
Thu May 29 15:45:57 CEST 2003
1458+
1459+
- Changed parsing of variables to be able to reference one attribute
1460+
of the n-th entry in an array of structs.
14561461
- Set ecpg version to 2.12.0.
14571462
- Set ecpg library to 3.4.2.
14581463
- Set pgtypes library to 1.0.0

src/interfaces/ecpg/preproc/descriptor.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ output_get_descr(char *desc_name, char *index)
192192
break;
193193
}
194194
fprintf(yyout, "%s,", get_dtype(results->value));
195-
ECPGdump_a_type(yyout, v->name, v->type, NULL, NULL, NULL, NULL, NULL, NULL, make_str("0"), NULL, NULL);
195+
ECPGdump_a_type(yyout, v->name, v->type, NULL, NULL, NULL, NULL, make_str("0"), NULL, NULL);
196196
}
197197
drop_assignments();
198198
fputs("ECPGd_EODT);\n", yyout);

src/interfaces/ecpg/preproc/extern.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,8 @@ extern void add_descriptor(char *, char *);
7373
extern void drop_descriptor(char *, char *);
7474
extern struct descriptor *lookup_descriptor(char *, char *);
7575
extern struct variable *descriptor_variable(const char *name, int input);
76-
extern void add_variable(struct arguments **, struct variable *, char *i, struct variable *, char *);
77-
extern void append_variable(struct arguments **, struct variable *, char *, struct variable *, char *);
76+
extern void add_variable(struct arguments **, struct variable *, struct variable *);
77+
extern void append_variable(struct arguments **, struct variable *, struct variable *);
7878
extern void dump_variables(struct arguments *, int);
7979
extern struct typedefs *get_typedef(char *);
8080
extern void adjust_array(enum ECPGttype, char **, char **, char *, char *, int);

src/interfaces/ecpg/preproc/pgc.l

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
*
1313
*
1414
* IDENTIFICATION
15-
* $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/pgc.l,v 1.112 2003/05/29 12:00:21 meskes Exp $
15+
* $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/pgc.l,v 1.113 2003/05/29 13:59:26 meskes Exp $
1616
*
1717
*-------------------------------------------------------------------------
1818
*/
@@ -540,7 +540,7 @@ cppline {space}*#(.*\\{space})+.*
540540
yylval.str = mm_strdup(yytext);
541541
return FCONST;
542542
}
543-
<SQL>:{identifier}(("->"|\.){identifier})* {
543+
<SQL>:{identifier}((("->"|\.){identifier})|(\[{array}\]))* {
544544
yylval.str = mm_strdup(yytext+1);
545545
return(CVARIABLE);
546546
}

src/interfaces/ecpg/preproc/preproc.y

Lines changed: 14 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/Attic/preproc.y,v 1.224 2003/05/29 12:00:21 meskes Exp $ */
1+
/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/Attic/preproc.y,v 1.225 2003/05/29 13:59:26 meskes Exp $ */
22

33
/* Copyright comment */
44
%{
@@ -668,10 +668,10 @@ stmt: AlterDatabaseSetStmt { output_statement($1, 0, connection); }
668668
{
669669
/* merge variables given in prepare statement with those given here */
670670
for (p = ptr->argsinsert; p; p = p->next)
671-
append_variable(&argsinsert, p->variable, p->var_array_element, p->indicator, p->ind_array_element);
671+
append_variable(&argsinsert, p->variable, p->indicator);
672672

673673
for (p = ptr->argsresult; p; p = p->next)
674-
add_variable(&argsresult, p->variable, p->var_array_element, p->indicator, p->ind_array_element);
674+
add_variable(&argsresult, p->variable, p->indicator);
675675

676676
output_statement(mm_strdup(ptr->command), 0, ptr->connection ? mm_strdup(ptr->connection) : NULL);
677677
}
@@ -4234,7 +4234,7 @@ ECPGCursorStmt: DECLARE name cursor_options CURSOR opt_hold FOR ident
42344234
sprintf(thisquery->name, "ECPGprepared_statement(\"%s\")", $7);
42354235

42364236
this->argsinsert = NULL;
4237-
add_variable(&(this->argsinsert), thisquery, NULL, &no_indicator, NULL);
4237+
add_variable(&(this->argsinsert), thisquery, &no_indicator);
42384238

42394239
cur = this;
42404240

@@ -5095,7 +5095,7 @@ ECPGExecute : EXECUTE IMMEDIATE execstring
50955095
thisquery->next = NULL;
50965096
thisquery->name = $3;
50975097

5098-
add_variable(&argsinsert, thisquery, NULL, &no_indicator, NULL);
5098+
add_variable(&argsinsert, thisquery, &no_indicator);
50995099

51005100
$$ = make_str("?");
51015101
}
@@ -5109,7 +5109,7 @@ ECPGExecute : EXECUTE IMMEDIATE execstring
51095109
thisquery->name = (char *) mm_alloc(sizeof("ECPGprepared_statement(\"\")") + strlen($2));
51105110
sprintf(thisquery->name, "ECPGprepared_statement(\"%s\")", $2);
51115111

5112-
add_variable(&argsinsert, thisquery, NULL, &no_indicator, NULL);
5112+
add_variable(&argsinsert, thisquery, &no_indicator);
51135113
}
51145114
opt_ecpg_using opt_ecpg_into
51155115
{
@@ -5150,7 +5150,7 @@ ecpg_into: INTO into_list
51505150
}
51515151
| INTO opt_sql SQL_DESCRIPTOR quoted_ident_stringvar
51525152
{
5153-
add_variable(&argsresult, descriptor_variable($4,0), NULL, &no_indicator, NULL);
5153+
add_variable(&argsresult, descriptor_variable($4,0), &no_indicator);
51545154
$$ = EMPTY;
51555155
}
51565156
;
@@ -5970,57 +5970,26 @@ c_args: /*EMPTY*/ { $$ = EMPTY; }
59705970
| c_list { $$ = $1; }
59715971
;
59725972

5973-
coutputvariable: CVARIABLE '[' Iresult ']' indicator '[' Iresult ']'
5974-
{ add_variable(&argsresult, find_variable($1), $3, find_variable($5), $7); }
5975-
| CVARIABLE indicator '[' Iresult ']'
5976-
{ add_variable(&argsresult, find_variable($1), NULL, find_variable($2), $4); }
5977-
| CVARIABLE '[' Iresult ']' indicator
5978-
{ add_variable(&argsresult, find_variable($1), $3, find_variable($5), NULL); }
5979-
| CVARIABLE indicator
5980-
{ add_variable(&argsresult, find_variable($1), NULL, find_variable($2), NULL); }
5981-
| CVARIABLE '[' Iresult ']'
5982-
{ add_variable(&argsresult, find_variable($1), $3, &no_indicator, NULL); }
5973+
coutputvariable: CVARIABLE indicator
5974+
{ add_variable(&argsresult, find_variable($1), find_variable($2)); }
59835975
| CVARIABLE
5984-
{ add_variable(&argsresult, find_variable($1), NULL, &no_indicator, NULL); }
5976+
{ add_variable(&argsresult, find_variable($1), &no_indicator); }
59855977
;
59865978

59875979

5988-
civarind: CVARIABLE '[' Iresult ']' indicator '[' Iresult ']'
5989-
{
5990-
add_variable(&argsinsert, find_variable($1), $3, find_variable($5), $7);
5991-
$$ = create_questionmarks($1, true);
5992-
}
5993-
| CVARIABLE indicator '[' Iresult ']'
5994-
{
5995-
add_variable(&argsinsert, find_variable($1), NULL, find_variable($2), $4);
5996-
$$ = create_questionmarks($1, false);
5997-
}
5998-
| CVARIABLE '[' Iresult ']' indicator
5999-
{
6000-
if (find_variable($5)->type->type == ECPGt_array)
6001-
mmerror(PARSE_ERROR, ET_ERROR, "arrays of indicators are not allowed on input");
6002-
6003-
add_variable(&argsinsert, find_variable($1), $3, find_variable($5), NULL);
6004-
$$ = create_questionmarks($1, true);
6005-
}
6006-
| CVARIABLE indicator
5980+
civarind: CVARIABLE indicator
60075981
{
60085982
if (find_variable($2)->type->type == ECPGt_array)
60095983
mmerror(PARSE_ERROR, ET_ERROR, "arrays of indicators are not allowed on input");
60105984

6011-
add_variable(&argsinsert, find_variable($1), NULL, find_variable($2), NULL);
5985+
add_variable(&argsinsert, find_variable($1), find_variable($2));
60125986
$$ = create_questionmarks($1, false);
60135987
}
60145988
;
60155989

6016-
civar: CVARIABLE '[' Iresult ']'
6017-
{
6018-
add_variable(&argsinsert, find_variable($1), mm_strdup($3), &no_indicator, NULL);
6019-
$$ = create_questionmarks($1, true);
6020-
}
6021-
| CVARIABLE
5990+
civar: CVARIABLE
60225991
{
6023-
add_variable(&argsinsert, find_variable($1), NULL, &no_indicator, NULL);
5992+
add_variable(&argsinsert, find_variable($1), &no_indicator);
60245993
$$ = create_questionmarks($1, false);
60255994
}
60265995
;

src/interfaces/ecpg/preproc/type.c

Lines changed: 13 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -214,8 +214,7 @@ static void ECPGdump_a_struct(FILE *o, const char *name, const char *ind_name, c
214214

215215
void
216216
ECPGdump_a_type(FILE *o, const char *name, struct ECPGtype * type,
217-
const char *var_array_element, const char *ind_name,
218-
struct ECPGtype * ind_type, const char *ind_array_element,
217+
const char *ind_name, struct ECPGtype * ind_type,
219218
const char *prefix, const char *ind_prefix,
220219
char *arr_str_siz, const char *struct_sizeof,
221220
const char *ind_struct_sizeof)
@@ -232,86 +231,29 @@ ECPGdump_a_type(FILE *o, const char *name, struct ECPGtype * type,
232231
break;
233232
case ECPGt_struct:
234233
case ECPGt_union:
235-
/* If var_array_element is not equal
236-
* NULL, we have to use the
237-
* <var_array_element>th entry and
238-
* not the whole array */
239-
if (var_array_element == NULL)
240-
ECPGdump_a_struct(o, name,
241-
ind_name,
242-
type->size,
243-
type->u.element,
244-
(ind_type->type == ECPGt_NO_INDICATOR) ? ind_type : ind_type->u.element,
245-
NULL, prefix, ind_prefix);
246-
else
247-
{
248-
char *array_element = (char *)mm_alloc(strlen(name) + strlen(var_array_element) + sizeof("[]\0")), *ind_array_element;
249-
250-
sprintf(array_element, "%s[%s]", name, var_array_element);
251-
252-
if (ind_type->type != ECPGt_NO_INDICATOR)
253-
{
254-
ind_array_element = (char *)mm_alloc(strlen(ind_name) + strlen(ind_array_element) + sizeof("+\0"));
255-
sprintf(ind_array_element, "%s[%s]", ind_name, ind_array_element);
256-
257-
ECPGdump_a_struct(o, array_element, ind_array_element, make_str("1"),
258-
type->u.element, ind_type->u.element,
259-
NULL, prefix, ind_prefix);
260-
free(ind_array_element);
261-
}
262-
else
263-
ECPGdump_a_struct(o, array_element, ind_name, make_str("1"),
264-
type->u.element, ind_type,
265-
NULL, prefix, ind_prefix);
266-
267-
free (array_element);
268-
}
234+
ECPGdump_a_struct(o, name,
235+
ind_name,
236+
type->size,
237+
type->u.element,
238+
(ind_type->type == ECPGt_NO_INDICATOR) ? ind_type : ind_type->u.element,
239+
NULL, prefix, ind_prefix);
269240
break;
270241
default:
271242
if (!IS_SIMPLE_TYPE(type->u.element->type))
272243
yyerror("Internal error: unknown datatype, please inform pgsql-bugs@postgresql.org");
273244

274-
/* If var_array_element is not equal
275-
* NULL, we have to use the
276-
* <var_array_element>th entry and not
277-
* the whole array */
278-
if (var_array_element == NULL)
279-
ECPGdump_a_simple(o, name,
280-
type->u.element->type,
245+
ECPGdump_a_simple(o, name,
246+
type->u.element->type,
281247
type->u.element->size, type->size, NULL, prefix);
282-
else
283-
{
284-
char *array_element = (char *)mm_alloc(strlen(name) + strlen(var_array_element) + sizeof("+\0"));
285-
286-
sprintf(array_element, "%s+%s", name, var_array_element);
287-
ECPGdump_a_simple(o, array_element,
288-
type->u.element->type,
289-
type->u.element->size, make_str("1"), NULL, prefix);
290-
free(array_element);
291-
292-
293-
}
294248

295249
if (ind_type != NULL)
296250
{
297251
if (ind_type->type == ECPGt_NO_INDICATOR)
298252
ECPGdump_a_simple(o, ind_name, ind_type->type, ind_type->size, make_str("-1"), NULL, ind_prefix);
299253
else
300254
{
301-
if (ind_array_element == NULL)
302-
ECPGdump_a_simple(o, ind_name, ind_type->u.element->type,
303-
ind_type->u.element->size, ind_type->size, NULL, prefix);
304-
else
305-
{
306-
char *array_element = (char *)mm_alloc(strlen(ind_name) + strlen(ind_array_element) + sizeof("+\0"));
307-
308-
sprintf(array_element, "%s+%s", ind_name, ind_array_element);
309-
ECPGdump_a_simple(o, array_element,
310-
ind_type->u.element->type,
311-
ind_type->u.element->size,
312-
make_str("1"), NULL, prefix);
313-
free(array_element);
314-
}
255+
ECPGdump_a_simple(o, ind_name, ind_type->u.element->type,
256+
ind_type->u.element->size, ind_type->size, NULL, prefix);
315257
}
316258
}
317259
}
@@ -516,9 +458,9 @@ ECPGdump_a_struct(FILE *o, const char *name, const char *ind_name, char *arrsiz,
516458

517459
for (p = type->u.members; p; p = p->next)
518460
{
519-
ECPGdump_a_type(o, p->name, p->type, NULL,
461+
ECPGdump_a_type(o, p->name, p->type,
520462
(ind_p != NULL) ? ind_p->name : NULL,
521-
(ind_p != NULL) ? ind_p->type : NULL, NULL,
463+
(ind_p != NULL) ? ind_p->type : NULL,
522464
prefix, ind_prefix, arrsiz, type->struct_sizeof,
523465
(ind_p != NULL) ? ind_type->struct_sizeof : NULL);
524466
if (ind_p != NULL && ind_p != &struct_no_indicator)

src/interfaces/ecpg/preproc/type.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,8 @@ void ECPGfree_type(struct ECPGtype *);
4949
size is the maxsize in case it is a varchar. Otherwise it is the size of
5050
the variable (required to do array fetches of structs).
5151
*/
52-
void ECPGdump_a_type(FILE *, const char *, struct ECPGtype *, const char *,
53-
const char *, struct ECPGtype *, const char *, const char *,
52+
void ECPGdump_a_type(FILE *, const char *, struct ECPGtype *,
53+
const char *, struct ECPGtype *, const char *,
5454
const char *, char *, const char *, const char *);
5555

5656
/* A simple struct to keep a variable and its type. */
@@ -147,9 +147,7 @@ struct variable
147147
struct arguments
148148
{
149149
struct variable *variable;
150-
char *var_array_element;
151150
struct variable *indicator;
152-
char *ind_array_element;
153151
struct arguments *next;
154152
};
155153

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy