#include "executor/executor.h"
#include "executor/nodeValuesscan.h"
+#include "utils/expandeddatum.h"
static TupleTableSlot *ValuesNext(ValuesScanState *node);
List *exprstatelist;
Datum *values;
bool *isnull;
+ Form_pg_attribute *att;
ListCell *lc;
int resind;
*/
values = slot->tts_values;
isnull = slot->tts_isnull;
+ att = slot->tts_tupleDescriptor->attrs;
resind = 0;
foreach(lc, exprstatelist)
econtext,
&isnull[resind],
NULL);
+
+ /*
+ * We must force any R/W expanded datums to read-only state, in
+ * case they are multiply referenced in the plan node's output
+ * expressions, or in case we skip the output projection and the
+ * output column is multiply referenced in higher plan nodes.
+ */
+ values[resind] = MakeExpandedObjectReadOnly(values[resind],
+ isnull[resind],
+ att[resind]->attlen);
+
resind++;
}
1 | {1,1}
(1 row)
+explain (verbose, costs off)
+select consumes_rw_array(a), a from returns_rw_array(1) a;
+ QUERY PLAN
+--------------------------------------------
+ Function Scan on public.returns_rw_array a
+ Output: consumes_rw_array(a), a
+ Function Call: returns_rw_array(1)
+(3 rows)
+
+select consumes_rw_array(a), a from returns_rw_array(1) a;
+ consumes_rw_array | a
+-------------------+-------
+ 1 | {1,1}
+(1 row)
+
+explain (verbose, costs off)
+select consumes_rw_array(a), a from
+ (values (returns_rw_array(1)), (returns_rw_array(2))) v(a);
+ QUERY PLAN
+---------------------------------------------------------------------
+ Values Scan on "*VALUES*"
+ Output: consumes_rw_array("*VALUES*".column1), "*VALUES*".column1
+(2 rows)
+
+select consumes_rw_array(a), a from
+ (values (returns_rw_array(1)), (returns_rw_array(2))) v(a);
+ consumes_rw_array | a
+-------------------+-------
+ 1 | {1,1}
+ 2 | {2,2}
+(2 rows)
+
--
-- Test access to call stack
--
(select returns_rw_array(1) as a offset 0) ss,
lateral consumes_rw_array(a) i;
+explain (verbose, costs off)
+select consumes_rw_array(a), a from returns_rw_array(1) a;
+
+select consumes_rw_array(a), a from returns_rw_array(1) a;
+
+explain (verbose, costs off)
+select consumes_rw_array(a), a from
+ (values (returns_rw_array(1)), (returns_rw_array(2))) v(a);
+
+select consumes_rw_array(a), a from
+ (values (returns_rw_array(1)), (returns_rw_array(2))) v(a);
+
--
-- Test access to call stack