File tree 2 files changed +56
-1
lines changed
logictest/testdata/logic_test 2 files changed +56
-1
lines changed Original file line number Diff line number Diff line change @@ -6,3 +6,47 @@ PREPARE p AS SELECT $1::INT
6
6
7
7
statement error pgcode 0A000 cannot evaluate function in this context
8
8
EXECUTE p(f())
9
+
10
+ statement ok
11
+ DEALLOCATE p;
12
+
13
+ # Ensure that stable folding does not affect plans stored in the plan cache.
14
+ subtest regression_147186
15
+
16
+ statement ok
17
+ CREATE FUNCTION f147186() RETURNS INT LANGUAGE SQL AS $$ SELECT CAST(current_setting('foo.bar') AS INT) $$;
18
+
19
+ statement ok
20
+ CREATE TABLE t147186 (a INT, b INT DEFAULT f147186());
21
+
22
+ statement ok
23
+ PREPARE p AS INSERT INTO t147186 (a) VALUES ($1);
24
+
25
+ statement ok
26
+ SET foo.bar = '100';
27
+
28
+ statement ok
29
+ EXECUTE p(1);
30
+
31
+ query II rowsort
32
+ SELECT a, b FROM t147186;
33
+ ----
34
+ 1 100
35
+
36
+ statement ok
37
+ SET foo.bar = '200';
38
+
39
+ statement ok
40
+ EXECUTE p(2);
41
+
42
+ # The second row should reflect the custom var change.
43
+ query II rowsort
44
+ SELECT a, b FROM t147186;
45
+ ----
46
+ 1 100
47
+ 2 200
48
+
49
+ statement ok
50
+ DEALLOCATE p;
51
+
52
+ subtest end
Original file line number Diff line number Diff line change @@ -386,9 +386,20 @@ func (f *Factory) AssignPlaceholders(from *memo.Memo) (err error) {
386
386
}
387
387
recursiveRoutines [t .Def ] = struct {}{}
388
388
}
389
+ // Copy the arguments, if any.
390
+ var newArgs memo.ScalarListExpr
391
+ if t .Args != nil {
392
+ copiedArgs := f .CopyAndReplaceDefault (& t .Args , replaceFn ).(* memo.ScalarListExpr )
393
+ newArgs = * copiedArgs
394
+ }
395
+ // Make sure to copy the slice that stores the body statements, rather
396
+ // than mutating the original.
397
+ newDef := * t .Def
398
+ newDef .Body = make ([]memo.RelExpr , len (t .Def .Body ))
389
399
for i := range t .Def .Body {
390
- t . Def .Body [i ] = f .CopyAndReplaceDefault (t .Def .Body [i ], replaceFn ).(memo.RelExpr )
400
+ newDef .Body [i ] = f .CopyAndReplaceDefault (t .Def .Body [i ], replaceFn ).(memo.RelExpr )
391
401
}
402
+ return f .ConstructUDFCall (newArgs , & memo.UDFCallPrivate {Def : & newDef })
392
403
case * memo.RecursiveCTEExpr :
393
404
// A recursive CTE may have the stats change on its Initial expression
394
405
// after placeholder assignment, if that happens we need to
You can’t perform that action at this time.
0 commit comments