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

Commit0def257

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 wereadded in commit9bff078, so patch backto 9.2. Per bug #9085 from Hardy Falk.
1 parent80353f3 commit0def257

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.CA = 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
returnNULL;
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 (f1int, f2text);
194+
195+
createfunctionfcompos1(v compos) returns voidas $$
196+
insert into composvalues (v);-- fail
197+
$$ language sql;
198+
199+
createfunctionfcompos1(v compos) returns voidas $$
200+
insert into composvalues (v.*);
201+
$$ language sql;
202+
203+
createfunctionfcompos2(v compos) returns voidas $$
204+
select fcompos1(v);
205+
$$ language sql;
206+
207+
createfunctionfcompos3(v compos) returns voidas $$
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)

[8]ページ先頭

©2009-2025 Movatter.jp