Skip to content

Commit 5f00885

Browse files
g31pranjalhatyo
andauthored
Add test to verify that temp functions are created in TxnBound database (#3488)
This PR replaces the `NoOpMetadataOperationsFactory` passed in `TransactionBoundSchemaTemplate` with an implementation of `MetadataOperationsFactory` that supports `getCreateFunctionConstantAction` in the same way as it is supported by the `RecordLayerMetadataOperationsFactory`. Also adds the test to verify that the TEMPORARY FUNCTION is actually available in the txn-bound schema template in the case when the `Transaction` is externally provided to the connection. fixes #3489 --------- Co-authored-by: Youssef Hatem <y_hatem@apple.com>
1 parent 32d0c95 commit 5f00885

File tree

6 files changed

+49
-8
lines changed

6 files changed

+49
-8
lines changed

fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/catalog/TransactionBoundDatabase.java

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,20 +21,25 @@
2121
package com.apple.foundationdb.relational.recordlayer.catalog;
2222

2323
import com.apple.foundationdb.annotation.API;
24-
2524
import com.apple.foundationdb.record.provider.foundationdb.FDBRecordStoreBase;
2625
import com.apple.foundationdb.relational.api.Options;
26+
import com.apple.foundationdb.relational.api.RelationalConnection;
2727
import com.apple.foundationdb.relational.api.Transaction;
2828
import com.apple.foundationdb.relational.api.TransactionManager;
29-
import com.apple.foundationdb.relational.api.RelationalConnection;
29+
import com.apple.foundationdb.relational.api.ddl.ConstantAction;
30+
import com.apple.foundationdb.relational.api.ddl.MetadataOperationsFactory;
3031
import com.apple.foundationdb.relational.api.ddl.NoOpQueryFactory;
3132
import com.apple.foundationdb.relational.api.exceptions.ErrorCode;
3233
import com.apple.foundationdb.relational.api.exceptions.RelationalException;
34+
import com.apple.foundationdb.relational.api.metadata.SchemaTemplate;
3335
import com.apple.foundationdb.relational.recordlayer.AbstractDatabase;
3436
import com.apple.foundationdb.relational.recordlayer.EmbeddedRelationalConnection;
3537
import com.apple.foundationdb.relational.recordlayer.HollowTransactionManager;
3638
import com.apple.foundationdb.relational.recordlayer.RecordStoreAndRecordContextTransaction;
37-
import com.apple.foundationdb.relational.recordlayer.ddl.NoOpMetadataOperationsFactory;
39+
import com.apple.foundationdb.relational.recordlayer.ddl.AbstractMetadataOperationsFactory;
40+
import com.apple.foundationdb.relational.recordlayer.ddl.CreateTemporaryFunctionConstantAction;
41+
import com.apple.foundationdb.relational.recordlayer.metadata.RecordLayerInvokedRoutine;
42+
import com.apple.foundationdb.relational.recordlayer.query.PreparedParams;
3843
import com.apple.foundationdb.relational.recordlayer.query.cache.RelationalPlanCache;
3944
import com.apple.foundationdb.relational.recordlayer.storage.BackingRecordStore;
4045
import com.apple.foundationdb.relational.recordlayer.storage.BackingStore;
@@ -62,8 +67,16 @@ public class TransactionBoundDatabase extends AbstractDatabase {
6267
@Nonnull
6368
final Options options;
6469

70+
private static final MetadataOperationsFactory metadataOperationsFactory = new AbstractMetadataOperationsFactory() {
71+
@Nonnull
72+
@Override
73+
public ConstantAction getCreateTemporaryFunctionConstantAction(@Nonnull final SchemaTemplate template, final boolean throwIfNotExists, @Nonnull final RecordLayerInvokedRoutine invokedRoutine, @Nonnull final PreparedParams preparedParams) {
74+
return new CreateTemporaryFunctionConstantAction(template, throwIfNotExists, invokedRoutine, preparedParams);
75+
}
76+
};
77+
6578
public TransactionBoundDatabase(URI uri, @Nonnull Options options, @Nullable RelationalPlanCache planCache) {
66-
super(NoOpMetadataOperationsFactory.INSTANCE, NoOpQueryFactory.INSTANCE, planCache);
79+
super(metadataOperationsFactory, NoOpQueryFactory.INSTANCE, planCache);
6780
this.uri = uri;
6881
this.options = options;
6982
}
Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,12 @@
1818
* limitations under the License.
1919
*/
2020

21-
package com.apple.foundationdb.relational.api.ddl;
21+
package com.apple.foundationdb.relational.recordlayer.ddl;
2222

2323
import com.apple.foundationdb.relational.api.Options;
24+
import com.apple.foundationdb.relational.api.ddl.ConstantAction;
25+
import com.apple.foundationdb.relational.api.ddl.MetadataOperationsFactory;
2426
import com.apple.foundationdb.relational.api.metadata.SchemaTemplate;
25-
import com.apple.foundationdb.relational.recordlayer.ddl.NoOpMetadataOperationsFactory;
2627
import com.apple.foundationdb.relational.recordlayer.metadata.RecordLayerInvokedRoutine;
2728
import com.apple.foundationdb.relational.recordlayer.query.PreparedParams;
2829

fdb-relational-core/src/test/java/com/apple/foundationdb/relational/api/ddl/DdlStatementParsingTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import com.apple.foundationdb.relational.recordlayer.EmbeddedRelationalExtension;
3333
import com.apple.foundationdb.relational.recordlayer.RelationalConnectionRule;
3434
import com.apple.foundationdb.relational.recordlayer.Utils;
35+
import com.apple.foundationdb.relational.recordlayer.ddl.AbstractMetadataOperationsFactory;
3536
import com.apple.foundationdb.relational.recordlayer.ddl.NoOpMetadataOperationsFactory;
3637
import com.apple.foundationdb.relational.recordlayer.metadata.RecordLayerIndex;
3738
import com.apple.foundationdb.relational.recordlayer.metadata.RecordLayerSchemaTemplate;

fdb-relational-core/src/test/java/com/apple/foundationdb/relational/api/ddl/IndexTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import com.apple.foundationdb.relational.recordlayer.EmbeddedRelationalExtension;
3434
import com.apple.foundationdb.relational.recordlayer.RelationalConnectionRule;
3535
import com.apple.foundationdb.relational.recordlayer.Utils;
36+
import com.apple.foundationdb.relational.recordlayer.ddl.AbstractMetadataOperationsFactory;
3637
import com.apple.foundationdb.relational.recordlayer.metadata.RecordLayerIndex;
3738
import com.apple.foundationdb.relational.recordlayer.metadata.RecordLayerSchemaTemplate;
3839
import com.apple.foundationdb.relational.util.Assert;

fdb-relational-core/src/test/java/com/apple/foundationdb/relational/api/ddl/SqlFunctionTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import com.apple.foundationdb.relational.recordlayer.EmbeddedRelationalExtension;
2727
import com.apple.foundationdb.relational.recordlayer.RelationalConnectionRule;
2828
import com.apple.foundationdb.relational.recordlayer.Utils;
29+
import com.apple.foundationdb.relational.recordlayer.ddl.AbstractMetadataOperationsFactory;
2930
import com.apple.foundationdb.relational.recordlayer.query.PreparedParams;
3031
import com.apple.foundationdb.relational.utils.PermutationIterator;
3132
import com.apple.foundationdb.relational.utils.SimpleDatabaseRule;

fdb-relational-core/src/test/java/com/apple/foundationdb/relational/recordlayer/TransactionBoundDatabaseTest.java

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,15 @@
2727
import com.apple.foundationdb.relational.api.EmbeddedRelationalStruct;
2828
import com.apple.foundationdb.relational.api.KeySet;
2929
import com.apple.foundationdb.relational.api.Options;
30-
import com.apple.foundationdb.relational.api.Transaction;
3130
import com.apple.foundationdb.relational.api.RelationalConnection;
3231
import com.apple.foundationdb.relational.api.RelationalResultSet;
3332
import com.apple.foundationdb.relational.api.RelationalStatement;
33+
import com.apple.foundationdb.relational.api.Transaction;
3434
import com.apple.foundationdb.relational.api.exceptions.RelationalException;
3535
import com.apple.foundationdb.relational.api.metadata.SchemaTemplate;
3636
import com.apple.foundationdb.relational.transactionbound.TransactionBoundEmbeddedRelationalEngine;
3737
import com.apple.foundationdb.relational.utils.SimpleDatabaseRule;
3838
import com.apple.foundationdb.relational.utils.TestSchemas;
39-
4039
import org.assertj.core.api.Assertions;
4140
import org.junit.jupiter.api.Order;
4241
import org.junit.jupiter.api.Test;
@@ -137,6 +136,31 @@ var record = EmbeddedRelationalStruct.newBuilder()
137136
}
138137
}
139138

