Skip to content

Commit 450f900

Browse files
authored
Improve Schema retrieval performance by eliminating the use of view (#5685)
1 parent 0bbdc3c commit 450f900

File tree

1 file changed

+6
-7
lines changed

1 file changed

+6
-7
lines changed

src/Npgsql/Schema/DbColumnSchemaGenerator.cs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,12 @@ static string GenerateColumnsQuery(Version pgVersion, string columnFieldFilter)
3535
{(pgVersion.IsGreaterOrEqual(10) ? "attidentity != ''" : "FALSE")} AS isidentity,
3636
CASE WHEN typ.typtype = 'd' THEN typ.typtypmod ELSE atttypmod END AS typmod,
3737
CASE WHEN atthasdef THEN (SELECT pg_get_expr(adbin, cls.oid) FROM pg_attrdef WHERE adrelid = cls.oid AND adnum = attr.attnum) ELSE NULL END AS default,
38-
CASE WHEN col.is_updatable = 'YES' THEN true ELSE false END AS is_updatable,
38+
CASE WHEN ((cls.relkind = ANY (ARRAY['r'::""char"", 'p'::""char""]))
39+
OR ((cls.relkind = ANY (ARRAY['v'::""char"", 'f'::""char""]))
40+
AND pg_column_is_updatable((cls.oid)::regclass, attr.attnum, false)))
41+
AND attr.attidentity NOT IN ('a') THEN 'true'::boolean
42+
ELSE 'false'::boolean
43+
END AS is_updatable,
3944
EXISTS (
4045
SELECT * FROM pg_index
4146
WHERE pg_index.indrelid = cls.oid AND
@@ -53,9 +58,6 @@ FROM pg_attribute AS attr
5358
JOIN pg_type AS typ ON attr.atttypid = typ.oid
5459
JOIN pg_class AS cls ON cls.oid = attr.attrelid
5560
JOIN pg_namespace AS ns ON ns.oid = cls.relnamespace
56-
LEFT OUTER JOIN information_schema.columns AS col ON col.table_schema = nspname AND
57-
col.table_name = relname AND
58-
col.column_name = attname
5961
WHERE
6062
atttypid <> 0 AND
6163
relkind IN ('r', 'v', 'm') AND
@@ -80,9 +82,6 @@ FROM pg_attribute AS attr
8082
JOIN pg_type AS typ ON attr.atttypid = typ.oid
8183
JOIN pg_class AS cls ON cls.oid = attr.attrelid
8284
JOIN pg_namespace AS ns ON ns.oid = cls.relnamespace
83-
LEFT OUTER JOIN information_schema.columns AS col ON col.table_schema = nspname AND
84-
col.table_name = relname AND
85-
col.column_name = attname
8685
WHERE
8786
atttypid <> 0 AND
8887
relkind IN ('r', 'v', 'm') AND

0 commit comments

Comments
 (0)