[Bug Fix] ECPG: could not use set xxx to default statement
Higuchi, Daisuke <higuchi.daisuke@jp.fujitsu.com>
From: "Higuchi, Daisuke" <higuchi.daisuke@jp.fujitsu.com>
To: "'pgsql-hackers@postgresql.org'" <pgsql-hackers@postgresql.org>
Date: 2019-02-19T04:04:10Z
Lists: pgsql-hackers
Attachments
- FIX_ECPG_SET_TO_DEFAULT_v1.patch (application/octet-stream) patch v1
Hi,
I found ECPG's bug which SET xxx = DEFAULT statement could not be used.
[PROBLEM]
When the source code (*.pgc) has "EXEC SQL set xxx = default;", created c program by ECPG has no " = default".
For example, "EXEC SQL set search_path = default;" in *.pgc will be converted to "{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "set search_path", ECPGt_EOIT, ECPGt_EORT);}" in c program.
[Investigation]
gram.y lacks ";" in the end of section "generic_set", so preproc.y's syntax is broken.
src/backend/parser/gram.y
-------------------------------------------
generic_set:
| var_name '=' DEFAULT
{
VariableSetStmt *n = makeNode(VariableSetStmt);
n->kind = VAR_SET_DEFAULT;
n->name = $1;
$$ = n;
}
set_rest_more: /* Generic SET syntaxes: */
-------------------------------------------
src/interfaces/ecpg/preproc/preproc.y
-------------------------------------------
generic_set:
| var_name TO DEFAULT
{
$$ = cat_str(2,$1,mm_strdup("to default"));
}
| var_name '=' DEFAULT set_rest_more:
generic_set
{
$$ = $1;
}
-------------------------------------------
I attached the patch which has ";" in the end of section "generic_set" and regression.
Regards,
Daisuke, Higuchi
Commits
-
Fix ecpg bugs caused by missing semicolons in the backend grammar.
- 53c2bb78db9f 9.4.22 landed
- 3a682a21b7f9 9.5.17 landed
- de94ed89d5b0 11.3 landed
- 9e138a401d19 12.0 landed
- 904fce2a7695 9.6.13 landed
- 8ec638e69c01 10.8 landed