This is an automated email from the ASF dual-hosted git repository.
jakevin pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-datafusion.git
The following commit(s) were added to refs/heads/main by this push:
new ffaa67904e test: Port tests in `references.rs` to sqllogictest (#8877)
ffaa67904e is described below
commit ffaa67904ed0ca454267ccc5832582bcb669a5c0
Author: Dejan Simic <[email protected]>
AuthorDate: Wed Jan 17 07:15:25 2024 +0100
test: Port tests in `references.rs` to sqllogictest (#8877)
* Migrate references unit tests to sqllogictest
* Remove unused import
---
datafusion/core/tests/sql/mod.rs | 56 ---------
datafusion/core/tests/sql/references.rs | 140 ----------------------
datafusion/sqllogictest/test_files/references.slt | 134 +++++++++++++++++++++
3 files changed, 134 insertions(+), 196 deletions(-)
diff --git a/datafusion/core/tests/sql/mod.rs b/datafusion/core/tests/sql/mod.rs
index 140eeb91d1..981bdf34f5 100644
--- a/datafusion/core/tests/sql/mod.rs
+++ b/datafusion/core/tests/sql/mod.rs
@@ -73,66 +73,10 @@ pub mod explain_analyze;
pub mod expr;
pub mod joins;
pub mod partitioned_csv;
-pub mod references;
pub mod repartition;
pub mod select;
mod sql_api;
-fn create_join_context(
- column_left: &str,
- column_right: &str,
- repartition_joins: bool,
-) -> Result<SessionContext> {
- let ctx = SessionContext::new_with_config(
- SessionConfig::new()
- .with_repartition_joins(repartition_joins)
- .with_target_partitions(2)
- .with_batch_size(4096),
- );
-
- let t1_schema = Arc::new(Schema::new(vec![
- Field::new(column_left, DataType::UInt32, true),
- Field::new("t1_name", DataType::Utf8, true),
- Field::new("t1_int", DataType::UInt32, true),
- ]));
- let t1_data = RecordBatch::try_new(
- t1_schema,
- vec![
- Arc::new(UInt32Array::from(vec![11, 22, 33, 44])),
- Arc::new(StringArray::from(vec![
- Some("a"),
- Some("b"),
- Some("c"),
- Some("d"),
- ])),
- Arc::new(UInt32Array::from(vec![1, 2, 3, 4])),
- ],
- )?;
- ctx.register_batch("t1", t1_data)?;
-
- let t2_schema = Arc::new(Schema::new(vec![
- Field::new(column_right, DataType::UInt32, true),
- Field::new("t2_name", DataType::Utf8, true),
- Field::new("t2_int", DataType::UInt32, true),
- ]));
- let t2_data = RecordBatch::try_new(
- t2_schema,
- vec![
- Arc::new(UInt32Array::from(vec![11, 22, 44, 55])),
- Arc::new(StringArray::from(vec![
- Some("z"),
- Some("y"),
- Some("x"),
- Some("w"),
- ])),
- Arc::new(UInt32Array::from(vec![3, 1, 3, 3])),
- ],
- )?;
- ctx.register_batch("t2", t2_data)?;
-
- Ok(ctx)
-}
-
fn create_left_semi_anti_join_context_with_null_ids(
column_left: &str,
column_right: &str,
diff --git a/datafusion/core/tests/sql/references.rs
b/datafusion/core/tests/sql/references.rs
deleted file mode 100644
index f465e8a2da..0000000000
--- a/datafusion/core/tests/sql/references.rs
+++ /dev/null
@@ -1,140 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License. You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied. See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-use super::*;
-
-#[tokio::test]
-async fn qualified_table_references() -> Result<()> {
- let ctx = SessionContext::new();
- register_aggregate_csv(&ctx).await?;
-
- for table_ref in &[
- "aggregate_test_100",
- "public.aggregate_test_100",
- "datafusion.public.aggregate_test_100",
- ] {
- let sql = format!("SELECT COUNT(*) FROM {table_ref}");
- let actual = execute_to_batches(&ctx, &sql).await;
- let expected = [
- "+----------+",
- "| COUNT(*) |",
- "+----------+",
- "| 100 |",
- "+----------+",
- ];
- assert_batches_eq!(expected, &actual);
- }
- Ok(())
-}
-
-#[tokio::test]
-async fn qualified_table_references_and_fields() -> Result<()> {
- let ctx = SessionContext::new();
-
- let c1: StringArray = vec!["foofoo", "foobar", "foobaz"]
- .into_iter()
- .map(Some)
- .collect();
- let c2: Int64Array = vec![1, 2, 3].into_iter().map(Some).collect();
- let c3: Int64Array = vec![10, 20, 30].into_iter().map(Some).collect();
-
- let batch = RecordBatch::try_from_iter(vec![
- ("f.c1", Arc::new(c1) as ArrayRef),
- // evil -- use the same name as the table
- ("test.c2", Arc::new(c2) as ArrayRef),
- // more evil still
- ("....", Arc::new(c3) as ArrayRef),
- ])?;
-
- ctx.register_batch("test", batch)?;
-
- // referring to the unquoted column is an error
- let sql = r#"SELECT f1.c1 from test"#;
- let error = ctx.sql(sql).await.unwrap_err();
- assert_contains!(
- error.to_string(),
- r#"No field named f1.c1. Valid fields are test."f.c1", test."test.c2""#
- );
-
- // however, enclosing it in double quotes is ok
- let sql = r#"SELECT "f.c1" from test"#;
- let actual = execute_to_batches(&ctx, sql).await;
- let expected = [
- "+--------+",
- "| f.c1 |",
- "+--------+",
- "| foofoo |",
- "| foobar |",
- "| foobaz |",
- "+--------+",
- ];
- assert_batches_eq!(expected, &actual);
- // Works fully qualified too
- let sql = r#"SELECT test."f.c1" from test"#;
- let actual = execute_to_batches(&ctx, sql).await;
- assert_batches_eq!(expected, &actual);
-
- // check that duplicated table name and column name are ok
- let sql = r#"SELECT "test.c2" as expr1, test."test.c2" as expr2 from
test"#;
- let actual = execute_to_batches(&ctx, sql).await;
- let expected = [
- "+-------+-------+",
- "| expr1 | expr2 |",
- "+-------+-------+",
- "| 1 | 1 |",
- "| 2 | 2 |",
- "| 3 | 3 |",
- "+-------+-------+",
- ];
- assert_batches_eq!(expected, &actual);
-
- // check that '....' is also an ok column name (in the sense that
- // datafusion should run the query, not that someone should write
- // this
- let sql = r#"SELECT "....", "...." as c3 from test order by "....""#;
- let actual = execute_to_batches(&ctx, sql).await;
- let expected = [
- "+------+----+",
- "| .... | c3 |",
- "+------+----+",
- "| 10 | 10 |",
- "| 20 | 20 |",
- "| 30 | 30 |",
- "+------+----+",
- ];
- assert_batches_eq!(expected, &actual);
- Ok(())
-}
-
-#[tokio::test]
-async fn test_partial_qualified_name() -> Result<()> {
- let ctx = create_join_context("t1_id", "t2_id", true)?;
- let sql = "SELECT t1.t1_id, t1_name FROM public.t1";
- let expected = [
- "+-------+---------+",
- "| t1_id | t1_name |",
- "+-------+---------+",
- "| 11 | a |",
- "| 22 | b |",
- "| 33 | c |",
- "| 44 | d |",
- "+-------+---------+",
- ];
- let actual = execute_to_batches(&ctx, sql).await;
- assert_batches_eq!(expected, &actual);
- Ok(())
-}
diff --git a/datafusion/sqllogictest/test_files/references.slt
b/datafusion/sqllogictest/test_files/references.slt
new file mode 100644
index 0000000000..c09addb3ee
--- /dev/null
+++ b/datafusion/sqllogictest/test_files/references.slt
@@ -0,0 +1,134 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+
+# http://www.apache.org/licenses/LICENSE-2.0
+
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+##########
+## References Tests
+##########
+
+
+# Qualified table references
+# Query tables with catalog prefix
+statement ok
+CREATE EXTERNAL TABLE aggregate_test_100 (
+ c1 VARCHAR NOT NULL,
+ c2 TINYINT NOT NULL,
+ c3 SMALLINT NOT NULL,
+ c4 SMALLINT,
+ c5 INT,
+ c6 BIGINT NOT NULL,
+ c7 SMALLINT NOT NULL,
+ c8 INT NOT NULL,
+ c9 BIGINT UNSIGNED NOT NULL,
+ c10 VARCHAR NOT NULL,
+ c11 FLOAT NOT NULL,
+ c12 DOUBLE NOT NULL,
+ c13 VARCHAR NOT NULL
+)
+STORED AS CSV
+WITH HEADER ROW
+LOCATION '../../testing/data/csv/aggregate_test_100.csv'
+
+query I
+SELECT COUNT(*) FROM aggregate_test_100;
+----
+100
+
+query I
+SELECT COUNT(*) FROM public.aggregate_test_100;
+----
+100
+
+query I
+SELECT COUNT(*) FROM datafusion.public.aggregate_test_100;
+----
+100
+
+
+# Qualified table references and fields
+# Query fields with prefixes
+statement ok
+CREATE TABLE test("f.c1" TEXT, "test.c2" INT, "...." INT) AS VALUES
+('foofoo', 1, 10),
+('foobar', 2, 20),
+('foobaz', 3, 30);
+
+query error DataFusion error: Schema error: No field named f1\.c1\. Valid
fields are test\."f\.c1", test\."test\.c2", test\."\.\.\.\."\.
+SELECT f1.c1 FROM test;
+
+query T
+SELECT "f.c1" FROM test
+----
+foofoo
+foobar
+foobaz
+
+query T
+SELECT test."f.c1" FROM test
+----
+foofoo
+foobar
+foobaz
+
+query II
+SELECT "test.c2" AS expr1, test."test.c2" AS expr2 FROM test
+----
+1 1
+2 2
+3 3
+
+query II
+SELECT "....", "...." AS c3 FROM test ORDER BY "...."
+----
+10 10
+20 20
+30 30
+
+query TT
+EXPLAIN (SELECT "....", "...." AS c3 FROM test ORDER BY "....");
+----
+logical_plan
+Sort: test..... ASC NULLS LAST
+--Projection: test....., test..... AS c3
+----TableScan: test projection=[....]
+physical_plan
+SortExec: expr=[....@0 ASC NULLS LAST]
+--ProjectionExec: expr=[....@0 as ...., ....@0 as c3]
+----MemoryExec: partitions=1, partition_sizes=[1]
+
+
+# Partial qualified name
+statement ok
+CREATE TABLE t1(t1_id INT, t1_name TEXT, t1_int INT) AS VALUES
+(11, 'a', 1),
+(22, 'b', 2),
+(33, 'c', 3),
+(44, 'd', 3);
+
+statement ok
+CREATE TABLE t2(t2_id INT, t2_name TEXT, t2_int INT) AS VALUES
+(11, 'z', 3),
+(22, 'y', 1),
+(44, 'x', 3),
+(55, 'w', 3);
+
+query IT
+SELECT t1.t1_id, t1_name FROM public.t1;
+----
+11 a
+22 b
+33 c
+44 d