From b0d60ec14fd3ff46480b93009fe17e75593bb1fe Mon Sep 17 00:00:00 2001 From: Rakesh Emmadi <12475069+rakeshkky@users.noreply.github.com> Date: Thu, 10 Oct 2019 20:41:17 +0530 Subject: [PATCH] fix hdb_catalog.hdb_column view (fix #3083) (#3084) --- server/src-exec/Migrate.hs | 10 +++- server/src-rsr/initialise.sql | 8 ++-- server/src-rsr/migrate_from_24_to_25.sql | 34 ++++++++++++++ .../add_test_schema_enum_table.yaml | 47 +++++++++++++++++++ server/tests-py/test_v1_queries.py | 3 ++ 5 files changed, 97 insertions(+), 5 deletions(-) create mode 100644 server/src-rsr/migrate_from_24_to_25.sql create mode 100644 server/tests-py/queries/v1/set_table_is_enum/add_test_schema_enum_table.yaml diff --git a/server/src-exec/Migrate.hs b/server/src-exec/Migrate.hs index 4032c123..12622762 100644 --- a/server/src-exec/Migrate.hs +++ b/server/src-exec/Migrate.hs @@ -19,7 +19,7 @@ import qualified Data.Yaml.TH as Y import qualified Database.PG.Query as Q curCatalogVer :: T.Text -curCatalogVer = "24" +curCatalogVer = "25" migrateMetadata :: ( MonadTx m @@ -373,6 +373,13 @@ from23To24 = ALTER TABLE hdb_catalog.hdb_table ADD COLUMN configuration JSONB NOT NULL DEFAULT '{}'::jsonb; |] + +from24To25 :: MonadTx m => m () +from24To25 = do + Q.Discard () <- liftTx $ Q.multiQE defaultTxErrorHandler + $(Q.sqlFromFile "src-rsr/migrate_from_24_to_25.sql") + pure () + migrateCatalog :: ( MonadTx m , CacheRWM m @@ -418,6 +425,7 @@ migrateCatalog migrationTime = migrateFrom =<< getCatalogVersion , ("21", from21To22) , ("22", from22To23) , ("23", from23To24) + , ("24", from24To25) ] postMigrate = do diff --git a/server/src-rsr/initialise.sql b/server/src-rsr/initialise.sql index d87956d4..e0a5faaf 100644 --- a/server/src-rsr/initialise.sql +++ b/server/src-rsr/initialise.sql @@ -450,13 +450,13 @@ CREATE VIEW hdb_catalog.hdb_column AS , coalesce(pkey_refs.ref_tables, '[]') AS primary_key_references , col_description(pg_class.oid, columns.ordinal_position) AS description FROM information_schema.columns +JOIN pg_class ON pg_class.relname = columns.table_name +JOIN pg_namespace ON pg_namespace.oid = pg_class.relnamespace + AND pg_namespace.nspname = columns.table_schema LEFT JOIN primary_key_references AS pkey_refs ON columns.table_schema = pkey_refs.src_table_schema AND columns.table_name = pkey_refs.src_table_name - AND columns.column_name = pkey_refs.src_column_name -LEFT JOIN pg_class ON pg_class.relname = columns.table_name -LEFT JOIN pg_namespace ON pg_namespace.oid = pg_class.relnamespace - AND pg_namespace.nspname = columns.table_schema; + AND columns.column_name = pkey_refs.src_column_name; CREATE VIEW hdb_catalog.hdb_table_info_agg AS ( select diff --git a/server/src-rsr/migrate_from_24_to_25.sql b/server/src-rsr/migrate_from_24_to_25.sql new file mode 100644 index 00000000..28a16fbd --- /dev/null +++ b/server/src-rsr/migrate_from_24_to_25.sql @@ -0,0 +1,34 @@ +CREATE OR REPLACE VIEW hdb_catalog.hdb_column AS + WITH primary_key_references AS ( + SELECT fkey.table_schema AS src_table_schema + , fkey.table_name AS src_table_name + , fkey.columns->>0 AS src_column_name + , json_agg(json_build_object( + 'schema', fkey.ref_table_table_schema, + 'name', fkey.ref_table + )) AS ref_tables + FROM hdb_catalog.hdb_foreign_key_constraint AS fkey + JOIN hdb_catalog.hdb_primary_key AS pkey + ON pkey.table_schema = fkey.ref_table_table_schema + AND pkey.table_name = fkey.ref_table + AND pkey.columns::jsonb = fkey.ref_columns::jsonb + WHERE json_array_length(fkey.columns) = 1 + GROUP BY fkey.table_schema + , fkey.table_name + , fkey.columns->>0) + SELECT columns.table_schema + , columns.table_name + , columns.column_name AS name + , columns.udt_name AS type + , columns.is_nullable + , columns.ordinal_position + , coalesce(pkey_refs.ref_tables, '[]') AS primary_key_references + , col_description(pg_class.oid, columns.ordinal_position) AS description +FROM information_schema.columns +JOIN pg_class ON pg_class.relname = columns.table_name +JOIN pg_namespace ON pg_namespace.oid = pg_class.relnamespace + AND pg_namespace.nspname = columns.table_schema +LEFT JOIN primary_key_references AS pkey_refs + ON columns.table_schema = pkey_refs.src_table_schema + AND columns.table_name = pkey_refs.src_table_name + AND columns.column_name = pkey_refs.src_column_name; diff --git a/server/tests-py/queries/v1/set_table_is_enum/add_test_schema_enum_table.yaml b/server/tests-py/queries/v1/set_table_is_enum/add_test_schema_enum_table.yaml new file mode 100644 index 00000000..60eeaad4 --- /dev/null +++ b/server/tests-py/queries/v1/set_table_is_enum/add_test_schema_enum_table.yaml @@ -0,0 +1,47 @@ +- description: Create new schema and table for enum + url: /v1/query + status: 200 + response: + result_type: CommandOk + result: null + query: + type: run_sql + args: + sql: | + CREATE SCHEMA IF NOT EXISTS test; + CREATE TABLE test.colors + ( value text PRIMARY KEY + , comment text ); + INSERT INTO test.colors (value, comment) VALUES + ('red', '#FF0000'), + ('green', '#00FF00'), + ('blue', '#0000FF'), + ('orange', '#FFFF00'), + ('yellow', '#00FFFF'), + ('purple', '#FF00FF'); + +- description: Track table as enum + url: /v1/query + status: 200 + response: + message: success + query: + type: track_table + args: + table: + schema: test + name: colors + is_enum: true + +- description: Drop schema + url: /v1/query + status: 200 + response: + result_type: CommandOk + result: null + query: + type: run_sql + args: + sql: | + DROP SCHEMA test CASCADE; + cascade: true diff --git a/server/tests-py/test_v1_queries.py b/server/tests-py/test_v1_queries.py index ccb9e0ec..7a73c047 100644 --- a/server/tests-py/test_v1_queries.py +++ b/server/tests-py/test_v1_queries.py @@ -636,6 +636,9 @@ class TestSetTableIsEnum(DefaultTestQueries): def test_add_invalid(self, hge_ctx): check_query_f(hge_ctx, self.dir() + '/add_invalid.yaml') + def test_add_test_schema_enum_table(self, hge_ctx): + check_query_f(hge_ctx, self.dir() + '/add_test_schema_enum_table.yaml') + class TestSetTableCustomFields(DefaultTestQueries): @classmethod def dir(cls):