139+
@Test
140+
void createTemporaryFunction() throws RelationalException, SQLException {
141+
final var embeddedConnection = connRule.getUnderlyingEmbeddedConnection();
142+
final var store = getStore(embeddedConnection);
143+
final var schemaTemplate = getSchemaTemplate(embeddedConnection);
144+
145+
try (FDBRecordContext context = createNewContext(embeddedConnection)) {
146+
final var newStore = store.asBuilder().setMetaDataProvider(store.getMetaDataProvider()).setContext(context).open();
147+
try (Transaction transaction = new RecordStoreAndRecordContextTransaction(newStore, context, schemaTemplate)) {
148+
EmbeddedRelationalDriver driver = new EmbeddedRelationalDriver(new TransactionBoundEmbeddedRelationalEngine());
149+
try (RelationalConnection conn = driver.connect(dbRule.getConnectionUri(), transaction, Options.NONE)) {
150+
conn.setSchema("TEST_SCHEMA");
151+
try (RelationalStatement statement = conn.createStatement()) {
152+
statement.executeUpdate("CREATE TEMPORARY FUNCTION REST_FUNC() ON COMMIT DROP FUNCTION AS SELECT * FROM RESTAURANT WHERE REST_NO > 1000");
153+
}
154+
Assertions.assertThat(transaction.getBoundSchemaTemplateMaybe()).isPresent();
155+
final var routinesInBoundSchemaTemplates = transaction.getBoundSchemaTemplateMaybe().get().getInvokedRoutines();
156+
Assertions.assertThat(routinesInBoundSchemaTemplates)
157+
.hasSize(1)
158+
.anyMatch(routine -> routine.getName().equals("REST_FUNC"));
159+
}
160+
}
161+
}
162+
}
163+
140164
static FDBRecordStore getStore(EmbeddedRelationalConnection connection) throws RelationalException, SQLException {
141165
connection.setAutoCommit(false);
142166
connection.createNewTransaction();

0 commit comments

Comments
 (0)