From: | "Takahashi, Ryohei" <r(dot)takahashi_2(at)jp(dot)fujitsu(dot)com> |
---|---|
To: | 'Michael Meskes' <meskes(at)postgresql(dot)org>, "Matsumura, Ryo" <matsumura(dot)ryo(at)jp(dot)fujitsu(dot)com>, "'pgsql-hackers(at)postgresql(dot)org'" <pgsql-hackers(at)postgresql(dot)org> |
Subject: | RE: SQL statement PREPARE does not work in ECPG |
Date: | 2019-02-20 01:53:22 |
Message-ID: | EE586BE92A4AFB45B03310C2A0C0565D6D38024F@G01JPEXMBKW03 |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
Hi Meskes-san,
Thank you for your replying.
> Please try this instead:
>
> EXEC SQL PREPARE test_prep (int) AS SELECT id from test_table where id
> = $1;
> EXEC SQL EXECUTE test_prep using 2;
>
> This should work.
I tried as follows.
<test_app.pgc>
============================
EXEC SQL PREPARE test_prep (int) AS SELECT id from test_table where id = $1;
EXEC SQL EXECUTE test_prep using 2;
============================
<test_app.c>
============================
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "prepare \"test_prep\" ( int ) as \" select id from test_table where id = $1 \"", ECPGt_EOIT, ECPGt_EORT);
#line 16 "test_app.pgc"
if (sqlca.sqlcode < 0) error_exit ( );}
#line 16 "test_app.pgc"
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_execute, "test_prep",
ECPGt_const,"2",(long)1,(long)1,strlen("2"),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 17 "test_app.pgc"
if (sqlca.sqlcode < 0) error_exit ( );}
#line 17 "test_app.pgc"
============================
Unfortunately, this does not work.
ECPGst_execute seems good, but prepare statement is the same as my first post.
It fails with "PostgreSQL error : -202[too few arguments on line 16]".
This error is caused by following source code.
<execute.c ecpg_build_params()>
/* Check if there are unmatched things left. */
if (next_insert(stmt->command, position, stmt->questionmarks, std_strings) >= 0)
{
ecpg_raise(stmt->lineno, ECPG_TOO_FEW_ARGUMENTS,
ECPG_SQLSTATE_USING_CLAUSE_DOES_NOT_MATCH_PARAMETERS, NULL);
ecpg_free_params(stmt, false);
return false;
}
<execute.c next_insert()>
if (text[p] == '$' && isdigit((unsigned char) text[p + 1]))
{
/* this can be either a dollar quote or a variable */
int i;
for (i = p + 1; isdigit((unsigned char) text[i]); i++)
/* empty loop body */ ;
if (!isalpha((unsigned char) text[i]) &&
isascii((unsigned char) text[i]) &&text[i] != '_')
/* not dollar delimited quote */
return p;
}
I think next_insert() should ignore "$n" in the case of SQL statement PREPARE.
In addition, we should fix following, right?
(1)
As Matsumura-san wrote, ECPG should not produce '"' for SQL statement PREPARE.
(2)
ECPG should produce argument for execute statement such as "EXEC SQL EXECUTE test_prep (2);"
Regards,
Ryohei Takahashi
From | Date | Subject | |
---|---|---|---|
Next Message | Amit Langote | 2019-02-20 01:55:45 | Re: Another way to fix inherited UPDATE/DELETE |
Previous Message | Nikita Glukhov | 2019-02-20 01:18:56 | Re: [PATCH] kNN for btree |