This is an automated email from the ASF dual-hosted git repository.
jiajunxie pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/calcite.git
The following commit(s) were added to refs/heads/main by this push:
new 51da34bdf9 [CALCITE-5906] JDBC adapter should generate TABLESAMPLE
51da34bdf9 is described below
commit 51da34bdf91e602f32f965b3490bace026d51ef4
Author: shenlang <[email protected]>
AuthorDate: Tue Aug 8 22:44:36 2023 +0800
[CALCITE-5906] JDBC adapter should generate TABLESAMPLE
---
.../calcite/rel/rel2sql/RelToSqlConverter.java | 25 ++++++++++++++
.../apache/calcite/rel/rel2sql/SqlImplementor.java | 3 +-
.../calcite/rel/rel2sql/RelToSqlConverterTest.java | 40 ++++++++++++++++++++++
3 files changed, 67 insertions(+), 1 deletion(-)
diff --git
a/core/src/main/java/org/apache/calcite/rel/rel2sql/RelToSqlConverter.java
b/core/src/main/java/org/apache/calcite/rel/rel2sql/RelToSqlConverter.java
index 5853ddd414..2462b89d55 100644
--- a/core/src/main/java/org/apache/calcite/rel/rel2sql/RelToSqlConverter.java
+++ b/core/src/main/java/org/apache/calcite/rel/rel2sql/RelToSqlConverter.java
@@ -19,6 +19,7 @@ package org.apache.calcite.rel.rel2sql;
import org.apache.calcite.adapter.jdbc.JdbcTable;
import org.apache.calcite.linq4j.Ord;
import org.apache.calcite.linq4j.tree.Expressions;
+import org.apache.calcite.plan.RelOptSamplingParameters;
import org.apache.calcite.plan.RelOptTable;
import org.apache.calcite.rel.RelCollation;
import org.apache.calcite.rel.RelCollations;
@@ -36,6 +37,7 @@ import org.apache.calcite.rel.core.JoinRelType;
import org.apache.calcite.rel.core.Match;
import org.apache.calcite.rel.core.Minus;
import org.apache.calcite.rel.core.Project;
+import org.apache.calcite.rel.core.Sample;
import org.apache.calcite.rel.core.Sort;
import org.apache.calcite.rel.core.TableFunctionScan;
import org.apache.calcite.rel.core.TableModify;
@@ -72,6 +74,7 @@ import org.apache.calcite.sql.SqlLiteral;
import org.apache.calcite.sql.SqlMatchRecognize;
import org.apache.calcite.sql.SqlNode;
import org.apache.calcite.sql.SqlNodeList;
+import org.apache.calcite.sql.SqlSampleSpec;
import org.apache.calcite.sql.SqlSelect;
import org.apache.calcite.sql.SqlTableRef;
import org.apache.calcite.sql.SqlUpdate;
@@ -875,6 +878,28 @@ public class RelToSqlConverter extends SqlImplementor
return result(query, clauses, e, null);
}
+ /** Visits a Sample; called by {@link #dispatch} via reflection. */
+ public Result visit(Sample e) {
+ Result x = visitInput(e, 0);
+ RelOptSamplingParameters parameters = e.getSamplingParameters();
+ boolean isRepeatable = parameters.isRepeatable();
+ boolean isBernoulli = parameters.isBernoulli();
+
+ SqlSampleSpec tableSampleSpec =
+ isRepeatable
+ ? SqlSampleSpec.createTableSample(
+ isBernoulli, parameters.sampleRate, parameters.getRepeatableSeed())
+ : SqlSampleSpec.createTableSample(isBernoulli,
parameters.sampleRate);
+
+ SqlLiteral tableSampleLiteral =
+ SqlLiteral.createSample(tableSampleSpec, POS);
+
+ SqlNode tableRef =
+ SqlStdOperatorTable.TABLESAMPLE.createCall(POS, x.node,
tableSampleLiteral);
+
+ return result(tableRef, ImmutableList.of(Clause.FROM), e, null);
+ }
+
private @Nullable SqlIdentifier getDual() {
final List<String> names = dialect.getSingleRowTableName();
if (names == null) {
diff --git
a/core/src/main/java/org/apache/calcite/rel/rel2sql/SqlImplementor.java
b/core/src/main/java/org/apache/calcite/rel/rel2sql/SqlImplementor.java
index 6517440c5b..4c535c14e3 100644
--- a/core/src/main/java/org/apache/calcite/rel/rel2sql/SqlImplementor.java
+++ b/core/src/main/java/org/apache/calcite/rel/rel2sql/SqlImplementor.java
@@ -541,7 +541,8 @@ public abstract class SqlImplementor {
|| node instanceof SqlCall
&& (((SqlCall) node).getOperator() instanceof SqlSetOperator
|| ((SqlCall) node).getOperator() == SqlStdOperatorTable.AS
- || ((SqlCall) node).getOperator() ==
SqlStdOperatorTable.VALUES)
+ || ((SqlCall) node).getOperator() == SqlStdOperatorTable.VALUES
+ || ((SqlCall) node).getOperator() ==
SqlStdOperatorTable.TABLESAMPLE)
: node;
if (requiresAlias(node)) {
node = as(node, "t");
diff --git
a/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java
b/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java
index 6670a44349..dded73c882 100644
---
a/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java
+++
b/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java
@@ -360,6 +360,46 @@ class RelToSqlConverterTest {
sql(query).ok(expected);
}
+ /** Test case for
+ * <a
href="https://issues.apache.org/jira/browse/CALCITE-5906">[CALCITE-5906]
+ * JDBC adapter should generate TABLESAMPLE</a>. */
+ @Test void testTableSampleBernoulli() {
+ String query = "select * from \"product\" tablesample bernoulli(11)";
+ final String expected = "SELECT *\n"
+ + "FROM \"foodmart\".\"product\" TABLESAMPLE BERNOULLI(11.00)";
+ sql(query).ok(expected);
+ }
+
+ /** Test case for
+ * <a
href="https://issues.apache.org/jira/browse/CALCITE-5906">[CALCITE-5906]
+ * JDBC adapter should generate TABLESAMPLE</a>. */
+ @Test void testTableSampleBernoulliRepeatable() {
+ String query = "select * from \"product\" tablesample bernoulli(15)
repeatable(10)";
+ final String expected = "SELECT *\n"
+ + "FROM \"foodmart\".\"product\" TABLESAMPLE BERNOULLI(15.00)
REPEATABLE(10)";
+ sql(query).ok(expected);
+ }
+
+ /** Test case for
+ * <a
href="https://issues.apache.org/jira/browse/CALCITE-5906">[CALCITE-5906]
+ * JDBC adapter should generate TABLESAMPLE</a>. */
+ @Test void testTableSampleSystem() {
+ String query = "select * from \"product\" tablesample system(11)";
+ final String expected = "SELECT *\n"
+ + "FROM \"foodmart\".\"product\" TABLESAMPLE SYSTEM(11.00)";
+ sql(query).ok(expected);
+ }
+
+ /** Test case for
+ * <a
href="https://issues.apache.org/jira/browse/CALCITE-5906">[CALCITE-5906]
+ * JDBC adapter should generate TABLESAMPLE</a>. */
+ @Test void testTableSampleSystemRepeatable() {
+ String query = "select * from \"product\" TABLESAMPLE system(11)
repeatable(10)";
+ final String expected = "SELECT *\n"
+ + "FROM \"foodmart\".\"product\" TABLESAMPLE SYSTEM(11.00)
REPEATABLE(10)";
+ sql(query).ok(expected);
+ }
+
/** Test case for
* <a
href="https://issues.apache.org/jira/browse/CALCITE-4449">[CALCITE-4449]
* Calcite generates incorrect SQL for Sarg 'x IS NULL OR x NOT IN