aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2023-02-13 12:19:58 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2023-02-13 12:19:58 -0500
commitc7468c73f7b6e842a53c12eaee5578a76a8fa7a6 (patch)
treeb9e98e8e29c575046100e3d42c9d723319f8248e /src
parentf50f029c497da35927491f16964f7aa993ecbae5 (diff)
downloadpostgresql-c7468c73f7b6e842a53c12eaee5578a76a8fa7a6.tar.gz
postgresql-c7468c73f7b6e842a53c12eaee5578a76a8fa7a6.zip
Fix buggy recursion in flatten_rtes_walker().
Must save-and-restore the context we are modifying. Oversight in commit a61b1f748. Tender Wang Discussion: https://postgr.es/m/CAHewXNnnNySD_YcKNuFpQDV2gxWA7_YLWqHmYVcyoOYxn8kY2A@mail.gmail.com Discussion: https://postgr.es/m/20230212233711.GA1316@telsasoft.com
Diffstat (limited to 'src')
-rw-r--r--src/backend/optimizer/plan/setrefs.c13
-rw-r--r--src/test/regress/expected/join.out12
-rw-r--r--src/test/regress/sql/join.sql6
3 files changed, 27 insertions, 4 deletions
diff --git a/src/backend/optimizer/plan/setrefs.c b/src/backend/optimizer/plan/setrefs.c
index 186fc8014b6..5cc8366af66 100644
--- a/src/backend/optimizer/plan/setrefs.c
+++ b/src/backend/optimizer/plan/setrefs.c
@@ -536,11 +536,16 @@ flatten_rtes_walker(Node *node, flatten_rtes_walker_context *cxt)
* Recurse into subselects. Must update cxt->query to this query so
* that the rtable and rteperminfos correspond with each other.
*/
+ Query *save_query = cxt->query;
+ bool result;
+
cxt->query = (Query *) node;
- return query_tree_walker((Query *) node,
- flatten_rtes_walker,
- (void *) cxt,
- QTW_EXAMINE_RTES_BEFORE);
+ result = query_tree_walker((Query *) node,
+ flatten_rtes_walker,
+ (void *) cxt,
+ QTW_EXAMINE_RTES_BEFORE);
+ cxt->query = save_query;
+ return result;
}
return expression_tree_walker(node, flatten_rtes_walker,
(void *) cxt);
diff --git a/src/test/regress/expected/join.out b/src/test/regress/expected/join.out
index db9512969f3..16318d9da22 100644
--- a/src/test/regress/expected/join.out
+++ b/src/test/regress/expected/join.out
@@ -5569,6 +5569,18 @@ select atts.relid::regclass, s.* from pg_stats s join
ERROR: column atts.relid does not exist
LINE 1: select atts.relid::regclass, s.* from pg_stats s join
^
+-- Test bug in rangetable flattening
+explain (verbose, costs off)
+select 1 from
+ (select * from int8_tbl where q1 <> (select 42) offset 0) ss
+where false;
+ QUERY PLAN
+--------------------------
+ Result
+ Output: 1
+ One-Time Filter: false
+(3 rows)
+
--
-- Test LATERAL
--
diff --git a/src/test/regress/sql/join.sql b/src/test/regress/sql/join.sql
index 2ff68879d22..2b2e0949550 100644
--- a/src/test/regress/sql/join.sql
+++ b/src/test/regress/sql/join.sql
@@ -2086,6 +2086,12 @@ select atts.relid::regclass, s.* from pg_stats s join
indexrelid from pg_index i) atts on atts.attnum = a.attnum where
schemaname != 'pg_catalog';
+-- Test bug in rangetable flattening
+explain (verbose, costs off)
+select 1 from
+ (select * from int8_tbl where q1 <> (select 42) offset 0) ss
+where false;
+
--
-- Test LATERAL
--