Re: ECPG patch N+1, fix auto-prepare - Mailing list pgsql-hackers
| From | Boszormenyi Zoltan |
|---|---|
| Subject | Re: ECPG patch N+1, fix auto-prepare |
| Date | |
| Msg-id | 4B28BC71.60905@cybertec.at Whole thread Raw |
| In response to | Re: ECPG patch N+1, fix auto-prepare (Michael Meskes <meskes@postgresql.org>) |
| Responses |
Re: ECPG patch N+1, fix auto-prepare
|
| List | pgsql-hackers |
Michael Meskes írta:
>> OK, here's another approach. output_statement()'s interface
>> is kept as the original, and not this function decides which
>>
>
> I still think this could be solved more easily.
>
Thanks very much for committing it.
But I don't understand your change. My code was:
=====================================
ecpg.addons:
ECPG: stmtDeleteStmt block
ECPG: stmtInsertStmt block
ECPG: stmtSelectStmt block
ECPG: stmtUpdateStmt block { output_statement($1, 1, auto_prepare ? ECPGst_prepnormal :
ECPGst_normal); }
=====================================
output.c:
static char *ecpg_statement_type_name[] = { "ECPGst_normal", "ECPGst_execute",
"ECPGst_exec_immediate", "ECPGst_prepnormal"
};
void
output_statement(char *stmt, int whenever_mode, enum ECPG_statement_type st)
{
fprintf(yyout, "{ ECPGdo(__LINE__, %d, %d, %s, %d, ", compat,
force_indicator, connection ? connection : "NULL", questionmarks); if (st == ECPGst_normal || st ==
ECPGst_prepnormal) { fprintf(yyout, "%s, \"", ecpg_statement_type_name[st]);
output_escaped_str(stmt,false); fputs("\", ", yyout); } else fprintf(yyout,
"%s,%s, ", ecpg_statement_type_name[st],
stmt);
=====================================
So the ECPGst_normal vs. prepnormal is decided at the caller
and output_statement() is simplified a bit vs the original.
Your code is:
=====================================
ecpg.addons:
ECPG: stmtDeleteStmt block
ECPG: stmtInsertStmt block
ECPG: stmtSelectStmt block
ECPG: stmtUpdateStmt block { output_statement($1, 1, ECPGst_prepnormal); }
=====================================
output.c:
static char *ecpg_statement_type_name[] = { "ECPGst_normal", "ECPGst_execute",
"ECPGst_exec_immediate", "ECPGst_prepnormal"
};
void
output_statement(char *stmt, int whenever_mode, enum ECPG_statement_type st)
{ fprintf(yyout, "{ ECPGdo(__LINE__, %d, %d, %s, %d, ", compat,
force_indicator, connection ? connection : "NULL", questionmarks); if (st == ECPGst_execute || st ==
ECPGst_exec_immediate) { fprintf(yyout, "%s, %s, ", ecpg_statement_type_name[st],
stmt); } else { if (st == ECPGst_prepnormal && auto_prepare)
fputs("ECPGst_prepnormal,\"", yyout); else fputs("ECPGst_normal, \"", yyout);
output_escaped_str(stmt, false); fputs("\", ", yyout); }
=====================================
Your code in ecpg.addons calls output_statement()
unconditionally with ECPGst_prepnormal and
output_statement() decides what to do with the
"auto_prepare" global variable. Your code doesn't
seem more readable than mine, but does the same
with the currently existing callers.
>> value it uses. I also introduced
>> static char *ecpg_statement_type_name[]
>> for the textual names of the ECPGst_* symbols to keep the
>> preprocessed code readable, and minimize the impact on the
>> regression tests. So output_statement() always emits
>> ECPGst_* symbols in the preprocessed code instead of
>> ECPGst_normal/prepnormal and numeric value for the
>> other two cases. This way only 7 regression tests' source
>> has changed instead of 45... There are less
>> 1 -> ECPGst_execute and
>> 2 -> ECPGst_exec_immediate
>> changes than
>> ECPGst_normal -> 0
>> changes would have been if I chose emitting the numeric value.
>>
>> Is it acceptable?
>>
>
> Yes sure.
>
> I changed some small parts of your patch (see above) and will commit in a few
> minutes. Just running regression tests.
>
Okay, I have to rebase my SQLDA and DESCRIBE
patches again, since the regression tests' results may
have changed beause of this patch. I will post them soon.
Again, thanks for committing it.
Best regards,
Zoltán Böszörményi
--
Bible has answers for everything. Proof:
"But let your communication be, Yea, yea; Nay, nay: for whatsoever is more
than these cometh of evil." (Matthew 5:37) - basics of digital technology.
"May your kingdom come" - superficial description of plate tectonics
----------------------------------
Zoltán Böszörményi
Cybertec Schönig & Schönig GmbH
http://www.postgresql.at/
pgsql-hackers by date: