aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Paquier <michael@paquier.xyz>2023-10-02 11:05:05 +0900
committerMichael Paquier <michael@paquier.xyz>2023-10-02 11:05:05 +0900
commit2940f1c8373cb3b43b3b42d40786b05d6e901de1 (patch)
treeb18c63d3a11e1f6e17e9d7d35e423d62d822ae72 /src
parente1f95ec8cf6ea75d90905b2c746e2e1e9f3c9fc1 (diff)
downloadpostgresql-2940f1c8373cb3b43b3b42d40786b05d6e901de1.tar.gz
postgresql-2940f1c8373cb3b43b3b42d40786b05d6e901de1.zip
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
Diffstat (limited to 'src')
-rw-r--r--src/bin/psql/common.c6
-rw-r--r--src/test/regress/expected/psql.out5
-rw-r--r--src/test/regress/sql/psql.sql4
3 files changed, 12 insertions, 3 deletions
diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c
index ede197bebeb..daabf6f12b7 100644
--- a/src/bin/psql/common.c
+++ b/src/bin/psql/common.c
@@ -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;
diff --git a/src/test/regress/expected/psql.out b/src/test/regress/expected/psql.out
index 7cd0c27cca8..c70205b98a4 100644
--- a/src/test/regress/expected/psql.out
+++ b/src/test/regress/expected/psql.out
@@ -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
diff --git a/src/test/regress/sql/psql.sql b/src/test/regress/sql/psql.sql
index f3bc6cd07e8..66ff64a160f 100644
--- a/src/test/regress/sql/psql.sql
+++ b/src/test/regress/sql/psql.sql
@@ -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