This is an automated email from the ASF dual-hosted git repository.
alamb pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/arrow-datafusion.git
The following commit(s) were added to refs/heads/master by this push:
new c32372119 chore: add object_name_to_table_reference in SqlToRel (#5155)
c32372119 is described below
commit c323721192ba2733a56c4201b2255a36b1eaa859
Author: Jiacai Liu <[email protected]>
AuthorDate: Sat Feb 4 04:33:45 2023 +0800
chore: add object_name_to_table_reference in SqlToRel (#5155)
* chore: add object_name_to_table_reference in SqlToRel
* update docs
* fix broken CI
---
datafusion/common/src/config.rs | 5 ++-
.../src/engines/datafusion/create_table.rs | 4 +-
.../test_files/information_schema.slt | 4 +-
datafusion/sql/src/planner.rs | 11 +++++
datafusion/sql/src/relation/mod.rs | 9 +---
datafusion/sql/src/statement.rs | 48 +++++-----------------
docs/source/user-guide/configs.md | 2 +
7 files changed, 33 insertions(+), 50 deletions(-)
diff --git a/datafusion/common/src/config.rs b/datafusion/common/src/config.rs
index 661109416..112e9f3e2 100644
--- a/datafusion/common/src/config.rs
+++ b/datafusion/common/src/config.rs
@@ -181,10 +181,10 @@ config_namespace! {
config_namespace! {
/// Options related to SQL parser
pub struct SqlParserOptions {
- /// Whether to parse float as decimal
+ /// When set to true, sql parser will parse float as decimal type
pub parse_float_as_decimal: bool, default = false
- /// Whether to normalize ident
+ /// When set to true, sql parser will normalize ident(convert ident to
lowercase when not quoted)
pub enable_ident_normalization: bool, default = true
}
@@ -375,6 +375,7 @@ impl ConfigField for ConfigOptions {
self.execution.visit(v, "datafusion.execution", "");
self.optimizer.visit(v, "datafusion.optimizer", "");
self.explain.visit(v, "datafusion.explain", "");
+ self.sql_parser.visit(v, "datafusion.sql_parser", "");
}
}
diff --git
a/datafusion/core/tests/sqllogictests/src/engines/datafusion/create_table.rs
b/datafusion/core/tests/sqllogictests/src/engines/datafusion/create_table.rs
index 4504d3d1d..9b43b98cb 100644
--- a/datafusion/core/tests/sqllogictests/src/engines/datafusion/create_table.rs
+++ b/datafusion/core/tests/sqllogictests/src/engines/datafusion/create_table.rs
@@ -21,7 +21,7 @@ use
crate::engines::datafusion::util::LogicTestContextProvider;
use datafusion::datasource::MemTable;
use datafusion::prelude::SessionContext;
use datafusion_common::{DataFusionError, OwnedTableReference};
-use datafusion_sql::planner::{object_name_to_table_reference, SqlToRel};
+use datafusion_sql::planner::{object_name_to_table_reference, ParserOptions,
SqlToRel};
use sqllogictest::DBOutput;
use sqlparser::ast::{ColumnDef, ObjectName};
use std::sync::Arc;
@@ -64,7 +64,7 @@ fn create_new_table(
let config = ctx.copied_config();
let sql_to_rel = SqlToRel::new_with_options(
&LogicTestContextProvider {},
- datafusion_sql::planner::ParserOptions {
+ ParserOptions {
parse_float_as_decimal: config
.config_options()
.sql_parser
diff --git
a/datafusion/core/tests/sqllogictests/test_files/information_schema.slt
b/datafusion/core/tests/sqllogictests/test_files/information_schema.slt
index 99b096de1..4b1c0bc0e 100644
--- a/datafusion/core/tests/sqllogictests/test_files/information_schema.slt
+++ b/datafusion/core/tests/sqllogictests/test_files/information_schema.slt
@@ -137,6 +137,8 @@ datafusion.optimizer.repartition_joins true
datafusion.optimizer.repartition_windows true
datafusion.optimizer.skip_failed_rules true
datafusion.optimizer.top_down_join_key_reordering true
+datafusion.sql_parser.enable_ident_normalization true
+datafusion.sql_parser.parse_float_as_decimal false
# show_variable_in_config_options
query R
@@ -366,4 +368,4 @@ WITH HEADER ROW LOCATION
'../../testing/data/csv/aggregate_test_100.csv';
query CCCC
SHOW CREATE TABLE abc;
----
-datafusion public abc CREATE EXTERNAL TABLE abc STORED AS CSV LOCATION
../../testing/data/csv/aggregate_test_100.csv
\ No newline at end of file
+datafusion public abc CREATE EXTERNAL TABLE abc STORED AS CSV LOCATION
../../testing/data/csv/aggregate_test_100.csv
diff --git a/datafusion/sql/src/planner.rs b/datafusion/sql/src/planner.rs
index 759a4940c..e9252db9f 100644
--- a/datafusion/sql/src/planner.rs
+++ b/datafusion/sql/src/planner.rs
@@ -231,6 +231,7 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
other => self.convert_simple_data_type(other),
}
}
+
fn convert_simple_data_type(&self, sql_type: &SQLDataType) ->
Result<DataType> {
match sql_type {
SQLDataType::Boolean => Ok(DataType::Boolean),
@@ -322,6 +323,16 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
))),
}
}
+
+ pub(crate) fn object_name_to_table_reference(
+ &self,
+ object_name: ObjectName,
+ ) -> Result<OwnedTableReference> {
+ object_name_to_table_reference(
+ object_name,
+ self.options.enable_ident_normalization,
+ )
+ }
}
/// Create a [`OwnedTableReference`] after normalizing the specified ObjectName
diff --git a/datafusion/sql/src/relation/mod.rs
b/datafusion/sql/src/relation/mod.rs
index f0bba7f50..12f5bd6b4 100644
--- a/datafusion/sql/src/relation/mod.rs
+++ b/datafusion/sql/src/relation/mod.rs
@@ -15,9 +15,7 @@
// specific language governing permissions and limitations
// under the License.
-use crate::planner::{
- object_name_to_table_reference, ContextProvider, PlannerContext, SqlToRel,
-};
+use crate::planner::{ContextProvider, PlannerContext, SqlToRel};
use datafusion_common::{DataFusionError, Result};
use datafusion_expr::{LogicalPlan, LogicalPlanBuilder};
use sqlparser::ast::TableFactor;
@@ -33,10 +31,7 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
let (plan, alias) = match relation {
TableFactor::Table { name, alias, .. } => {
// normalize name and alias
- let table_ref = object_name_to_table_reference(
- name,
- self.options.enable_ident_normalization,
- )?;
+ let table_ref = self.object_name_to_table_reference(name)?;
let table_name = table_ref.to_string();
let cte = planner_context.ctes.get(&table_name);
(
diff --git a/datafusion/sql/src/statement.rs b/datafusion/sql/src/statement.rs
index 92aefa062..ebbafbd5d 100644
--- a/datafusion/sql/src/statement.rs
+++ b/datafusion/sql/src/statement.rs
@@ -19,8 +19,7 @@ use crate::parser::{
CreateExternalTable, DFParser, DescribeTableStmt, Statement as DFStatement,
};
use crate::planner::{
- object_name_to_qualifier, object_name_to_table_reference, ContextProvider,
- PlannerContext, SqlToRel,
+ object_name_to_qualifier, ContextProvider, PlannerContext, SqlToRel,
};
use crate::utils::normalize_ident;
use arrow_schema::DataType;
@@ -158,10 +157,7 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
};
Ok(LogicalPlan::CreateMemoryTable(CreateMemoryTable {
- name: object_name_to_table_reference(
- name,
- self.options.enable_ident_normalization,
- )?,
+ name: self.object_name_to_table_reference(name)?,
input: Arc::new(plan),
if_not_exists,
or_replace,
@@ -179,10 +175,7 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
plan = self.apply_expr_alias(plan, columns)?;
Ok(LogicalPlan::CreateView(CreateView {
- name: object_name_to_table_reference(
- name,
- self.options.enable_ident_normalization,
- )?,
+ name: self.object_name_to_table_reference(name)?,
input: Arc::new(plan),
or_replace,
definition: sql,
@@ -227,10 +220,7 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
// nor do we support multiple object names
let name = match names.len() {
0 => Err(ParserError("Missing table
name.".to_string()).into()),
- 1 => object_name_to_table_reference(
- names.pop().unwrap(),
- self.options.enable_ident_normalization,
- ),
+ 1 =>
self.object_name_to_table_reference(names.pop().unwrap()),
_ => {
Err(ParserError("Multiple objects not
supported".to_string())
.into())
@@ -421,10 +411,7 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
statement: DescribeTableStmt,
) -> Result<LogicalPlan> {
let DescribeTableStmt { table_name } = statement;
- let table_ref = object_name_to_table_reference(
- table_name,
- self.options.enable_ident_normalization,
- )?;
+ let table_ref = self.object_name_to_table_reference(table_name)?;
let table_source = self
.schema_provider
@@ -643,10 +630,7 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
};
// Do a table lookup to verify the table exists
- let table_ref = object_name_to_table_reference(
- table_name.clone(),
- self.options.enable_ident_normalization,
- )?;
+ let table_ref =
self.object_name_to_table_reference(table_name.clone())?;
let provider = self
.schema_provider
.get_table_provider((&table_ref).into())?;
@@ -698,10 +682,7 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
};
// Do a table lookup to verify the table exists
- let table_name = object_name_to_table_reference(
- table_name,
- self.options.enable_ident_normalization,
- )?;
+ let table_name = self.object_name_to_table_reference(table_name)?;
let provider = self
.schema_provider
.get_table_provider((&table_name).into())?;
@@ -803,10 +784,7 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
source: Box<Query>,
) -> Result<LogicalPlan> {
// Do a table lookup to verify the table exists
- let table_name = object_name_to_table_reference(
- table_name,
- self.options.enable_ident_normalization,
- )?;
+ let table_name = self.object_name_to_table_reference(table_name)?;
let provider = self
.schema_provider
.get_table_provider((&table_name).into())?;
@@ -914,10 +892,7 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
);
// Do a table lookup to verify the table exists
- let table_ref = object_name_to_table_reference(
- sql_table_name,
- self.options.enable_ident_normalization,
- )?;
+ let table_ref = self.object_name_to_table_reference(sql_table_name)?;
let _ = self
.schema_provider
.get_table_provider((&table_ref).into())?;
@@ -955,10 +930,7 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
);
// Do a table lookup to verify the table exists
- let table_ref = object_name_to_table_reference(
- sql_table_name,
- self.options.enable_ident_normalization,
- )?;
+ let table_ref = self.object_name_to_table_reference(sql_table_name)?;
let _ = self
.schema_provider
.get_table_provider((&table_ref).into())?;
diff --git a/docs/source/user-guide/configs.md
b/docs/source/user-guide/configs.md
index cb8478f44..bd5b69467 100644
--- a/docs/source/user-guide/configs.md
+++ b/docs/source/user-guide/configs.md
@@ -69,3 +69,5 @@ Environment variables are read during `SessionConfig`
initialisation so they mus
| datafusion.optimizer.hash_join_single_partition_threshold | 1048576 | The
maximum estimated size in bytes for one input side of a HashJoin will be
collected into a single partition
|
| datafusion.explain.logical_plan_only | false |
When set to true, the explain statement will only print logical plans
|
| datafusion.explain.physical_plan_only | false |
When set to true, the explain statement will only print physical plans
|
+| datafusion.sql_parser.parse_float_as_decimal | false |
When set to true, sql parser will parse float as decimal type
|
+| datafusion.sql_parser.enable_ident_normalization | true |
When set to true, sql parser will normalize ident(convert ident to lowercase
when not quoted)
|