From 345b44d687d01703e0d56c4b63162924bd697d93 Mon Sep 17 00:00:00 2001 From: Pranjal Gupta Date: Wed, 16 Jul 2025 22:54:18 +0100 Subject: [PATCH 1/2] Add test to verify that temp functions are created in Txn-bound databases --- .../catalog/TransactionBoundDatabase.java | 21 +++++++++++--- .../AbstractMetadataOperationsFactory.java | 5 ++-- .../api/ddl/DdlStatementParsingTest.java | 1 + .../relational/api/ddl/IndexTest.java | 1 + .../relational/api/ddl/SqlFunctionTest.java | 1 + .../TransactionBoundDatabaseTest.java | 28 +++++++++++++++++-- 6 files changed, 49 insertions(+), 8 deletions(-) rename fdb-relational-core/src/{test/java/com/apple/foundationdb/relational/api => main/java/com/apple/foundationdb/relational/recordlayer}/ddl/AbstractMetadataOperationsFactory.java (94%) diff --git a/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/catalog/TransactionBoundDatabase.java b/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/catalog/TransactionBoundDatabase.java index ebf8651e2a..0e511c2246 100644 --- a/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/catalog/TransactionBoundDatabase.java +++ b/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/catalog/TransactionBoundDatabase.java @@ -21,20 +21,25 @@ package com.apple.foundationdb.relational.recordlayer.catalog; import com.apple.foundationdb.annotation.API; - import com.apple.foundationdb.record.provider.foundationdb.FDBRecordStoreBase; import com.apple.foundationdb.relational.api.Options; +import com.apple.foundationdb.relational.api.RelationalConnection; import com.apple.foundationdb.relational.api.Transaction; import com.apple.foundationdb.relational.api.TransactionManager; -import com.apple.foundationdb.relational.api.RelationalConnection; +import com.apple.foundationdb.relational.api.ddl.ConstantAction; +import com.apple.foundationdb.relational.api.ddl.MetadataOperationsFactory; import com.apple.foundationdb.relational.api.ddl.NoOpQueryFactory; import com.apple.foundationdb.relational.api.exceptions.ErrorCode; import com.apple.foundationdb.relational.api.exceptions.RelationalException; +import com.apple.foundationdb.relational.api.metadata.SchemaTemplate; import com.apple.foundationdb.relational.recordlayer.AbstractDatabase; import com.apple.foundationdb.relational.recordlayer.EmbeddedRelationalConnection; import com.apple.foundationdb.relational.recordlayer.HollowTransactionManager; import com.apple.foundationdb.relational.recordlayer.RecordStoreAndRecordContextTransaction; -import com.apple.foundationdb.relational.recordlayer.ddl.NoOpMetadataOperationsFactory; +import com.apple.foundationdb.relational.recordlayer.ddl.AbstractMetadataOperationsFactory; +import com.apple.foundationdb.relational.recordlayer.ddl.CreateTemporaryFunctionConstantAction; +import com.apple.foundationdb.relational.recordlayer.metadata.RecordLayerInvokedRoutine; +import com.apple.foundationdb.relational.recordlayer.query.PreparedParams; import com.apple.foundationdb.relational.recordlayer.query.cache.RelationalPlanCache; import com.apple.foundationdb.relational.recordlayer.storage.BackingRecordStore; import com.apple.foundationdb.relational.recordlayer.storage.BackingStore; @@ -62,8 +67,16 @@ public class TransactionBoundDatabase extends AbstractDatabase { @Nonnull final Options options; + private static final MetadataOperationsFactory metadataOperationsFactory = new AbstractMetadataOperationsFactory() { + @Nonnull + @Override + public ConstantAction getCreateTemporaryFunctionConstantAction(@Nonnull final SchemaTemplate template, final boolean throwIfNotExists, @Nonnull final RecordLayerInvokedRoutine invokedRoutine, @Nonnull final PreparedParams preparedParams) { + return new CreateTemporaryFunctionConstantAction(template, throwIfNotExists, invokedRoutine, preparedParams); + } + }; + public TransactionBoundDatabase(URI uri, @Nonnull Options options, @Nullable RelationalPlanCache planCache) { - super(NoOpMetadataOperationsFactory.INSTANCE, NoOpQueryFactory.INSTANCE, planCache); + super(metadataOperationsFactory, NoOpQueryFactory.INSTANCE, planCache); this.uri = uri; this.options = options; } diff --git a/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/api/ddl/AbstractMetadataOperationsFactory.java b/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/ddl/AbstractMetadataOperationsFactory.java similarity index 94% rename from fdb-relational-core/src/test/java/com/apple/foundationdb/relational/api/ddl/AbstractMetadataOperationsFactory.java rename to fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/ddl/AbstractMetadataOperationsFactory.java index 13941c64a0..e67375b01a 100644 --- a/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/api/ddl/AbstractMetadataOperationsFactory.java +++ b/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/ddl/AbstractMetadataOperationsFactory.java @@ -18,11 +18,12 @@ * limitations under the License. */ -package com.apple.foundationdb.relational.api.ddl; +package com.apple.foundationdb.relational.recordlayer.ddl; import com.apple.foundationdb.relational.api.Options; +import com.apple.foundationdb.relational.api.ddl.ConstantAction; +import com.apple.foundationdb.relational.api.ddl.MetadataOperationsFactory; import com.apple.foundationdb.relational.api.metadata.SchemaTemplate; -import com.apple.foundationdb.relational.recordlayer.ddl.NoOpMetadataOperationsFactory; import com.apple.foundationdb.relational.recordlayer.metadata.RecordLayerInvokedRoutine; import com.apple.foundationdb.relational.recordlayer.query.PreparedParams; diff --git a/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/api/ddl/DdlStatementParsingTest.java b/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/api/ddl/DdlStatementParsingTest.java index 1057a05dfd..94cbe382b3 100644 --- a/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/api/ddl/DdlStatementParsingTest.java +++ b/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/api/ddl/DdlStatementParsingTest.java @@ -32,6 +32,7 @@ import com.apple.foundationdb.relational.recordlayer.EmbeddedRelationalExtension; import com.apple.foundationdb.relational.recordlayer.RelationalConnectionRule; import com.apple.foundationdb.relational.recordlayer.Utils; +import com.apple.foundationdb.relational.recordlayer.ddl.AbstractMetadataOperationsFactory; import com.apple.foundationdb.relational.recordlayer.ddl.NoOpMetadataOperationsFactory; import com.apple.foundationdb.relational.recordlayer.metadata.RecordLayerIndex; import com.apple.foundationdb.relational.recordlayer.metadata.RecordLayerSchemaTemplate; diff --git a/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/api/ddl/IndexTest.java b/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/api/ddl/IndexTest.java index 0a0ec0d70a..60f1199d34 100644 --- a/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/api/ddl/IndexTest.java +++ b/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/api/ddl/IndexTest.java @@ -33,6 +33,7 @@ import com.apple.foundationdb.relational.recordlayer.EmbeddedRelationalExtension; import com.apple.foundationdb.relational.recordlayer.RelationalConnectionRule; import com.apple.foundationdb.relational.recordlayer.Utils; +import com.apple.foundationdb.relational.recordlayer.ddl.AbstractMetadataOperationsFactory; import com.apple.foundationdb.relational.recordlayer.metadata.RecordLayerIndex; import com.apple.foundationdb.relational.recordlayer.metadata.RecordLayerSchemaTemplate; import com.apple.foundationdb.relational.util.Assert; diff --git a/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/api/ddl/SqlFunctionTest.java b/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/api/ddl/SqlFunctionTest.java index 31516c7083..9b1aa1d020 100644 --- a/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/api/ddl/SqlFunctionTest.java +++ b/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/api/ddl/SqlFunctionTest.java @@ -26,6 +26,7 @@ import com.apple.foundationdb.relational.recordlayer.EmbeddedRelationalExtension; import com.apple.foundationdb.relational.recordlayer.RelationalConnectionRule; import com.apple.foundationdb.relational.recordlayer.Utils; +import com.apple.foundationdb.relational.recordlayer.ddl.AbstractMetadataOperationsFactory; import com.apple.foundationdb.relational.recordlayer.query.PreparedParams; import com.apple.foundationdb.relational.utils.PermutationIterator; import com.apple.foundationdb.relational.utils.SimpleDatabaseRule; diff --git a/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/recordlayer/TransactionBoundDatabaseTest.java b/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/recordlayer/TransactionBoundDatabaseTest.java index 37be9a7b8d..61ec76c645 100644 --- a/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/recordlayer/TransactionBoundDatabaseTest.java +++ b/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/recordlayer/TransactionBoundDatabaseTest.java @@ -27,16 +27,15 @@ import com.apple.foundationdb.relational.api.EmbeddedRelationalStruct; import com.apple.foundationdb.relational.api.KeySet; import com.apple.foundationdb.relational.api.Options; -import com.apple.foundationdb.relational.api.Transaction; import com.apple.foundationdb.relational.api.RelationalConnection; import com.apple.foundationdb.relational.api.RelationalResultSet; import com.apple.foundationdb.relational.api.RelationalStatement; +import com.apple.foundationdb.relational.api.Transaction; import com.apple.foundationdb.relational.api.exceptions.RelationalException; import com.apple.foundationdb.relational.api.metadata.SchemaTemplate; import com.apple.foundationdb.relational.transactionbound.TransactionBoundEmbeddedRelationalEngine; import com.apple.foundationdb.relational.utils.SimpleDatabaseRule; import com.apple.foundationdb.relational.utils.TestSchemas; - import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; @@ -137,6 +136,31 @@ var record = EmbeddedRelationalStruct.newBuilder() } } + @Test + void createFunction() throws RelationalException, SQLException { + final var embeddedConnection = connRule.getUnderlyingEmbeddedConnection(); + final var store = getStore(embeddedConnection); + final var schemaTemplate = getSchemaTemplate(embeddedConnection); + + try (FDBRecordContext context = createNewContext(embeddedConnection)) { + final var newStore = store.asBuilder().setMetaDataProvider(store.getMetaDataProvider()).setContext(context).open(); + try (Transaction transaction = new RecordStoreAndRecordContextTransaction(newStore, context, schemaTemplate)) { + EmbeddedRelationalDriver driver = new EmbeddedRelationalDriver(new TransactionBoundEmbeddedRelationalEngine()); + try (RelationalConnection conn = driver.connect(dbRule.getConnectionUri(), transaction, Options.NONE)) { + conn.setSchema("TEST_SCHEMA"); + try (RelationalStatement statement = conn.createStatement()) { + statement.executeUpdate("CREATE TEMPORARY FUNCTION REST_FUNC() ON COMMIT DROP FUNCTION AS SELECT * FROM RESTAURANT WHERE REST_NO > 1000"); + } + Assertions.assertThat(transaction.getBoundSchemaTemplateMaybe()).isPresent(); + final var routinesInBoundSchemaTemplates = transaction.getBoundSchemaTemplateMaybe().get().getInvokedRoutines(); + Assertions.assertThat(routinesInBoundSchemaTemplates) + .hasSize(1) + .anyMatch(routine -> routine.getName().equals("REST_FUNC")); + } + } + } + } + static FDBRecordStore getStore(EmbeddedRelationalConnection connection) throws RelationalException, SQLException { connection.setAutoCommit(false); connection.createNewTransaction(); From 79851818e2476d37039538c14e541cc174dc2226 Mon Sep 17 00:00:00 2001 From: Pranjal Gupta Date: Thu, 17 Jul 2025 12:04:39 +0100 Subject: [PATCH 2/2] Update fdb-relational-core/src/test/java/com/apple/foundationdb/relational/recordlayer/TransactionBoundDatabaseTest.java Co-authored-by: Youssef Hatem --- .../relational/recordlayer/TransactionBoundDatabaseTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/recordlayer/TransactionBoundDatabaseTest.java b/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/recordlayer/TransactionBoundDatabaseTest.java index 61ec76c645..701fd313da 100644 --- a/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/recordlayer/TransactionBoundDatabaseTest.java +++ b/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/recordlayer/TransactionBoundDatabaseTest.java @@ -137,7 +137,7 @@ var record = EmbeddedRelationalStruct.newBuilder() } @Test - void createFunction() throws RelationalException, SQLException { + void createTemporaryFunction() throws RelationalException, SQLException { final var embeddedConnection = connRule.getUnderlyingEmbeddedConnection(); final var store = getStore(embeddedConnection); final var schemaTemplate = getSchemaTemplate(embeddedConnection);