Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit8e72239

Browse files
committed
Fix no-longer-valid shortcuts in expression_returns_set().
expression_returns_set() used to short-circuit its recursion uponseeing certain node types, such as DistinctExpr, that it knew theexecutor did not support set-valued arguments for. That was neverinherent, though, just a reflection of laziness in execQual.c.With the new implementation of SRFs there is no reason to thinkthat any scalar-valued expression node could not have a set-valuedsubexpression, except for AggRefs and WindowFuncs where we know thereis a parser check rejecting it. And indeed, the shortcut causesunexpected failures for cases such as a SRF underneath DistinctExpr,because the planner stops looking for SRFs too soon.Discussion:https://postgr.es/m/5259.1497044025@sss.pgh.pa.us
1 parenta571c7f commit8e72239

File tree

3 files changed

+10
-29
lines changed

3 files changed

+10
-29
lines changed

‎src/backend/nodes/nodeFuncs.c

Lines changed: 1 addition & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -694,39 +694,11 @@ expression_returns_set_walker(Node *node, void *context)
694694
/* else fall through to check args */
695695
}
696696

697-
/* Avoid recursion for some cases thatcan't return a set */
697+
/* Avoid recursion for some cases thatparser checks not to return a set */
698698
if (IsA(node,Aggref))
699699
return false;
700700
if (IsA(node,WindowFunc))
701701
return false;
702-
if (IsA(node,DistinctExpr))
703-
return false;
704-
if (IsA(node,NullIfExpr))
705-
return false;
706-
if (IsA(node,ScalarArrayOpExpr))
707-
return false;
708-
if (IsA(node,BoolExpr))
709-
return false;
710-
if (IsA(node,SubLink))
711-
return false;
712-
if (IsA(node,SubPlan))
713-
return false;
714-
if (IsA(node,AlternativeSubPlan))
715-
return false;
716-
if (IsA(node,ArrayExpr))
717-
return false;
718-
if (IsA(node,RowExpr))
719-
return false;
720-
if (IsA(node,RowCompareExpr))
721-
return false;
722-
if (IsA(node,CoalesceExpr))
723-
return false;
724-
if (IsA(node,MinMaxExpr))
725-
return false;
726-
if (IsA(node,SQLValueFunction))
727-
return false;
728-
if (IsA(node,XmlExpr))
729-
return false;
730702

731703
returnexpression_tree_walker(node,expression_returns_set_walker,
732704
context);

‎src/test/regress/expected/tsrf.out

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -443,6 +443,14 @@ SELECT int4mul(generate_series(1,2), 10);
443443
20
444444
(2 rows)
445445

446+
SELECT generate_series(1,3) IS DISTINCT FROM 2;
447+
?column?
448+
----------
449+
t
450+
f
451+
t
452+
(3 rows)
453+
446454
-- but SRFs in function RTEs must be at top level (annoying restriction)
447455
SELECT * FROM int4mul(generate_series(1,2), 10);
448456
ERROR: set-returning functions must appear at top level of FROM

‎src/test/regress/sql/tsrf.sql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ VALUES(1, generate_series(1,2));
9898

9999
-- We allow tSRFs that are not at top level
100100
SELECT int4mul(generate_series(1,2),10);
101+
SELECT generate_series(1,3) IS DISTINCTFROM2;
101102

102103
-- but SRFs in function RTEs must be at top level (annoying restriction)
103104
SELECT*FROM int4mul(generate_series(1,2),10);

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp