Commit 19e065c0 authored by Fujii Masao's avatar Fujii Masao

Ensure variables live across calls in generate_series(numeric, numeric).

In generate_series_step_numeric(), the variables "start_num"
and "stop_num" may be potentially freed until the next call.
So they should be put in the location which can survive across calls.
But previously they were not, and which could cause incorrect
behavior of generate_series(numeric, numeric). This commit fixes
this problem by copying them on multi_call_memory_ctx.

Andrew Gierth
parent ccf292cd
...@@ -1325,11 +1325,16 @@ generate_series_step_numeric(PG_FUNCTION_ARGS) ...@@ -1325,11 +1325,16 @@ generate_series_step_numeric(PG_FUNCTION_ARGS)
/* /*
* Use fctx to keep state from call to call. Seed current with the * Use fctx to keep state from call to call. Seed current with the
* original start value. * original start value. We must copy the start_num and stop_num
* values rather than pointing to them, since we may have detoasted
* them in the per-call context.
*/ */
init_var_from_num(start_num, &fctx->current); init_var(&fctx->current);
init_var_from_num(stop_num, &fctx->stop); init_var(&fctx->stop);
init_var(&fctx->step); init_var(&fctx->step);
set_var_from_num(start_num, &fctx->current);
set_var_from_num(stop_num, &fctx->stop);
set_var_from_var(&steploc, &fctx->step); set_var_from_var(&steploc, &fctx->step);
funcctx->user_fctx = fctx; funcctx->user_fctx = fctx;
......
...@@ -1461,3 +1461,41 @@ select (i / (10::numeric ^ 131071))::numeric(1,0) ...@@ -1461,3 +1461,41 @@ select (i / (10::numeric ^ 131071))::numeric(1,0)
9 9
(4 rows) (4 rows)
-- Check usage with variables
select * from generate_series(1::numeric, 3::numeric) i, generate_series(i,3) j;
i | j
---+---
1 | 1
1 | 2
1 | 3
2 | 2
2 | 3
3 | 3
(6 rows)
select * from generate_series(1::numeric, 3::numeric) i, generate_series(1,i) j;
i | j
---+---
1 | 1
2 | 1
2 | 2
3 | 1
3 | 2
3 | 3
(6 rows)
select * from generate_series(1::numeric, 3::numeric) i, generate_series(1,5,i) j;
i | j
---+---
1 | 1
1 | 2
1 | 3
1 | 4
1 | 5
2 | 1
2 | 3
2 | 5
3 | 1
3 | 4
(10 rows)
...@@ -854,3 +854,7 @@ select (i / (10::numeric ^ 131071))::numeric(1,0) ...@@ -854,3 +854,7 @@ select (i / (10::numeric ^ 131071))::numeric(1,0)
from generate_series(6 * (10::numeric ^ 131071), from generate_series(6 * (10::numeric ^ 131071),
9 * (10::numeric ^ 131071), 9 * (10::numeric ^ 131071),
10::numeric ^ 131071) as a(i); 10::numeric ^ 131071) as a(i);
-- Check usage with variables
select * from generate_series(1::numeric, 3::numeric) i, generate_series(i,3) j;
select * from generate_series(1::numeric, 3::numeric) i, generate_series(1,i) j;
select * from generate_series(1::numeric, 3::numeric) i, generate_series(1,5,i) j;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment