@@ -1100,17 +1100,35 @@ BEGIN
11001100 * In addition to what the standard calls for, we also remove any
11011101 * columns belonging to primary keys.
11021102 */
1103- IF SERVER_VERSION < 100000 THEN
1104- generated_columns_sql := GENERATED_COLUMNS_SQL_PRE_10;
1105- ELSIF SERVER_VERSION < 120000 THEN
1106- generated_columns_sql := GENERATED_COLUMNS_SQL_PRE_12;
1107- ELSE
1108- generated_columns_sql := GENERATED_COLUMNS_SQL_CURRENT;
1103+ -- Create a cache table for generated columns if it doesn't exist for this session.
1104+ -- Using to_regclass is a clean way to check for a temp table's existence.
1105+ IF to_regclass(' __sql_saga_generated_columns_cache' ) IS NULL THEN
1106+ CREATE TEMP TABLE __sql_saga_generated_columns_cache (
1107+ table_oid oid PRIMARY KEY ,
1108+ column_names name[]
1109+ ) ON COMMIT DROP;
11091110 END IF;
11101111
1111- EXECUTE generated_columns_sql
1112- INTO generated_columns
1113- USING info .table_oid ;
1112+ -- Try to fetch from cache first
1113+ SELECT column_names INTO generated_columns FROM __sql_saga_generated_columns_cache WHERE table_oid = info .table_oid ;
1114+
1115+ IF NOT FOUND THEN
1116+ -- Not in cache, so query catalogs
1117+ IF SERVER_VERSION < 100000 THEN
1118+ generated_columns_sql := GENERATED_COLUMNS_SQL_PRE_10;
1119+ ELSIF SERVER_VERSION < 120000 THEN
1120+ generated_columns_sql := GENERATED_COLUMNS_SQL_PRE_12;
1121+ ELSE
1122+ generated_columns_sql := GENERATED_COLUMNS_SQL_CURRENT;
1123+ END IF;
1124+
1125+ EXECUTE generated_columns_sql
1126+ INTO generated_columns
1127+ USING info .table_oid ;
1128+
1129+ -- Store in cache for subsequent calls in this transaction
1130+ INSERT INTO __sql_saga_generated_columns_cache (table_oid, column_names) VALUES (info .table_oid , generated_columns);
1131+ END IF;
11141132
11151133 /* There may not be any generated columns. */
11161134 IF generated_columns IS NOT NULL THEN
0 commit comments