Skip to content

Commit 0def257

Browse files
committed
Fix *-qualification of named parameters in SQL-language functions.
Given a composite-type parameter named x, "$1.*" worked fine, but "x.*" not so much. This has been broken since named parameter references were added in commit 9bff078, so patch back to 9.2. Per bug #9085 from Hardy Falk.
1 parent 80353f3 commit 0def257

File tree

3 files changed

+83
-0
lines changed

3 files changed

+83
-0
lines changed

src/backend/executor/functions.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,13 +310,21 @@ sql_fn_post_column_ref(ParseState *pstate, ColumnRef *cref, Node *var)
310310
* (the first possibility takes precedence)
311311
* A.B.C A = function name, B = record-typed parameter name,
312312
* C = field name
313+
* A.* Whole-row reference to composite parameter A.
314+
* A.B.* Same, with A = function name, B = parameter name
315+
*
316+
* Here, it's sufficient to ignore the "*" in the last two cases --- the
317+
* main parser will take care of expanding the whole-row reference.
313318
*----------
314319
*/
315320
nnames = list_length(cref->fields);
316321

317322
if (nnames > 3)
318323
return NULL;
319324

325+
if (IsA(llast(cref->fields), A_Star))
326+
nnames--;
327+
320328
field1 = (Node *) linitial(cref->fields);
321329
Assert(IsA(field1, String));
322330
name1 = strVal(field1);

src/test/regress/expected/rowtypes.out

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -381,6 +381,53 @@ select * from price;
381381
(3 rows)
382382

383383
rollback;
384+
--
385+
-- Test case derived from bug #9085: check * qualification of composite
386+
-- parameters for SQL functions
387+
--
388+
create temp table compos (f1 int, f2 text);
389+
create function fcompos1(v compos) returns void as $$
390+
insert into compos values (v); -- fail
391+
$$ language sql;
392+
ERROR: column "f1" is of type integer but expression is of type compos
393+
LINE 2: insert into compos values (v); -- fail
394+
^
395+
HINT: You will need to rewrite or cast the expression.
396+
create function fcompos1(v compos) returns void as $$
397+
insert into compos values (v.*);
398+
$$ language sql;
399+
create function fcompos2(v compos) returns void as $$
400+
select fcompos1(v);
401+
$$ language sql;
402+
create function fcompos3(v compos) returns void as $$
403+
select fcompos1(fcompos3.v.*);
404+
$$ language sql;
405+
select fcompos1(row(1,'one'));
406+
fcompos1
407+
----------
408+
409+
(1 row)
410+
411+
select fcompos2(row(2,'two'));
412+
fcompos2
413+
----------
414+
415+
(1 row)
416+
417+
select fcompos3(row(3,'three'));
418+
fcompos3
419+
----------
420+
421+
(1 row)
422+
423+
select * from compos;
424+
f1 | f2
425+
----+-------
426+
1 | one
427+
2 | two
428+
3 | three
429+
(3 rows)
430+
384431
--
385432
-- We allow I/O conversion casts from composite types to strings to be
386433
-- invoked via cast syntax, but not functional syntax. This is because

src/test/regress/sql/rowtypes.sql

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,34 @@ select * from price;
185185

186186
rollback;
187187

188+
--
189+
-- Test case derived from bug #9085: check * qualification of composite
190+
-- parameters for SQL functions
191+
--
192+
193+
create temp table compos (f1 int, f2 text);
194+
195+
create function fcompos1(v compos) returns void as $$
196+
insert into compos values (v); -- fail
197+
$$ language sql;
198+
199+
create function fcompos1(v compos) returns void as $$
200+
insert into compos values (v.*);
201+
$$ language sql;
202+
203+
create function fcompos2(v compos) returns void as $$
204+
select fcompos1(v);
205+
$$ language sql;
206+
207+
create function fcompos3(v compos) returns void as $$
208+
select fcompos1(fcompos3.v.*);
209+
$$ language sql;
210+
211+
select fcompos1(row(1,'one'));
212+
select fcompos2(row(2,'two'));
213+
select fcompos3(row(3,'three'));
214+
select * from compos;
215+
188216
--
189217
-- We allow I/O conversion casts from composite types to strings to be
190218
-- invoked via cast syntax, but not functional syntax. This is because

0 commit comments

Comments
 (0)