From 4dcaf8d2a1f75059b21abf0249df644338c4d78d Mon Sep 17 00:00:00 2001
From: Marcin Ickiewicz <mickiewicz@syncad.com>
Date: Tue, 14 Jan 2025 10:59:15 +0100
Subject: [PATCH] correctly exlude all shadow tables from hash computation

previously only state providers shadow tables were excluded, what cause
problems when haf with installed context with registered tables was
updated.
---
 src/hive_fork_manager/context_rewind/names.sql | 14 +++++++++++++-
 src/hive_fork_manager/update.sql               |  5 +++--
 2 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/src/hive_fork_manager/context_rewind/names.sql b/src/hive_fork_manager/context_rewind/names.sql
index 9ca6371a5..44fb7bbce 100644
--- a/src/hive_fork_manager/context_rewind/names.sql
+++ b/src/hive_fork_manager/context_rewind/names.sql
@@ -17,6 +17,18 @@ END;
 $BODY$
 ;
 
+CREATE OR REPLACE FUNCTION hive.get_shadow_table_name_prefix()
+    RETURNS TEXT
+    LANGUAGE 'plpgsql'
+    IMMUTABLE
+AS
+$BODY$
+BEGIN
+    RETURN  'shadow_';
+END;
+$BODY$
+;
+
 CREATE OR REPLACE FUNCTION hive.get_shadow_table_name( _table_schema TEXT,  _table_name TEXT )
     RETURNS TEXT
     LANGUAGE 'plpgsql'
@@ -25,7 +37,7 @@ AS
 $BODY$
 BEGIN
     RETURN  hive.validate_name(
-        'shadow_' || lower(_table_schema) || '_' || lower(_table_name)
+            hive.get_shadow_table_name_prefix() || lower(_table_schema) || '_' || lower(_table_name)
         , _table_name );
 END;
 $BODY$
diff --git a/src/hive_fork_manager/update.sql b/src/hive_fork_manager/update.sql
index 40842d021..713946a37 100644
--- a/src/hive_fork_manager/update.sql
+++ b/src/hive_fork_manager/update.sql
@@ -328,11 +328,12 @@ BEGIN
 
     RETURN QUERY SELECT (hive_update.calculate_table_schema_hash( 'hafd', ist.table_name)).*
     FROM information_schema.tables ist
+    LEFT JOIN hafd.registered_tables hrt ON ist.table_name ILIKE hrt.shadow_table_name
     LEFT JOIN hafd.state_providers_registered spr ON ist.table_name ILIKE ANY( spr.tables )
     WHERE ist.table_schema = 'hafd'
     AND ist.table_type = 'BASE TABLE'
-    AND spr.tables IS NULL
-    AND ist.table_name NOT ILIKE 'shadow_hafd_%'; -- shadow tables, only possible for state providers
+    AND hrt.shadow_table_name IS NULL -- is not a shadow table
+    AND spr.tables IS NULL; -- is not a state provider table
 END;
 $BODY$
 ;
-- 
GitLab