mirror of
https://github.com/postgres/postgres.git
synced 2025-11-26 23:43:30 +03:00
> Sean Chittenden <sean@chittenden.org> writes:
> >>::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 Conway
This commit is contained in:
47
src/test/regress/sql/plpgsql-nsp-testing.sql
Normal file
47
src/test/regress/sql/plpgsql-nsp-testing.sql
Normal file
@@ -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();
|
||||
Reference in New Issue
Block a user