-
Notifications
You must be signed in to change notification settings - Fork 175
Support %rowtype and %type #862
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -363,7 +363,7 @@ SELECT | |
| ELSE 'PROCEDURE' | ||
| END::VARCHAR2(12) AS TYPE, | ||
| GENERATE_SERIES(1::INTEGER, SYS._ORA_SRC_COUNT(P.OID))::NUMBER AS LINE, | ||
| UNNEST(STRING_TO_ARRAY(P.PROSRC, CHR(10)))::VARCHAR2(4000) AS TEXT, | ||
| UNNEST(STRING_TO_ARRAY(substring(pg_get_functiondef(P.OID), length('CREATE OR REPLACE ') + 1), CHR(10)))::VARCHAR2(4000) AS TEXT, | ||
| 0::VARCHAR2(256) AS ORIGIN_CON_ID | ||
| FROM | ||
| PG_PROC AS P | ||
|
|
@@ -392,7 +392,7 @@ SELECT | |
| ELSE 'PROCEDURE' | ||
| END::VARCHAR2(12) AS TYPE, | ||
| GENERATE_SERIES(1::INTEGER, SYS._ORA_SRC_COUNT(P.OID))::NUMBER AS LINE, | ||
| UNNEST(STRING_TO_ARRAY(P.PROSRC, CHR(10)))::VARCHAR2(4000) AS TEXT, | ||
| UNNEST(STRING_TO_ARRAY(substring(pg_get_functiondef(P.OID), length('CREATE OR REPLACE ') + 1), CHR(10)))::VARCHAR2(4000) AS TEXT, | ||
| 0::VARCHAR2(256) AS ORIGIN_CON_ID | ||
|
Comment on lines
394
to
396
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion USER_SOURCE has the same LINE/TEXT mismatch. Mirror the fix used in ALL_SOURCE/DBA_SOURCE so LINE and TEXT derive from the same definition text. - GENERATE_SERIES(1::INTEGER, SYS._ORA_SRC_COUNT(P.OID))::NUMBER AS LINE,
- UNNEST(STRING_TO_ARRAY(substring(pg_get_functiondef(P.OID), length('CREATE OR REPLACE ') + 1), CHR(10)))::VARCHAR2(4000) AS TEXT,
+ GENERATE_SERIES(1::INTEGER, SYS._ORA_SRC_COUNT(P.OID))::NUMBER AS LINE,
+ UNNEST(STRING_TO_ARRAY(substring(pg_get_functiondef(P.OID), length('CREATE OR REPLACE ') + 1), CHR(10)))::VARCHAR2(4000) AS TEXT,(After applying the prior _ORA_SRC_COUNT change, this view will stay consistent.)
🤖 Prompt for AI Agents |
||
| FROM | ||
| PG_PROC AS P | ||
|
|
@@ -461,6 +461,9 @@ SELECT | |
| END::NUMBER AS SEQUENCE, | ||
| 0::NUMBER AS DATA_LEVEL, | ||
| CASE | ||
| WHEN ARG.TYPE_OBJECT_TYPE::VARCHAR2 = 'table' OR ARG.TYPE_OBJECT_TYPE::VARCHAR2 = 'TABLE' | ||
| OR ARG.TYPE_OBJECT_TYPE::VARCHAR2 = 'view' OR ARG.TYPE_OBJECT_TYPE::VARCHAR2 = 'VIEW' | ||
| THEN 'PL/SQL RECORD' | ||
| WHEN T.TYPNAME = ANY(ARRAY['int2', 'int4', 'int8', | ||
| 'numeric', 'number']) | ||
| THEN 'NUMBER' | ||
|
|
@@ -487,6 +490,8 @@ SELECT | |
| ELSE NULL | ||
| END::VARCHAR2(9) AS IN_OUT, | ||
| CASE | ||
| WHEN ARG.DATA_LENGTH IS NOT NULL | ||
| THEN ARG.DATA_LENGTH | ||
| WHEN T.TYPNAME = ANY(ARRAY['int2', 'int4', 'int8', | ||
| 'float4', 'float8', | ||
| 'numeric', 'number']) | ||
|
|
@@ -496,6 +501,8 @@ SELECT | |
| ELSE NULL | ||
| END::NUMBER AS DATA_LENGTH, | ||
| CASE | ||
| WHEN ARG.DATA_PRECISION IS NOT NULL | ||
| THEN ARG.DATA_PRECISION | ||
| WHEN T.TYPNAME = ANY(ARRAY['int2', 'int4', 'int8']) | ||
| THEN 38 | ||
| WHEN T.TYPNAME = 'float4' | ||
|
|
@@ -509,6 +516,8 @@ SELECT | |
| ELSE NULL | ||
| END::NUMBER AS DATA_PRECISION, | ||
| CASE | ||
| WHEN ARG.DATA_SCALE IS NOT NULL | ||
| THEN ARG.DATA_SCALE | ||
| WHEN T.TYPNAME = ANY(ARRAY['float4', 'float8']) | ||
| THEN -127 | ||
| ELSE NULL | ||
|
|
@@ -531,12 +540,29 @@ SELECT | |
| THEN 'NCHAR_CS' | ||
| END::VARCHAR2(44) AS CHARACTER_SET_NAME, | ||
| NULL::VARCHAR2(128) AS TYPE_OWNER, | ||
| NULL::VARCHAR2(128) AS TYPE_NAME, | ||
| NULL::VARCHAR2(128) AS TYPE_SUBNAME, | ||
| CASE | ||
| WHEN ARG.TYPE_NAME != '_NULL_' | ||
| THEN SYS.ORA_CASE_TRANS(ARG.TYPE_NAME::VARCHAR2)::VARCHAR2(128) | ||
| ELSE | ||
| NULL | ||
| END::VARCHAR2(128) AS TYPE_NAME, | ||
| CASE | ||
| WHEN ARG.TYPE_SUBNAME != '_NULL_' | ||
| THEN SYS.ORA_CASE_TRANS(ARG.TYPE_SUBNAME::VARCHAR2)::VARCHAR2(128) | ||
| ELSE | ||
| NULL | ||
| END::VARCHAR2(128) AS TYPE_SUBNAME, | ||
| NULL::VARCHAR2(128) AS TYPE_LINK, | ||
| NULL::VARCHAR2(128) AS TYPE_OBJECT_TYPE, | ||
| CASE | ||
| WHEN T.TYPTYPE = 'b' | ||
| WHEN ARG.TYPE_OBJECT_TYPE != '_NULL_' | ||
| THEN SYS.ORA_CASE_TRANS(ARG.TYPE_OBJECT_TYPE::VARCHAR2)::VARCHAR2(128) | ||
| ELSE | ||
| NULL | ||
| END::VARCHAR2(128) AS TYPE_OBJECT_TYPE, | ||
|
Comment on lines
+543
to
+561
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Avoid sentinel string 'NULL' in TYPE_ columns; use NULLIF for cleaner SQL.* Sentinel comparison with "!= 'NULL'" is brittle and NULL-unsafe. Prefer NULLIF and a single expression. - CASE
- WHEN ARG.TYPE_NAME != '_NULL_'
- THEN SYS.ORA_CASE_TRANS(ARG.TYPE_NAME::VARCHAR2)::VARCHAR2(128)
- ELSE
- NULL
- END::VARCHAR2(128) AS TYPE_NAME,
+ SYS.ORA_CASE_TRANS(NULLIF(ARG.TYPE_NAME, '_NULL_')::VARCHAR2)::VARCHAR2(128) AS TYPE_NAME,
- CASE
- WHEN ARG.TYPE_SUBNAME != '_NULL_'
- THEN SYS.ORA_CASE_TRANS(ARG.TYPE_SUBNAME::VARCHAR2)::VARCHAR2(128)
- ELSE
- NULL
- END::VARCHAR2(128) AS TYPE_SUBNAME,
+ SYS.ORA_CASE_TRANS(NULLIF(ARG.TYPE_SUBNAME, '_NULL_')::VARCHAR2)::VARCHAR2(128) AS TYPE_SUBNAME,
- CASE
- WHEN ARG.TYPE_OBJECT_TYPE != '_NULL_'
- THEN SYS.ORA_CASE_TRANS(ARG.TYPE_OBJECT_TYPE::VARCHAR2)::VARCHAR2(128)
- ELSE
- NULL
- END::VARCHAR2(128) AS TYPE_OBJECT_TYPE,
+ SYS.ORA_CASE_TRANS(NULLIF(ARG.TYPE_OBJECT_TYPE, '_NULL_')::VARCHAR2)::VARCHAR2(128) AS TYPE_OBJECT_TYPE,If possible, also switch the SRF to emit NULL instead of 'NULL'. Also applies to: 557-561, 563-565 |
||
| CASE | ||
| WHEN (T.TYPTYPE = 'b' OR T.TYPTYPE = 'c') AND ARG.PLS_TYPE IS NOT NULL | ||
| THEN SYS.ORA_CASE_TRANS(ARG.PLS_TYPE) | ||
| WHEN T.TYPTYPE = 'b' AND ARG.PLS_TYPE IS NULL | ||
| THEN SYS.ORA_CASE_TRANS(T.OID::REGTYPE::VARCHAR2) | ||
| WHEN T.TYPTYPE = 'd' AND T.TYPNAME = 'raw' | ||
| THEN 'RAW' | ||
|
|
@@ -597,6 +623,21 @@ FROM | |
| PG_PROC | ||
| ) AS SQ | ||
| ON P.OID = SQ.OID | ||
| LEFT JOIN | ||
| ( | ||
| SELECT | ||
| OID, | ||
| POSITION, | ||
| TYPE_NAME, | ||
| TYPE_SUBNAME, | ||
| TYPE_OBJECT_TYPE, | ||
| DATA_LENGTH, | ||
| DATA_PRECISION, | ||
| DATA_SCALE, | ||
| PLS_TYPE | ||
| FROM | ||
| pg_get_function_arg_reference_typerowtype() | ||
| ) AS ARG ON ARG.OID = SQ.OID AND ARG.POSITION = SQ.POSITION | ||
| LEFT JOIN PG_TYPE AS T | ||
| ON SQ.DATA_TYPE = T.OID | ||
| LEFT JOIN PG_TRIGGER AS TR | ||
|
|
@@ -635,6 +676,9 @@ SELECT | |
| END::NUMBER AS SEQUENCE, | ||
| 0::NUMBER AS DATA_LEVEL, | ||
| CASE | ||
| WHEN ARG.TYPE_OBJECT_TYPE::VARCHAR2 = 'table' OR ARG.TYPE_OBJECT_TYPE::VARCHAR2 = 'TABLE' | ||
| OR ARG.TYPE_OBJECT_TYPE::VARCHAR2 = 'view' OR ARG.TYPE_OBJECT_TYPE::VARCHAR2 = 'VIEW' | ||
| THEN 'PL/SQL RECORD' | ||
| WHEN T.TYPNAME = ANY(ARRAY['int2', 'int4', 'int8', | ||
| 'numeric', 'number']) | ||
| THEN 'NUMBER' | ||
|
|
@@ -661,6 +705,8 @@ SELECT | |
| ELSE NULL | ||
| END::VARCHAR2(9) AS IN_OUT, | ||
| CASE | ||
| WHEN ARG.DATA_LENGTH IS NOT NULL | ||
| THEN ARG.DATA_LENGTH | ||
| WHEN T.TYPNAME = ANY(ARRAY['int2', 'int4', 'int8', | ||
| 'float4', 'float8', | ||
| 'numeric', 'number']) | ||
|
|
@@ -670,6 +716,8 @@ SELECT | |
| ELSE NULL | ||
| END::NUMBER AS DATA_LENGTH, | ||
| CASE | ||
| WHEN ARG.DATA_PRECISION IS NOT NULL | ||
| THEN ARG.DATA_PRECISION | ||
| WHEN T.TYPNAME = ANY(ARRAY['int2', 'int4', 'int8']) | ||
| THEN 38 | ||
| WHEN T.TYPNAME = 'float4' | ||
|
|
@@ -683,6 +731,8 @@ SELECT | |
| ELSE NULL | ||
| END::NUMBER AS DATA_PRECISION, | ||
| CASE | ||
| WHEN ARG.DATA_SCALE IS NOT NULL | ||
| THEN ARG.DATA_SCALE | ||
| WHEN T.TYPNAME = ANY(ARRAY['float4', 'float8']) | ||
| THEN -127 | ||
| ELSE NULL | ||
|
|
@@ -705,12 +755,29 @@ SELECT | |
| THEN 'NCHAR_CS' | ||
| END::VARCHAR2(44) AS CHARACTER_SET_NAME, | ||
| NULL::VARCHAR2(128) AS TYPE_OWNER, | ||
| NULL::VARCHAR2(128) AS TYPE_NAME, | ||
| NULL::VARCHAR2(128) AS TYPE_SUBNAME, | ||
| CASE | ||
| WHEN ARG.TYPE_NAME != '_NULL_' | ||
| THEN SYS.ORA_CASE_TRANS(ARG.TYPE_NAME::VARCHAR2)::VARCHAR2(128) | ||
| ELSE | ||
| NULL | ||
| END::VARCHAR2(128) AS TYPE_NAME, | ||
| CASE | ||
| WHEN ARG.TYPE_SUBNAME != '_NULL_' | ||
| THEN SYS.ORA_CASE_TRANS(ARG.TYPE_SUBNAME::VARCHAR2)::VARCHAR2(128) | ||
| ELSE | ||
| NULL | ||
| END::VARCHAR2(128) AS TYPE_SUBNAME, | ||
| NULL::VARCHAR2(128) AS TYPE_LINK, | ||
| NULL::VARCHAR2(128) AS TYPE_OBJECT_TYPE, | ||
| CASE | ||
| WHEN T.TYPTYPE = 'b' | ||
| WHEN ARG.TYPE_OBJECT_TYPE != '_NULL_' | ||
| THEN SYS.ORA_CASE_TRANS(ARG.TYPE_OBJECT_TYPE::VARCHAR2)::VARCHAR2(128) | ||
| ELSE | ||
| NULL | ||
| END::VARCHAR2(128) AS TYPE_OBJECT_TYPE, | ||
| CASE | ||
| WHEN (T.TYPTYPE = 'b' OR T.TYPTYPE = 'c') AND ARG.PLS_TYPE IS NOT NULL | ||
| THEN SYS.ORA_CASE_TRANS(ARG.PLS_TYPE) | ||
| WHEN T.TYPTYPE = 'b' AND ARG.PLS_TYPE IS NULL | ||
| THEN SYS.ORA_CASE_TRANS(T.OID::REGTYPE::VARCHAR2) | ||
| WHEN T.TYPTYPE = 'd' AND T.TYPNAME = 'raw' | ||
| THEN 'RAW' | ||
|
|
@@ -771,6 +838,21 @@ FROM | |
| PG_PROC | ||
| ) AS SQ | ||
| ON P.OID = SQ.OID | ||
| LEFT JOIN | ||
| ( | ||
| SELECT | ||
| OID, | ||
| POSITION, | ||
| TYPE_NAME, | ||
| TYPE_SUBNAME, | ||
| TYPE_OBJECT_TYPE, | ||
| DATA_LENGTH, | ||
| DATA_PRECISION, | ||
| DATA_SCALE, | ||
| PLS_TYPE | ||
| FROM | ||
| pg_get_function_arg_reference_typerowtype() | ||
| ) AS ARG ON ARG.OID = SQ.OID AND ARG.POSITION = SQ.POSITION | ||
| LEFT JOIN PG_TYPE AS T | ||
| ON SQ.DATA_TYPE = T.OID | ||
| LEFT JOIN PG_TRIGGER AS TR | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Fix LINE/TEXT mismatch in ALL_SOURCE (uses pg_get_functiondef for TEXT but PROSRC for LINE).
LINE is derived from SYS._ORA_SRC_COUNT(P.OID) which counts PROSRC lines, while TEXT now comes from pg_get_functiondef(...). This misaligns rows. Align both by switching DBA_SOURCE/ALL_SOURCE/USER_SOURCE to the same source and updating SYS._ORA_SRC_COUNT accordingly.
Apply these diffs:
Also update USER_SOURCE to match (see comment below).
🤖 Prompt for AI Agents