mirror of https://github.com/postgres/postgres
> >>::sigh:: Is it me or does it look like all >>of pl/pgsql is schema un-aware (ie, all of the declarations). -sc > > > Yeah. The group of routines parse_word, parse_dblword, etc that are > called by the lexer certainly all need work. There are some > definitional issues to think about, too --- plpgsql presently relies on > the number of names to give it some idea of what to look for, and those > rules are probably all toast now. Please come up with a sketch of what > you think the behavior should be before you start hacking code. Attached is a diff -c format proposal to fix this. I've also attached a short test script. Seems to work OK and passes all regression tests. Here's a breakdown of how I understand plpgsql's "Special word rules" -- I think it illustrates the behavior reasonably well. New functions added by this patch are plpgsql_parse_tripwordtype and plpgsql_parse_dblwordrowtype: Joe ConwayREL7_3_STABLE
parent
81186865fe
commit
b3f52320f6
@ -0,0 +1,47 @@ |
||||
-- nspname.relname.attname%TYPE |
||||
DROP FUNCTION t(); |
||||
CREATE OR REPLACE FUNCTION t() RETURNS TEXT AS ' |
||||
DECLARE |
||||
col_name pg_catalog.pg_attribute.attname%TYPE; |
||||
BEGIN |
||||
col_name := ''uga''; |
||||
RETURN col_name; |
||||
END; |
||||
' LANGUAGE 'plpgsql'; |
||||
SELECT t(); |
||||
|
||||
-- nspname.relname%ROWTYPE |
||||
DROP FUNCTION t(); |
||||
CREATE OR REPLACE FUNCTION t() RETURNS pg_catalog.pg_attribute AS ' |
||||
DECLARE |
||||
rec pg_catalog.pg_attribute%ROWTYPE; |
||||
BEGIN |
||||
SELECT INTO rec * FROM pg_catalog.pg_attribute WHERE attrelid = 1247 AND attname = ''typname''; |
||||
RETURN rec; |
||||
END; |
||||
' LANGUAGE 'plpgsql'; |
||||
SELECT * FROM t(); |
||||
|
||||
-- nspname.relname.attname%TYPE |
||||
DROP FUNCTION t(); |
||||
CREATE OR REPLACE FUNCTION t() RETURNS pg_catalog.pg_attribute.attname%TYPE AS ' |
||||
DECLARE |
||||
rec pg_catalog.pg_attribute.attname%TYPE; |
||||
BEGIN |
||||
SELECT INTO rec pg_catalog.pg_attribute.attname FROM pg_catalog.pg_attribute WHERE attrelid = 1247 AND attname = ''typname''; |
||||
RETURN rec; |
||||
END; |
||||
' LANGUAGE 'plpgsql'; |
||||
SELECT t(); |
||||
|
||||
-- nspname.relname%ROWTYPE |
||||
DROP FUNCTION t(); |
||||
CREATE OR REPLACE FUNCTION t() RETURNS pg_catalog.pg_attribute AS ' |
||||
DECLARE |
||||
rec pg_catalog.pg_attribute%ROWTYPE; |
||||
BEGIN |
||||
SELECT INTO rec * FROM pg_catalog.pg_attribute WHERE attrelid = 1247 AND attname = ''typname''; |
||||
RETURN rec; |
||||
END; |
||||
' LANGUAGE 'plpgsql'; |
||||
SELECT * FROM t(); |
||||
Loading…
Reference in new issue