diff --git a/db-engine/src/main/java/com/splicemachine/db/iapi/sql/dictionary/DataDictionary.java b/db-engine/src/main/java/com/splicemachine/db/iapi/sql/dictionary/DataDictionary.java index aebe270f3bd..721be7522d3 100644 --- a/db-engine/src/main/java/com/splicemachine/db/iapi/sql/dictionary/DataDictionary.java +++ b/db-engine/src/main/java/com/splicemachine/db/iapi/sql/dictionary/DataDictionary.java @@ -39,6 +39,8 @@ import com.splicemachine.db.iapi.sql.compile.Visitable; import com.splicemachine.db.iapi.sql.conn.LanguageConnectionContext; import com.splicemachine.db.iapi.sql.depend.DependencyManager; +import com.splicemachine.db.iapi.sql.depend.Dependent; +import com.splicemachine.db.iapi.sql.depend.Provider; import com.splicemachine.db.iapi.sql.execute.ExecRow; import com.splicemachine.db.iapi.sql.execute.ExecutionFactory; import com.splicemachine.db.iapi.store.access.TransactionController; @@ -2261,7 +2263,7 @@ PermDescriptor getGenericPermissions(UUID objectUUID, void deleteSnapshot(String snapshotName, long conglomeratenumber, TransactionController tc) throws StandardException; - boolean canUseDependencyManager(); + boolean canUseDependencyManager(Dependent d, Provider p); /** * Get default roles granted to a user diff --git a/db-engine/src/main/java/com/splicemachine/db/impl/sql/depend/BasicDependencyManager.java b/db-engine/src/main/java/com/splicemachine/db/impl/sql/depend/BasicDependencyManager.java index c95fad42e7c..b445301bd4a 100644 --- a/db-engine/src/main/java/com/splicemachine/db/impl/sql/depend/BasicDependencyManager.java +++ b/db-engine/src/main/java/com/splicemachine/db/impl/sql/depend/BasicDependencyManager.java @@ -125,7 +125,7 @@ public class BasicDependencyManager implements DependencyManager { @exception StandardException thrown if something goes wrong */ public void addDependency(Dependent d, Provider p, ContextManager cm) throws StandardException { - if (dd.canUseDependencyManager()) { + if (dd.canUseDependencyManager(d, p)) { addDependency(d, p, cm, null); } } @@ -147,13 +147,25 @@ public void addDependency(Dependent d, Provider p, ContextManager cm) throws Sta */ private void addDependency(Dependent d, Provider p, ContextManager cm, TransactionController tc) throws StandardException { // Dependencies are either in-memory or stored, but not both. - if (! d.isPersistent() || ! p.isPersistent()) { + if (!isPersistentDependency(d, p)) { addInMemoryDependency(d, p, cm); } else { addStoredDependency(d, p, cm, tc); } } + /** + * Tests whether a dependency is stored in the data dictionary + * or in the in-memory dependency map. + * + * @param d the dependent + * @param p the provider + * @return true if the dependent d, is stored in the data dictionary. + */ + public static boolean isPersistentDependency(Dependent d, Provider p) { + return d.isPersistent() && p.isPersistent(); + } + /** * Adds the dependency as an in-memory dependency. * diff --git a/db-engine/src/test/java/com/splicemachine/db/impl/sql/catalog/DataDictionaryImplTest.java b/db-engine/src/test/java/com/splicemachine/db/impl/sql/catalog/DataDictionaryImplTest.java index c95aa0d5d1e..9e104943c70 100644 --- a/db-engine/src/test/java/com/splicemachine/db/impl/sql/catalog/DataDictionaryImplTest.java +++ b/db-engine/src/test/java/com/splicemachine/db/impl/sql/catalog/DataDictionaryImplTest.java @@ -33,6 +33,8 @@ import com.splicemachine.db.catalog.UUID; import com.splicemachine.db.iapi.error.StandardException; +import com.splicemachine.db.iapi.sql.depend.Dependent; +import com.splicemachine.db.iapi.sql.depend.Provider; import com.splicemachine.db.iapi.sql.dictionary.*; import com.splicemachine.db.iapi.store.access.TransactionController; import com.splicemachine.db.iapi.types.DataTypeDescriptor; @@ -100,7 +102,7 @@ public boolean canReadCache(TransactionController xactMgr) throws StandardExcept } @Override - public boolean canUseDependencyManager() { + public boolean canUseDependencyManager(Dependent d, Provider p) { return false; } diff --git a/splice_machine/src/main/java/com/splicemachine/derby/impl/sql/catalog/SpliceDataDictionary.java b/splice_machine/src/main/java/com/splicemachine/derby/impl/sql/catalog/SpliceDataDictionary.java index cf6f695f127..f760978fe4f 100644 --- a/splice_machine/src/main/java/com/splicemachine/derby/impl/sql/catalog/SpliceDataDictionary.java +++ b/splice_machine/src/main/java/com/splicemachine/derby/impl/sql/catalog/SpliceDataDictionary.java @@ -34,6 +34,8 @@ import com.splicemachine.db.iapi.services.monitor.Monitor; import com.splicemachine.db.iapi.services.sanity.SanityManager; import com.splicemachine.db.iapi.sql.conn.LanguageConnectionContext; +import com.splicemachine.db.iapi.sql.depend.Dependent; +import com.splicemachine.db.iapi.sql.depend.Provider; import com.splicemachine.db.iapi.sql.dictionary.*; import com.splicemachine.db.iapi.sql.execute.ExecRow; import com.splicemachine.db.iapi.sql.execute.ExecutionContext; @@ -74,6 +76,8 @@ import java.util.function.Function; import java.util.stream.Collectors; +import static com.splicemachine.db.impl.sql.depend.BasicDependencyManager.isPersistentDependency; + /** * @author Scott Fines * Created on: 2/28/13 @@ -955,8 +959,8 @@ public boolean canUseSPSCache() throws StandardException { } @Override - public boolean canUseDependencyManager() { - return !SpliceClient.isClient(); + public boolean canUseDependencyManager(Dependent d, Provider p) { + return !SpliceClient.isClient() || isPersistentDependency(d, p); } @Override diff --git a/splice_spark/src/test/scala/com/splicemachine/spark/splicemachine/triggers/TriggerIT.scala b/splice_spark/src/test/scala/com/splicemachine/spark/splicemachine/triggers/TriggerIT.scala index a2356597d71..44537f23aa4 100644 --- a/splice_spark/src/test/scala/com/splicemachine/spark/splicemachine/triggers/TriggerIT.scala +++ b/splice_spark/src/test/scala/com/splicemachine/spark/splicemachine/triggers/TriggerIT.scala @@ -70,8 +70,12 @@ class TriggerIT extends FunSuite with TestContext with Matchers { test("Test Insert with Trigger") { // Added for DB-10707 truncateTables createInsertTrigger + createUpdateStatementTrigger + splicemachineContext.insert( df, t1 ) + truncateTables splicemachineContext.insert( df, t1 ) dropInsertTrigger + dropUpdateStatementTrigger org.junit.Assert.assertEquals( contentOf(t1), contentOf(t2) ) } diff --git a/splice_spark2/src/test/scala/com/splicemachine/spark2/splicemachine/triggers/TriggerIT.scala b/splice_spark2/src/test/scala/com/splicemachine/spark2/splicemachine/triggers/TriggerIT.scala index b1f9480caaf..361cb151b05 100644 --- a/splice_spark2/src/test/scala/com/splicemachine/spark2/splicemachine/triggers/TriggerIT.scala +++ b/splice_spark2/src/test/scala/com/splicemachine/spark2/splicemachine/triggers/TriggerIT.scala @@ -70,8 +70,12 @@ class TriggerIT extends FunSuite with TestContext with Matchers { test("Test Insert with Trigger") { // Added for DB-10707 truncateTables createInsertTrigger + createUpdateStatementTrigger + splicemachineContext.insert( df, t1 ) + truncateTables splicemachineContext.insert( df, t1 ) dropInsertTrigger + dropUpdateStatementTrigger org.junit.Assert.assertEquals( contentOf(t1), contentOf(t2) ) }