psql: Set variables from query result on failure when printing tuples
SetResultVariables() was not getting called when "printing" a result that failed (see around PrintQueryResult), which would cause some variables to not be set, like ROW_COUNT, SQLSTATE or ERROR. This can be confusing as a previous result would be retained. This state could be reached when failing to process tuples in a few commands, like \gset when it returns no tuples, or \crosstabview. A test is added, based on \gset. This is arguably a bug fix, but no backpatch is done as there is a risk of breaking scripts that rely on the previous behavior, even if they do so accidentally. Reported-by: amutu Author: Japin Li Reviewed-by: Tom Lane, Michael Paquier Discussion: https://postgr.es/m/18134-87126d90cb4dd049@postgresql.org
This commit is contained in:
parent
e1f95ec8cf
commit
2940f1c837
@ -1659,9 +1659,9 @@ ExecQueryAndProcessResults(const char *query,
|
||||
tuples_fout, printQueryFout);
|
||||
}
|
||||
|
||||
/* set variables on last result if all went well */
|
||||
if (!is_watch && last && success)
|
||||
SetResultVariables(result, true);
|
||||
/* set variables from last result */
|
||||
if (!is_watch && last)
|
||||
SetResultVariables(result, success);
|
||||
|
||||
ClearOrSaveResult(result);
|
||||
result = next_result;
|
||||
|
@ -171,6 +171,11 @@ select 10 as test01, 20 as test02 from generate_series(1,3) \gset
|
||||
more than one row returned for \gset
|
||||
select 10 as test01, 20 as test02 from generate_series(1,0) \gset
|
||||
no rows returned for \gset
|
||||
-- \gset returns no tuples
|
||||
select a from generate_series(1, 10) as a where a = 11 \gset
|
||||
no rows returned for \gset
|
||||
\echo :ROW_COUNT
|
||||
0
|
||||
-- \gset should work in FETCH_COUNT mode too
|
||||
\set FETCH_COUNT 1
|
||||
select 1 as x, 2 as y \gset pref01_ \\ \echo :pref01_x
|
||||
|
@ -87,6 +87,10 @@ select 1 as var1, NULL as var2, 3 as var3 \gset
|
||||
select 10 as test01, 20 as test02 from generate_series(1,3) \gset
|
||||
select 10 as test01, 20 as test02 from generate_series(1,0) \gset
|
||||
|
||||
-- \gset returns no tuples
|
||||
select a from generate_series(1, 10) as a where a = 11 \gset
|
||||
\echo :ROW_COUNT
|
||||
|
||||
-- \gset should work in FETCH_COUNT mode too
|
||||
\set FETCH_COUNT 1
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user