This is an automated email from the ASF dual-hosted git repository. alsuliman pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/asterixdb.git
commit 7ba271ac2d33704eaf8f5edc1587add0527dce37 Author: Vijay Sarathy <[email protected]> AuthorDate: Thu Mar 9 08:07:43 2023 -0800 [ASTERIXDB-3128][COMP] Hashjoin hint with build generates warning [ASTERIXDB-3126][COMP] CBO: hint productivity NPE if missing cardinality estimate on collection Change-Id: Ia26a912063aaf063a530acc7ff1a7a006f0ad0c9 Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17411 Tested-by: Jenkins <[email protected]> Reviewed-by: Vijay Sarathy <[email protected]> Reviewed-by: Ali Alsuliman <[email protected]> Integration-Tests: Jenkins <[email protected]> --- .../cardinality-hint-warning.01.ddl.sqlpp} | 7 +- .../cardinality-hint-warning.02.query.sqlpp} | 31 +++------ .../cardinality-hint-warning.03.query.sqlpp} | 32 +++------ .../cardinality-hint-warning.04.query.sqlpp} | 34 +++------ .../cardinality-hint-warning.05.query.sqlpp} | 32 +++------ .../cardinality-hint-warning.06.query.sqlpp} | 30 ++------ .../cardinality-hint-warning.07.query.sqlpp} | 32 +++------ .../cardinality-hint-warning.08.query.sqlpp} | 32 +++------ .../cardinality-hint-warning.09.query.sqlpp} | 34 +++------ .../hashjoin-hint-warning.01.ddl.sqlpp | 3 +- ....sqlpp => hashjoin-hint-warning.12.query.sqlpp} | 31 ++------- .../cardinality-hint-warning.02.adm | 1 + .../cardinality-hint-warning.03.adm | 1 + .../cardinality-hint-warning.04.adm | 1 + .../cardinality-hint-warning.05.adm | 1 + .../cardinality-hint-warning.06.adm | 1 + .../cardinality-hint-warning.07.adm | 1 + .../cardinality-hint-warning.08.adm | 1 + .../cardinality-hint-warning.09.adm | 1 + .../hashjoin-hint-warning.12.adm | 1 + .../test/resources/runtimets/testsuite_sqlpp.xml | 11 +++ .../asterix-lang-sqlpp/src/main/javacc/SQLPP.jj | 80 +++++++++++++--------- .../logical/visitors/VariableUtilities.java | 12 ++++ .../algebricks/rewriter/util/JoinUtils.java | 11 ++- 24 files changed, 165 insertions(+), 256 deletions(-) diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/hashjoin-hint-warning/hashjoin-hint-warning.01.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/cardinality-hint-warning/cardinality-hint-warning.01.ddl.sqlpp similarity index 90% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/hashjoin-hint-warning/hashjoin-hint-warning.01.ddl.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/cardinality-hint-warning/cardinality-hint-warning.01.ddl.sqlpp index 14ff86dcfd..e4727dc444 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/hashjoin-hint-warning/hashjoin-hint-warning.01.ddl.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/cardinality-hint-warning/cardinality-hint-warning.01.ddl.sqlpp @@ -17,9 +17,9 @@ * under the License. */ /* -* Description : Test warnings for enhanced hash join hint +* Description : Test warnings for cardinality hints * Expected Res : Warning, ignore hint -* Date : 11/20/2022 +* Date : 03/09/2023 */ DROP dataverse tpch IF EXISTS; @@ -37,7 +37,8 @@ CREATE TYPE CustomerType AS { }; CREATE TYPE NationType AS { - n_nationkey : integer + n_nationkey : integer, + n_name : string }; CREATE DATASET orders(OrderType) PRIMARY KEY o_orderkey; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/hashjoin-hint-warning/hashjoin-hint-warning.01.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/cardinality-hint-warning/cardinality-hint-warning.02.query.sqlpp similarity index 63% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/hashjoin-hint-warning/hashjoin-hint-warning.01.ddl.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/cardinality-hint-warning/cardinality-hint-warning.02.query.sqlpp index 14ff86dcfd..0ed9c00583 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/hashjoin-hint-warning/hashjoin-hint-warning.01.ddl.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/cardinality-hint-warning/cardinality-hint-warning.02.query.sqlpp @@ -17,31 +17,16 @@ * under the License. */ /* -* Description : Test warnings for enhanced hash join hint +* Description : Test warnings for cardinality hints * Expected Res : Warning, ignore hint -* Date : 11/20/2022 +* Date : 03/09/2023 */ +// requesttype=application/json +// param max-warnings:json=10 -DROP dataverse tpch IF EXISTS; -CREATE dataverse tpch; +use tpch; -USE tpch; +SELECT count(*) +FROM customer c, nation n +WHERE c.c_nationkey = n.n_nationkey and n.n_name /*+ selectivity */ = 'UNITED STATES'; - -CREATE TYPE OrderType AS { - o_orderkey : integer -}; - -CREATE TYPE CustomerType AS { - c_custkey : integer -}; - -CREATE TYPE NationType AS { - n_nationkey : integer -}; - -CREATE DATASET orders(OrderType) PRIMARY KEY o_orderkey; - -CREATE DATASET customer(CustomerType) PRIMARY KEY c_custkey; - -CREATE DATASET nation(NationType) PRIMARY KEY n_nationkey; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/hashjoin-hint-warning/hashjoin-hint-warning.01.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/cardinality-hint-warning/cardinality-hint-warning.03.query.sqlpp similarity index 63% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/hashjoin-hint-warning/hashjoin-hint-warning.01.ddl.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/cardinality-hint-warning/cardinality-hint-warning.03.query.sqlpp index 14ff86dcfd..f3838eb9e4 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/hashjoin-hint-warning/hashjoin-hint-warning.01.ddl.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/cardinality-hint-warning/cardinality-hint-warning.03.query.sqlpp @@ -17,31 +17,15 @@ * under the License. */ /* -* Description : Test warnings for enhanced hash join hint +* Description : Test warnings for cardinality hints * Expected Res : Warning, ignore hint -* Date : 11/20/2022 +* Date : 03/09/2023 */ +// requesttype=application/json +// param max-warnings:json=10 -DROP dataverse tpch IF EXISTS; -CREATE dataverse tpch; +use tpch; -USE tpch; - - -CREATE TYPE OrderType AS { - o_orderkey : integer -}; - -CREATE TYPE CustomerType AS { - c_custkey : integer -}; - -CREATE TYPE NationType AS { - n_nationkey : integer -}; - -CREATE DATASET orders(OrderType) PRIMARY KEY o_orderkey; - -CREATE DATASET customer(CustomerType) PRIMARY KEY c_custkey; - -CREATE DATASET nation(NationType) PRIMARY KEY n_nationkey; +SELECT count(*) +FROM customer c, nation n +WHERE c.c_nationkey = n.n_nationkey and n.n_name /*+ selectivity 1 */ = 'UNITED STATES'; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/hashjoin-hint-warning/hashjoin-hint-warning.01.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/cardinality-hint-warning/cardinality-hint-warning.04.query.sqlpp similarity index 60% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/hashjoin-hint-warning/hashjoin-hint-warning.01.ddl.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/cardinality-hint-warning/cardinality-hint-warning.04.query.sqlpp index 14ff86dcfd..b40ff68e1f 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/hashjoin-hint-warning/hashjoin-hint-warning.01.ddl.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/cardinality-hint-warning/cardinality-hint-warning.04.query.sqlpp @@ -17,31 +17,15 @@ * under the License. */ /* -* Description : Test warnings for enhanced hash join hint -* Expected Res : Warning, ignore hint -* Date : 11/20/2022 +* Description : Test warnings for cardinality hints +* Expected Res : No warning, honor hint +* Date : 03/09/2023 */ +// requesttype=application/json +// param max-warnings:json=10 -DROP dataverse tpch IF EXISTS; -CREATE dataverse tpch; +use tpch; -USE tpch; - - -CREATE TYPE OrderType AS { - o_orderkey : integer -}; - -CREATE TYPE CustomerType AS { - c_custkey : integer -}; - -CREATE TYPE NationType AS { - n_nationkey : integer -}; - -CREATE DATASET orders(OrderType) PRIMARY KEY o_orderkey; - -CREATE DATASET customer(CustomerType) PRIMARY KEY c_custkey; - -CREATE DATASET nation(NationType) PRIMARY KEY n_nationkey; +SELECT count(*) +FROM customer c, nation n +WHERE c.c_nationkey = n.n_nationkey and n.n_name /*+ selectivity 0.1 */ = 'UNITED STATES'; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/hashjoin-hint-warning/hashjoin-hint-warning.01.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/cardinality-hint-warning/cardinality-hint-warning.05.query.sqlpp similarity index 63% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/hashjoin-hint-warning/hashjoin-hint-warning.01.ddl.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/cardinality-hint-warning/cardinality-hint-warning.05.query.sqlpp index 14ff86dcfd..0d98c86be6 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/hashjoin-hint-warning/hashjoin-hint-warning.01.ddl.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/cardinality-hint-warning/cardinality-hint-warning.05.query.sqlpp @@ -17,31 +17,15 @@ * under the License. */ /* -* Description : Test warnings for enhanced hash join hint +* Description : Test warnings for cardinality hints * Expected Res : Warning, ignore hint -* Date : 11/20/2022 +* Date : 03/09/2023 */ +// requesttype=application/json +// param max-warnings:json=10 -DROP dataverse tpch IF EXISTS; -CREATE dataverse tpch; +use tpch; -USE tpch; - - -CREATE TYPE OrderType AS { - o_orderkey : integer -}; - -CREATE TYPE CustomerType AS { - c_custkey : integer -}; - -CREATE TYPE NationType AS { - n_nationkey : integer -}; - -CREATE DATASET orders(OrderType) PRIMARY KEY o_orderkey; - -CREATE DATASET customer(CustomerType) PRIMARY KEY c_custkey; - -CREATE DATASET nation(NationType) PRIMARY KEY n_nationkey; +SELECT count(*) +FROM customer c, nation n +WHERE c.c_nationkey /*+ productivity */ = n.n_nationkey; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/hashjoin-hint-warning/hashjoin-hint-warning.01.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/cardinality-hint-warning/cardinality-hint-warning.06.query.sqlpp similarity index 67% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/hashjoin-hint-warning/hashjoin-hint-warning.01.ddl.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/cardinality-hint-warning/cardinality-hint-warning.06.query.sqlpp index 14ff86dcfd..21d4735f92 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/hashjoin-hint-warning/hashjoin-hint-warning.01.ddl.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/cardinality-hint-warning/cardinality-hint-warning.06.query.sqlpp @@ -19,29 +19,13 @@ /* * Description : Test warnings for enhanced hash join hint * Expected Res : Warning, ignore hint -* Date : 11/20/2022 +* Date : 03/09/2023 */ +// requesttype=application/json +// param max-warnings:json=10 -DROP dataverse tpch IF EXISTS; -CREATE dataverse tpch; +use tpch; -USE tpch; - - -CREATE TYPE OrderType AS { - o_orderkey : integer -}; - -CREATE TYPE CustomerType AS { - c_custkey : integer -}; - -CREATE TYPE NationType AS { - n_nationkey : integer -}; - -CREATE DATASET orders(OrderType) PRIMARY KEY o_orderkey; - -CREATE DATASET customer(CustomerType) PRIMARY KEY c_custkey; - -CREATE DATASET nation(NationType) PRIMARY KEY n_nationkey; +SELECT count(*) +FROM customer c, nation n +WHERE c.c_nationkey /*+ productivity 100.0 */ = n.n_nationkey; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/hashjoin-hint-warning/hashjoin-hint-warning.01.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/cardinality-hint-warning/cardinality-hint-warning.07.query.sqlpp similarity index 63% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/hashjoin-hint-warning/hashjoin-hint-warning.01.ddl.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/cardinality-hint-warning/cardinality-hint-warning.07.query.sqlpp index 14ff86dcfd..626490a3ef 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/hashjoin-hint-warning/hashjoin-hint-warning.01.ddl.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/cardinality-hint-warning/cardinality-hint-warning.07.query.sqlpp @@ -17,31 +17,15 @@ * under the License. */ /* -* Description : Test warnings for enhanced hash join hint +* Description : Test warnings for cardinality hints * Expected Res : Warning, ignore hint -* Date : 11/20/2022 +* Date : 03/09/2023 */ +// requesttype=application/json +// param max-warnings:json=10 -DROP dataverse tpch IF EXISTS; -CREATE dataverse tpch; +use tpch; -USE tpch; - - -CREATE TYPE OrderType AS { - o_orderkey : integer -}; - -CREATE TYPE CustomerType AS { - c_custkey : integer -}; - -CREATE TYPE NationType AS { - n_nationkey : integer -}; - -CREATE DATASET orders(OrderType) PRIMARY KEY o_orderkey; - -CREATE DATASET customer(CustomerType) PRIMARY KEY c_custkey; - -CREATE DATASET nation(NationType) PRIMARY KEY n_nationkey; +SELECT count(*) +FROM customer c, nation n +WHERE c.c_nationkey /*+ productivity n */ = n.n_nationkey; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/hashjoin-hint-warning/hashjoin-hint-warning.01.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/cardinality-hint-warning/cardinality-hint-warning.08.query.sqlpp similarity index 63% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/hashjoin-hint-warning/hashjoin-hint-warning.01.ddl.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/cardinality-hint-warning/cardinality-hint-warning.08.query.sqlpp index 14ff86dcfd..6a6a440489 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/hashjoin-hint-warning/hashjoin-hint-warning.01.ddl.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/cardinality-hint-warning/cardinality-hint-warning.08.query.sqlpp @@ -17,31 +17,15 @@ * under the License. */ /* -* Description : Test warnings for enhanced hash join hint +* Description : Test warnings for cardinality hints * Expected Res : Warning, ignore hint -* Date : 11/20/2022 +* Date : 03/09/2023 */ +// requesttype=application/json +// param max-warnings:json=10 -DROP dataverse tpch IF EXISTS; -CREATE dataverse tpch; +use tpch; -USE tpch; - - -CREATE TYPE OrderType AS { - o_orderkey : integer -}; - -CREATE TYPE CustomerType AS { - c_custkey : integer -}; - -CREATE TYPE NationType AS { - n_nationkey : integer -}; - -CREATE DATASET orders(OrderType) PRIMARY KEY o_orderkey; - -CREATE DATASET customer(CustomerType) PRIMARY KEY c_custkey; - -CREATE DATASET nation(NationType) PRIMARY KEY n_nationkey; +SELECT count(*) +FROM customer c, nation n +WHERE c.c_nationkey /*+ productivity n 100 */ = n.n_nationkey; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/hashjoin-hint-warning/hashjoin-hint-warning.01.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/cardinality-hint-warning/cardinality-hint-warning.09.query.sqlpp similarity index 60% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/hashjoin-hint-warning/hashjoin-hint-warning.01.ddl.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/cardinality-hint-warning/cardinality-hint-warning.09.query.sqlpp index 14ff86dcfd..725b0eac35 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/hashjoin-hint-warning/hashjoin-hint-warning.01.ddl.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/cardinality-hint-warning/cardinality-hint-warning.09.query.sqlpp @@ -17,31 +17,15 @@ * under the License. */ /* -* Description : Test warnings for enhanced hash join hint -* Expected Res : Warning, ignore hint -* Date : 11/20/2022 +* Description : Test warnings for cardinality hints +* Expected Res : No warning, honor hint +* Date : 03/09/2023 */ +// requesttype=application/json +// param max-warnings:json=10 -DROP dataverse tpch IF EXISTS; -CREATE dataverse tpch; +use tpch; -USE tpch; - - -CREATE TYPE OrderType AS { - o_orderkey : integer -}; - -CREATE TYPE CustomerType AS { - c_custkey : integer -}; - -CREATE TYPE NationType AS { - n_nationkey : integer -}; - -CREATE DATASET orders(OrderType) PRIMARY KEY o_orderkey; - -CREATE DATASET customer(CustomerType) PRIMARY KEY c_custkey; - -CREATE DATASET nation(NationType) PRIMARY KEY n_nationkey; +SELECT count(*) +FROM customer c, nation n +WHERE c.c_nationkey /*+ productivity n 100.0 */ = n.n_nationkey; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/hashjoin-hint-warning/hashjoin-hint-warning.01.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/hashjoin-hint-warning/hashjoin-hint-warning.01.ddl.sqlpp index 14ff86dcfd..b64fa28a19 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/hashjoin-hint-warning/hashjoin-hint-warning.01.ddl.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/hashjoin-hint-warning/hashjoin-hint-warning.01.ddl.sqlpp @@ -37,7 +37,8 @@ CREATE TYPE CustomerType AS { }; CREATE TYPE NationType AS { - n_nationkey : integer + n_nationkey : integer, + n_name : string }; CREATE DATASET orders(OrderType) PRIMARY KEY o_orderkey; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/hashjoin-hint-warning/hashjoin-hint-warning.01.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/hashjoin-hint-warning/hashjoin-hint-warning.12.query.sqlpp similarity index 66% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/hashjoin-hint-warning/hashjoin-hint-warning.01.ddl.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/hashjoin-hint-warning/hashjoin-hint-warning.12.query.sqlpp index 14ff86dcfd..f6aebcd960 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/hashjoin-hint-warning/hashjoin-hint-warning.01.ddl.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/warnings/hashjoin-hint-warning/hashjoin-hint-warning.12.query.sqlpp @@ -18,30 +18,13 @@ */ /* * Description : Test warnings for enhanced hash join hint -* Expected Res : Warning, ignore hint +* Expected Res : No warning, honor hint * Date : 11/20/2022 */ +// requesttype=application/json +// param max-warnings:json=10 -DROP dataverse tpch IF EXISTS; -CREATE dataverse tpch; - -USE tpch; - - -CREATE TYPE OrderType AS { - o_orderkey : integer -}; - -CREATE TYPE CustomerType AS { - c_custkey : integer -}; - -CREATE TYPE NationType AS { - n_nationkey : integer -}; - -CREATE DATASET orders(OrderType) PRIMARY KEY o_orderkey; - -CREATE DATASET customer(CustomerType) PRIMARY KEY c_custkey; - -CREATE DATASET nation(NationType) PRIMARY KEY n_nationkey; +use tpch; +set `compiler.cbo` "true"; +SELECT COUNT(DISTINCT n.n_name) FROM customer c JOIN nation n +ON c.c_nationkey /*+ hashjoin build(n) */ = n.n_nationkey; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/warnings/cardinality-hint-warning/cardinality-hint-warning.02.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/warnings/cardinality-hint-warning/cardinality-hint-warning.02.adm new file mode 100644 index 0000000000..3ff59f66ac --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/warnings/cardinality-hint-warning/cardinality-hint-warning.02.adm @@ -0,0 +1 @@ +{ "$1": 0 } \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/warnings/cardinality-hint-warning/cardinality-hint-warning.03.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/warnings/cardinality-hint-warning/cardinality-hint-warning.03.adm new file mode 100644 index 0000000000..3ff59f66ac --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/warnings/cardinality-hint-warning/cardinality-hint-warning.03.adm @@ -0,0 +1 @@ +{ "$1": 0 } \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/warnings/cardinality-hint-warning/cardinality-hint-warning.04.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/warnings/cardinality-hint-warning/cardinality-hint-warning.04.adm new file mode 100644 index 0000000000..3ff59f66ac --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/warnings/cardinality-hint-warning/cardinality-hint-warning.04.adm @@ -0,0 +1 @@ +{ "$1": 0 } \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/warnings/cardinality-hint-warning/cardinality-hint-warning.05.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/warnings/cardinality-hint-warning/cardinality-hint-warning.05.adm new file mode 100644 index 0000000000..3ff59f66ac --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/warnings/cardinality-hint-warning/cardinality-hint-warning.05.adm @@ -0,0 +1 @@ +{ "$1": 0 } \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/warnings/cardinality-hint-warning/cardinality-hint-warning.06.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/warnings/cardinality-hint-warning/cardinality-hint-warning.06.adm new file mode 100644 index 0000000000..3ff59f66ac --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/warnings/cardinality-hint-warning/cardinality-hint-warning.06.adm @@ -0,0 +1 @@ +{ "$1": 0 } \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/warnings/cardinality-hint-warning/cardinality-hint-warning.07.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/warnings/cardinality-hint-warning/cardinality-hint-warning.07.adm new file mode 100644 index 0000000000..3ff59f66ac --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/warnings/cardinality-hint-warning/cardinality-hint-warning.07.adm @@ -0,0 +1 @@ +{ "$1": 0 } \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/warnings/cardinality-hint-warning/cardinality-hint-warning.08.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/warnings/cardinality-hint-warning/cardinality-hint-warning.08.adm new file mode 100644 index 0000000000..3ff59f66ac --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/warnings/cardinality-hint-warning/cardinality-hint-warning.08.adm @@ -0,0 +1 @@ +{ "$1": 0 } \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/warnings/cardinality-hint-warning/cardinality-hint-warning.09.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/warnings/cardinality-hint-warning/cardinality-hint-warning.09.adm new file mode 100644 index 0000000000..3ff59f66ac --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/warnings/cardinality-hint-warning/cardinality-hint-warning.09.adm @@ -0,0 +1 @@ +{ "$1": 0 } \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/warnings/hashjoin-hint-warning/hashjoin-hint-warning.12.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/warnings/hashjoin-hint-warning/hashjoin-hint-warning.12.adm new file mode 100644 index 0000000000..267992b2a2 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/warnings/hashjoin-hint-warning/hashjoin-hint-warning.12.adm @@ -0,0 +1 @@ +{ "$1": 0 } diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml index 31183f3dc7..f9e2e7030f 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml +++ b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml @@ -15460,6 +15460,17 @@ <expected-warn>HYR10006: Could not apply hash join hint: probe with cn (in line 36, at column 47)</expected-warn> </compilation-unit> </test-case> + <test-case FilePath="warnings" check-warnings="true"> + <compilation-unit name="cardinality-hint-warning"> + <output-dir compare="Text">cardinality-hint-warning</output-dir> + <expected-warn><![CDATA[ASX1132: Invalid specification for hint selectivity. Expected selectivity value (in line 31, at column 52)]]></expected-warn> + <expected-warn><![CDATA[ASX1132: Invalid specification for hint selectivity. Selectivity value has to be in decimal format (in line 31, at column 52)]]></expected-warn> + <expected-warn><![CDATA[ASX1132: Invalid specification for hint productivity. Expected productivity collection name and value (in line 31, at column 23)]]></expected-warn> + <expected-warn><![CDATA[ASX1132: Invalid specification for hint productivity. Invalid format for productivity values (in line 31, at column 23)]]></expected-warn> + <expected-warn><![CDATA[ASX1132: Invalid specification for hint productivity. Invalid format for productivity values (in line 31, at column 23)]]></expected-warn> + <expected-warn><![CDATA[ASX1132: Invalid specification for hint productivity. Invalid format for productivity values (in line 31, at column 23)]]></expected-warn> + </compilation-unit> + </test-case> <test-case FilePath="warnings" check-warnings="true"> <compilation-unit name="inapplicable-hint-warning"> <output-dir compare="Text">inapplicable-hint-warning</output-dir> diff --git a/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj b/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj index 98fc560327..875de45601 100644 --- a/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj +++ b/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj @@ -689,39 +689,53 @@ class SQLPPParser extends ScopeChecker implements IParser { Pattern lessThanOnePat = Pattern.compile("0\\.\\d+"); try { switch (hintToken.hint) { - case SINGLE_DATASET_PREDICATE_SELECTIVITY_HINT: - if (hintToken.hintParams == null) { - throw new SqlppParseException(getSourceLocation(hintToken), "Expected selectivity value"); - } - else { - selectivity = 1.0; // uninitialized - Matcher mat = lessThanOnePat.matcher(hintToken.hintParams); - if (mat.find()) { - selectivity = Double.parseDouble (mat.group()); - } - return new PredicateCardinalityAnnotation(selectivity); - } - case JOIN_PREDICATE_PRODUCTIVITY_HINT: - if (hintToken.hintParams == null) { - throw new SqlppParseException(getSourceLocation(hintToken), "Expected productivity value"); - } - else { - productivity = 1.0; // uninitialized - String leftSideDataSet = null; - Matcher StringNum = stringNumber.matcher(hintToken.hintParams); - if (StringNum.find()) { - String matchedGroup = StringNum.group(); - Pattern var = Pattern.compile("[a-zA-Z]\\w*"); // any word character [a-zA-Z_0-9] - Matcher matVar = var.matcher(matchedGroup); - if (matVar.find()) - leftSideDataSet = matVar.group(); - Matcher numMat = number.matcher(matchedGroup); - if (numMat.find()) - productivity = Double.parseDouble (numMat.group()); - } - // attach hint to global scope - return new JoinProductivityAnnotation (productivity, leftSideDataSet); - } + case SINGLE_DATASET_PREDICATE_SELECTIVITY_HINT: + if (hintToken.hintParams == null) { + throw new SqlppParseException(getSourceLocation(hintToken), "Expected selectivity value"); + } + else { + selectivity = 1.0; // uninitialized + Matcher mat = lessThanOnePat.matcher(hintToken.hintParams); + if (mat.find()) { + selectivity = Double.parseDouble (mat.group()); + } + else { + throw new SqlppParseException(getSourceLocation(hintToken), "Selectivity value has to be in decimal format"); + } + return new PredicateCardinalityAnnotation(selectivity); + } + case JOIN_PREDICATE_PRODUCTIVITY_HINT: + if (hintToken.hintParams == null) { + throw new SqlppParseException(getSourceLocation(hintToken), "Expected productivity collection name and value"); + } + else { + productivity = 1.0; // uninitialized + String leftSideDataSet = null; + Matcher StringNum = stringNumber.matcher(hintToken.hintParams); + if (StringNum.find()) { + String matchedGroup = StringNum.group(); + Pattern var = Pattern.compile("[a-zA-Z]\\w*"); // any word character [a-zA-Z_0-9] + Matcher matVar = var.matcher(matchedGroup); + if (matVar.find()) { + leftSideDataSet = matVar.group(); + } + else { + throw new SqlppParseException(getSourceLocation(hintToken), "Expected productivity collection name"); + } + Matcher numMat = number.matcher(matchedGroup); + if (numMat.find()) { + productivity = Double.parseDouble (numMat.group()); + } + else { + throw new SqlppParseException(getSourceLocation(hintToken), "Productivity value has to be in decimal format"); + } + } + else { + throw new SqlppParseException(getSourceLocation(hintToken), "Invalid format for productivity values"); + } + // attach hint to global scope + return new JoinProductivityAnnotation (productivity, leftSideDataSet); + } case HASH_BROADCAST_JOIN_HINT: if (hintToken.hintParams == null) { return new BroadcastExpressionAnnotation(BroadcastExpressionAnnotation.BroadcastSide.RIGHT); diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/VariableUtilities.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/VariableUtilities.java index 69db58d435..623e15ab62 100644 --- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/VariableUtilities.java +++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/VariableUtilities.java @@ -33,6 +33,7 @@ import org.apache.hyracks.algebricks.common.utils.Pair; import org.apache.hyracks.algebricks.core.algebra.base.ILogicalExpression; import org.apache.hyracks.algebricks.core.algebra.base.ILogicalOperator; import org.apache.hyracks.algebricks.core.algebra.base.LogicalExpressionTag; +import org.apache.hyracks.algebricks.core.algebra.base.LogicalOperatorTag; import org.apache.hyracks.algebricks.core.algebra.base.LogicalVariable; import org.apache.hyracks.algebricks.core.algebra.expressions.VariableReferenceExpression; import org.apache.hyracks.algebricks.core.algebra.typing.ITypingContext; @@ -102,6 +103,17 @@ public class VariableUtilities { } } + public static void getLiveVariablesInDescendantDataScans(ILogicalOperator op, Collection<LogicalVariable> vars) + throws AlgebricksException { + // DFS traversal + if (op.getOperatorTag() == LogicalOperatorTag.DATASOURCESCAN) { + VariableUtilities.getLiveVariables(op, vars); + } + for (Mutable<ILogicalOperator> c : op.getInputs()) { + getLiveVariablesInDescendantDataScans(c.getValue(), vars); + } + } + public static void getProducedVariablesInDescendantsAndSelf(ILogicalOperator op, Collection<LogicalVariable> vars) throws AlgebricksException { // DFS traversal diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/util/JoinUtils.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/util/JoinUtils.java index fa0549f3ce..49ff483de7 100644 --- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/util/JoinUtils.java +++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/util/JoinUtils.java @@ -40,6 +40,7 @@ import org.apache.hyracks.algebricks.core.algebra.functions.AlgebricksBuiltinFun import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier; import org.apache.hyracks.algebricks.core.algebra.operators.logical.AbstractBinaryJoinOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.visitors.LogicalPropertiesVisitor; +import org.apache.hyracks.algebricks.core.algebra.operators.logical.visitors.VariableUtilities; import org.apache.hyracks.algebricks.core.algebra.operators.physical.AbstractJoinPOperator.JoinPartitioningType; import org.apache.hyracks.algebricks.core.algebra.operators.physical.HybridHashJoinPOperator; import org.apache.hyracks.algebricks.core.algebra.operators.physical.InMemoryHashJoinPOperator; @@ -57,7 +58,7 @@ public class JoinUtils { } public static void setJoinAlgorithmAndExchangeAlgo(AbstractBinaryJoinOperator op, boolean topLevelOp, - IOptimizationContext context) { + IOptimizationContext context) throws AlgebricksException { if (!topLevelOp) { throw new IllegalStateException("Micro operator not implemented for: " + op.getOperatorTag()); } @@ -67,9 +68,13 @@ public class JoinUtils { List<LogicalVariable> varsRight = op.getInputs().get(1).getValue().getSchema(); ILogicalExpression conditionExpr = op.getCondition().getValue(); if (isHashJoinCondition(conditionExpr, varsLeft, varsRight, sideLeft, sideRight)) { - BroadcastSide broadcastSide = getBroadcastJoinSide(conditionExpr, varsLeft, varsRight, context); + List<LogicalVariable> scanVarsLeft = new LinkedList<>(); + List<LogicalVariable> scanVarsRight = new LinkedList<>(); + VariableUtilities.getLiveVariablesInDescendantDataScans(op.getInputs().get(0).getValue(), scanVarsLeft); + VariableUtilities.getLiveVariablesInDescendantDataScans(op.getInputs().get(1).getValue(), scanVarsRight); + BroadcastSide broadcastSide = getBroadcastJoinSide(conditionExpr, scanVarsLeft, scanVarsRight, context); if (broadcastSide == null) { - BuildSide buildSide = getHashJoinBuildSide(conditionExpr, varsLeft, varsRight, context); + BuildSide buildSide = getHashJoinBuildSide(conditionExpr, scanVarsLeft, scanVarsRight, context); if (buildSide == null) { setHashJoinOp(op, JoinPartitioningType.PAIRWISE, sideLeft, sideRight, context); } else {
