diff --git a/src/hive_fork_manager/table_schema_verification.sql b/src/hive_fork_manager/table_schema_verification.sql index 49a44c8fed28adceec6f4b4612b2c42ab302b583..8e4fd80ba01dafd789ad52bdc4b32c3cb4ca6111 100644 --- a/src/hive_fork_manager/table_schema_verification.sql +++ b/src/hive_fork_manager/table_schema_verification.sql @@ -117,9 +117,9 @@ $BODY$ BEGIN RETURN QUERY SELECT - sp.* as provider - , hive.calculate_state_provider_hash(sp.*) as hash - FROM unnest(enum_range(NULL::hafd.state_providers)) as sp; + DISTINCT sp.state_provider as provider + , hive.calculate_state_provider_hash(sp.state_provider) as hash + FROM hafd.state_providers_registered sp; END; $BODY$; @@ -188,7 +188,10 @@ BEGIN SELECT string_agg(provider || hash, ' | ') FROM hive.calculate_state_provider_hashes() INTO _provider_hashes; - _tmp = _tmp || _provider_hashes; + IF _provider_hashes IS NOT NULL THEN + _tmp = _tmp || _provider_hashes; + END IF; + INSERT INTO hafd.table_schema VALUES (schema_name, MD5(_tmp)::uuid); ts.schema_name := schema_name; diff --git a/tests/integration/functional/hive_fork_manager/CMakeLists.txt b/tests/integration/functional/hive_fork_manager/CMakeLists.txt index 61172366d10b22e5e221b71bf6d8aecb0b414e06..3a0ad82b84086d105de66421c049f706a07ec85f 100644 --- a/tests/integration/functional/hive_fork_manager/CMakeLists.txt +++ b/tests/integration/functional/hive_fork_manager/CMakeLists.txt @@ -328,6 +328,7 @@ ADD_TEST( NAME test_update_script ADD_SQL_FUNCTIONAL_TEST( state_providers/import_state_provider_negative_non_context_owner_create_table.sql ) ADD_SQL_FUNCTIONAL_TEST( state_providers/switch_state_provider_to_forkable.sql ) ADD_SQL_FUNCTIONAL_TEST( state_providers/hash.sql ) + ADD_SQL_FUNCTIONAL_TEST( state_providers/no_hash.sql ) ADD_SQL_FUNCTIONAL_TEST( authorization/alice_access_to_bob_negative.sql ) ADD_SQL_FUNCTIONAL_TEST( authorization/alice_access_events_infrustructure.sql ) diff --git a/tests/integration/functional/hive_fork_manager/state_providers/hash.sql b/tests/integration/functional/hive_fork_manager/state_providers/hash.sql index f1622a7e2ce2060986b07b36ee3f31ade1c4f575..778a7017dc56f39026ee363ac68b4ddd35925b2c 100644 --- a/tests/integration/functional/hive_fork_manager/state_providers/hash.sql +++ b/tests/integration/functional/hive_fork_manager/state_providers/hash.sql @@ -1,3 +1,19 @@ +CREATE OR REPLACE PROCEDURE haf_admin_test_given() + LANGUAGE 'plpgsql' +AS +$BODY$ +BEGIN + CREATE SCHEMA A; + PERFORM hive.app_create_context( _name => 'context', _schema => 'a' ); + PERFORM hive.app_create_context( _name => 'context2', _schema => 'a' ); + + PERFORM hive.app_state_provider_import( 'ACCOUNTS', 'context' ); + PERFORM hive.app_state_provider_import( 'KEYAUTH', 'context' ); + PERFORM hive.app_state_provider_import( 'METADATA', 'context' ); + PERFORM hive.app_state_provider_import( 'ACCOUNTS','context2' ); +END; +$BODY$; + CREATE OR REPLACE PROCEDURE haf_admin_test_then() diff --git a/tests/integration/functional/hive_fork_manager/state_providers/no_hash.sql b/tests/integration/functional/hive_fork_manager/state_providers/no_hash.sql new file mode 100644 index 0000000000000000000000000000000000000000..7e7855bf972e9dbcbc166349e4e4888e33ddd28e --- /dev/null +++ b/tests/integration/functional/hive_fork_manager/state_providers/no_hash.sql @@ -0,0 +1,42 @@ +-- check if there is no registered state_provider, then hash is not computed + + +CREATE OR REPLACE PROCEDURE haf_admin_test_then() + LANGUAGE 'plpgsql' +AS +$BODY$ +DECLARE + __database_hash_before TEXT; + __database_hash_after TEXT; +BEGIN + ASSERT ( SELECT 1 FROM hive.calculate_state_provider_hashes() WHERE provider = 'ACCOUNTS' ) IS NULL + , 'ACCOUNTS hashed'; + + ASSERT ( SELECT 1 FROM hive.calculate_state_provider_hashes() WHERE provider = 'KEYAUTH' ) IS NULL + , 'KEYAUTH hashed'; + + ASSERT ( SELECT 1 FROM hive.calculate_state_provider_hashes() WHERE provider = 'METADATA' ) IS NULL + , 'METADATA hashed'; + + ASSERT ( SELECT COUNT(*) FROM hive.calculate_state_provider_hashes() ) = 0 + , 'More than 0 known providers are hashed'; + + SELECT schema_hash FROM hive.create_database_hash('hafd') INTO __database_hash_before; + + EXECUTE format( 'CREATE OR REPLACE FUNCTION hive.start_provider_keyauth( _context hafd.context_name ) + RETURNS TEXT[] + LANGUAGE plpgsql + VOLATILE + AS + $$ + BEGIN + RETURN ''''; + END; + $$ + ;'); + + SELECT schema_hash FROM hive.create_database_hash('hafd') INTO __database_hash_after; + + ASSERT __database_hash_after = __database_hash_before, 'Unused state provider has impact on database hash'; +END; +$BODY$; \ No newline at end of file diff --git a/tests/integration/functional/hive_fork_manager/test_table_schema.sh b/tests/integration/functional/hive_fork_manager/test_table_schema.sh index 25ded4a2a00944fcada13b762ef5028d2b3942dd..9b3cec17a5ef6633fd43c8ca24e943362a1608b1 100755 --- a/tests/integration/functional/hive_fork_manager/test_table_schema.sh +++ b/tests/integration/functional/hive_fork_manager/test_table_schema.sh @@ -114,6 +114,11 @@ test_extension_update_when_state_provider_changed() { echo echo "Making a change in keyauth state provider by change definition of hive.start_provider_keyauth" + sudo -Enu "$DB_ADMIN" psql -w $POSTGRES_ACCESS -d "$DB_NAME" -v ON_ERROR_STOP=on -U "$DB_ADMIN" \ + -c "CREATE SCHEMA A; + SELECT hive.app_create_context( _name => 'context', _schema => 'a' ); + SELECT hive.app_state_provider_import( 'KEYAUTH', 'context' );" + # change definition of a state provider sudo -Enu "$DB_ADMIN" psql -w $POSTGRES_ACCESS -d "$DB_NAME" -v ON_ERROR_STOP=on -U "$DB_ADMIN" \ -c "CREATE OR REPLACE FUNCTION hive.start_provider_keyauth( _context hafd.context_name )