From 3fd513d2f476f2bd364fd4feb734d99abc46c04c Mon Sep 17 00:00:00 2001 From: Maksim Timonin Date: Thu, 30 Jan 2025 12:46:10 +0300 Subject: [PATCH 1/4] IGNITE-24348 Provide custom FrameworkConfig to SQL views --- .../query/calcite/schema/IgniteSchema.java | 6 ++++-- .../query/calcite/schema/SchemaHolderImpl.java | 6 +++++- .../query/calcite/schema/ViewTableMacroImpl.java | 9 +++++++-- .../OperatorsExtensionIntegrationTest.java | 12 ++++++++++++ .../query/calcite/planner/AbstractPlannerTest.java | 2 +- 5 files changed, 29 insertions(+), 6 deletions(-) diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/schema/IgniteSchema.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/schema/IgniteSchema.java index ef81dc008fd72..2e032f66067ff 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/schema/IgniteSchema.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/schema/IgniteSchema.java @@ -27,6 +27,7 @@ import org.apache.calcite.schema.SchemaPlus; import org.apache.calcite.schema.Table; import org.apache.calcite.schema.impl.AbstractSchema; +import org.apache.calcite.tools.FrameworkConfig; /** * Ignite schema. @@ -111,12 +112,13 @@ public void removeView(String name) { * Registers current {@code IgniteSchema} in parent {@code SchemaPlus}. * * @param parent Parent schema. + * @param frameworkCfg Framework config. * @return Registered schema. */ - public SchemaPlus register(SchemaPlus parent) { + public SchemaPlus register(SchemaPlus parent, FrameworkConfig frameworkCfg) { SchemaPlus newSchema = parent.add(schemaName, this); - viewMap.forEach((name, sql) -> newSchema.add(name, new ViewTableMacroImpl(sql, newSchema))); + viewMap.forEach((name, sql) -> newSchema.add(name, new ViewTableMacroImpl(sql, newSchema, frameworkCfg))); return newSchema; } diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/schema/SchemaHolderImpl.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/schema/SchemaHolderImpl.java index a3d78d68fd04e..84c2dbeb15682 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/schema/SchemaHolderImpl.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/schema/SchemaHolderImpl.java @@ -27,6 +27,7 @@ import org.apache.calcite.rel.RelCollations; import org.apache.calcite.rel.RelFieldCollation; import org.apache.calcite.schema.SchemaPlus; +import org.apache.calcite.tools.FrameworkConfig; import org.apache.calcite.tools.Frameworks; import org.apache.calcite.util.ImmutableBitSet; import org.apache.calcite.util.mapping.Mappings; @@ -41,6 +42,7 @@ import org.apache.ignite.internal.processors.query.GridQueryTypeDescriptor; import org.apache.ignite.internal.processors.query.QueryField; import org.apache.ignite.internal.processors.query.QueryUtils; +import org.apache.ignite.internal.processors.query.calcite.CalciteQueryProcessor; import org.apache.ignite.internal.processors.query.calcite.exec.exp.IgniteScalarFunction; import org.apache.ignite.internal.processors.query.calcite.trait.TraitUtils; import org.apache.ignite.internal.processors.query.calcite.type.IgniteTypeFactory; @@ -411,8 +413,10 @@ private void rebuild() { newCalciteSchema.add("OTHER", typeFactory -> ((IgniteTypeFactory)typeFactory).createCustomType(Object.class)); newCalciteSchema.add(QueryUtils.DFLT_SCHEMA, new IgniteSchema(QueryUtils.DFLT_SCHEMA)); + FrameworkConfig frameworkCfg = Commons.lookupComponent(ctx, CalciteQueryProcessor.class).frameworkConfig(); + for (IgniteSchema schema : igniteSchemas.values()) - schema.register(newCalciteSchema); + schema.register(newCalciteSchema, frameworkCfg); calciteSchema = newCalciteSchema; } diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/schema/ViewTableMacroImpl.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/schema/ViewTableMacroImpl.java index c9f837ddb58c7..73fc1dfdaf2c7 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/schema/ViewTableMacroImpl.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/schema/ViewTableMacroImpl.java @@ -30,6 +30,7 @@ import org.apache.calcite.schema.TableMacro; import org.apache.calcite.schema.TranslatableTable; import org.apache.calcite.sql.SqlNode; +import org.apache.calcite.tools.FrameworkConfig; import org.apache.ignite.internal.processors.cache.query.IgniteQueryErrorCode; import org.apache.ignite.internal.processors.query.IgniteSQLException; import org.apache.ignite.internal.processors.query.calcite.prepare.BaseQueryContext; @@ -51,10 +52,14 @@ public class ViewTableMacroImpl implements TableMacro { /** */ private final SchemaPlus schema; + /* **/ + private final FrameworkConfig frameworkCfg; + /** Ctor. */ - public ViewTableMacroImpl(String viewSql, SchemaPlus schema) { + public ViewTableMacroImpl(String viewSql, SchemaPlus schema, FrameworkConfig frameworkCfg) { this.viewSql = viewSql; this.schema = schema; + this.frameworkCfg = frameworkCfg; } /** {@inheritDoc} */ @@ -65,7 +70,7 @@ public ViewTableMacroImpl(String viewSql, SchemaPlus schema) { try { IgnitePlanner planner = PlanningContext.builder() - .parentContext(BaseQueryContext.builder().defaultSchema(schema).build()) + .parentContext(BaseQueryContext.builder().frameworkConfig(frameworkCfg).defaultSchema(schema).build()) .build() .planner(); diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/OperatorsExtensionIntegrationTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/OperatorsExtensionIntegrationTest.java index d2513ad9f3b6b..d21fc66e0dc87 100644 --- a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/OperatorsExtensionIntegrationTest.java +++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/OperatorsExtensionIntegrationTest.java @@ -121,6 +121,18 @@ public void test() throws Exception { .returns(Timestamp.valueOf("2021-01-01 00:00:00")).check(); } + /** */ + @Test + public void testOperatorsCallsInViews() { + sql("create table my_table(id int primary key, val_str varchar)"); + + sql("insert into my_table values (?, ?)", 0, Integer.toString(0)); + + sql("create or replace view my_view as select to_number(val_str) val_str from my_table"); + + assertQuery("SELECT val_str from my_view").returns(new BigDecimal("0")).check(); + } + /** Rewrites LTRIM with 2 parameters. */ public static SqlCall rewriteLtrim(SqlValidator validator, SqlCall call) { if (call.operandCount() != 2) diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/AbstractPlannerTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/AbstractPlannerTest.java index 95a8c3454e45c..89413a7425427 100644 --- a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/AbstractPlannerTest.java +++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/AbstractPlannerTest.java @@ -682,7 +682,7 @@ protected BaseQueryContext baseQueryContext(Collection schemas) { SchemaPlus dfltSchema = null; for (IgniteSchema igniteSchema : schemas) { - SchemaPlus schema = igniteSchema.register(rootSchema); + SchemaPlus schema = igniteSchema.register(rootSchema, null); if (dfltSchema == null || DEFAULT_SCHEMA.equals(schema.getName())) dfltSchema = schema; From 7059275623100c360634a77c410518fbdf5421fe Mon Sep 17 00:00:00 2001 From: Maksim Timonin Date: Thu, 30 Jan 2025 12:51:27 +0300 Subject: [PATCH 2/4] Fix checkstyle --- .../processors/query/calcite/schema/ViewTableMacroImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/schema/ViewTableMacroImpl.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/schema/ViewTableMacroImpl.java index 73fc1dfdaf2c7..40d9b311529fd 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/schema/ViewTableMacroImpl.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/schema/ViewTableMacroImpl.java @@ -52,7 +52,7 @@ public class ViewTableMacroImpl implements TableMacro { /** */ private final SchemaPlus schema; - /* **/ + /** */ private final FrameworkConfig frameworkCfg; /** Ctor. */ From cd656351b1ad8beb0c6171091c13c6b80a03a38f Mon Sep 17 00:00:00 2001 From: Maksim Timonin Date: Thu, 30 Jan 2025 17:23:57 +0300 Subject: [PATCH 3/4] Fix comments --- .../processors/query/calcite/CalciteQueryProcessor.java | 8 ++++---- .../query/calcite/schema/SchemaHolderImpl.java | 9 +++++---- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/CalciteQueryProcessor.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/CalciteQueryProcessor.java index 83f1c7e7418f2..f060d32c01197 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/CalciteQueryProcessor.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/CalciteQueryProcessor.java @@ -259,8 +259,11 @@ public class CalciteQueryProcessor extends GridProcessorAdapter implements Query public CalciteQueryProcessor(GridKernalContext ctx) { super(ctx); + FrameworkConfig customFrameworkCfg = ctx.plugins().createComponent(FrameworkConfig.class); + frameworkCfg = customFrameworkCfg != null ? customFrameworkCfg : FRAMEWORK_CONFIG; + failureProcessor = ctx.failure(); - schemaHolder = new SchemaHolderImpl(ctx); + schemaHolder = new SchemaHolderImpl(ctx, frameworkCfg); qryPlanCache = new QueryPlanCacheImpl(ctx); parserMetrics = new QueryParserMetricsHolder(ctx.metric()); mailboxRegistry = new MailboxRegistryImpl(ctx); @@ -277,9 +280,6 @@ public CalciteQueryProcessor(GridKernalContext ctx) { qryReg = new QueryRegistryImpl(ctx); injectSvc = new InjectResourcesService(ctx); - FrameworkConfig customFrameworkCfg = ctx.plugins().createComponent(FrameworkConfig.class); - frameworkCfg = customFrameworkCfg != null ? customFrameworkCfg : FRAMEWORK_CONFIG; - QueryEngineConfiguration[] qryEnginesCfg = ctx.config().getSqlConfiguration().getQueryEnginesConfiguration(); if (F.isEmpty(qryEnginesCfg)) diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/schema/SchemaHolderImpl.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/schema/SchemaHolderImpl.java index 84c2dbeb15682..0333753024aba 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/schema/SchemaHolderImpl.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/schema/SchemaHolderImpl.java @@ -42,7 +42,6 @@ import org.apache.ignite.internal.processors.query.GridQueryTypeDescriptor; import org.apache.ignite.internal.processors.query.QueryField; import org.apache.ignite.internal.processors.query.QueryUtils; -import org.apache.ignite.internal.processors.query.calcite.CalciteQueryProcessor; import org.apache.ignite.internal.processors.query.calcite.exec.exp.IgniteScalarFunction; import org.apache.ignite.internal.processors.query.calcite.trait.TraitUtils; import org.apache.ignite.internal.processors.query.calcite.type.IgniteTypeFactory; @@ -70,6 +69,9 @@ public class SchemaHolderImpl extends AbstractService implements SchemaHolder, S /** */ private GridInternalSubscriptionProcessor subscriptionProcessor; + /** */ + private FrameworkConfig frameworkCfg; + /** */ private volatile SchemaPlus calciteSchema; @@ -138,10 +140,11 @@ public AffinityIdentity(AffinityFunction aff, int backups, IgnitePredicate ((IgniteTypeFactory)typeFactory).createCustomType(Object.class)); newCalciteSchema.add(QueryUtils.DFLT_SCHEMA, new IgniteSchema(QueryUtils.DFLT_SCHEMA)); - FrameworkConfig frameworkCfg = Commons.lookupComponent(ctx, CalciteQueryProcessor.class).frameworkConfig(); - for (IgniteSchema schema : igniteSchemas.values()) schema.register(newCalciteSchema, frameworkCfg); From d372f579fea9e19722168eefddeee25cfab2bab1 Mon Sep 17 00:00:00 2001 From: Maksim Timonin Date: Thu, 30 Jan 2025 17:31:11 +0300 Subject: [PATCH 4/4] Fix --- .../processors/query/calcite/schema/SchemaHolderImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/schema/SchemaHolderImpl.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/schema/SchemaHolderImpl.java index 0333753024aba..48a69cfe22036 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/schema/SchemaHolderImpl.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/schema/SchemaHolderImpl.java @@ -67,10 +67,10 @@ public class SchemaHolderImpl extends AbstractService implements SchemaHolder, S private final GridKernalContext ctx; /** */ - private GridInternalSubscriptionProcessor subscriptionProcessor; + private final FrameworkConfig frameworkCfg; /** */ - private FrameworkConfig frameworkCfg; + private GridInternalSubscriptionProcessor subscriptionProcessor; /** */ private volatile SchemaPlus calciteSchema;