1515use catalog:: CatalogManagerRef ;
1616use common_query:: Output ;
1717use datatypes:: data_type:: DataType ;
18- use datatypes:: prelude :: ConcreteDataType ;
18+ use datatypes:: schema :: ColumnSchema ;
1919use datatypes:: vectors:: MutableVector ;
2020use snafu:: { ensure, OptionExt , ResultExt } ;
2121use sql:: ast:: Value as SqlValue ;
@@ -25,11 +25,14 @@ use table::engine::TableReference;
2525use table:: requests:: * ;
2626
2727use crate :: error:: {
28- CatalogSnafu , ColumnNotFoundSnafu , ColumnValuesNumberMismatchSnafu , InsertSnafu ,
29- ParseSqlValueSnafu , Result , TableNotFoundSnafu ,
28+ CatalogSnafu , ColumnDefaultValueSnafu , ColumnNoneDefaultValueSnafu , ColumnNotFoundSnafu ,
29+ ColumnValuesNumberMismatchSnafu , InsertSnafu , ParseSqlSnafu , ParseSqlValueSnafu , Result ,
30+ TableNotFoundSnafu ,
3031} ;
3132use crate :: sql:: { SqlHandler , SqlRequest } ;
3233
34+ const DEFAULT_PLACEHOLDER_VALUE : & str = "default" ;
35+
3336impl SqlHandler {
3437 pub ( crate ) async fn insert ( & self , req : InsertRequest ) -> Result < Output > {
3538 // FIXME(dennis): table_ref is used in InsertSnafu and the req is consumed
@@ -72,17 +75,13 @@ impl SqlHandler {
7275 } ;
7376 let rows_num = values. len ( ) ;
7477
75- let mut columns_builders: Vec < ( & String , & ConcreteDataType , Box < dyn MutableVector > ) > =
78+ let mut columns_builders: Vec < ( & ColumnSchema , Box < dyn MutableVector > ) > =
7679 Vec :: with_capacity ( columns_num) ;
7780
7881 if columns. is_empty ( ) {
7982 for column_schema in schema. column_schemas ( ) {
8083 let data_type = & column_schema. data_type ;
81- columns_builders. push ( (
82- & column_schema. name ,
83- data_type,
84- data_type. create_mutable_vector ( rows_num) ,
85- ) ) ;
84+ columns_builders. push ( ( column_schema, data_type. create_mutable_vector ( rows_num) ) ) ;
8685 }
8786 } else {
8887 for column_name in columns {
@@ -94,11 +93,7 @@ impl SqlHandler {
9493 }
9594 } ) ?;
9695 let data_type = & column_schema. data_type ;
97- columns_builders. push ( (
98- column_name,
99- data_type,
100- data_type. create_mutable_vector ( rows_num) ,
101- ) ) ;
96+ columns_builders. push ( ( column_schema, data_type. create_mutable_vector ( rows_num) ) ) ;
10297 }
10398 }
10499
@@ -112,10 +107,8 @@ impl SqlHandler {
112107 }
113108 ) ;
114109
115- for ( sql_val, ( column_name, data_type, builder) ) in
116- row. iter ( ) . zip ( columns_builders. iter_mut ( ) )
117- {
118- add_row_to_vector ( column_name, data_type, sql_val, builder) ?;
110+ for ( sql_val, ( column_schema, builder) ) in row. iter ( ) . zip ( columns_builders. iter_mut ( ) ) {
111+ add_row_to_vector ( column_schema, sql_val, builder) ?;
119112 }
120113 }
121114
@@ -125,21 +118,34 @@ impl SqlHandler {
125118 table_name : table_ref. table . to_string ( ) ,
126119 columns_values : columns_builders
127120 . into_iter ( )
128- . map ( |( c , _ , mut b) | ( c . to_owned ( ) , b. to_vector ( ) ) )
121+ . map ( |( cs , mut b) | ( cs . name . to_string ( ) , b. to_vector ( ) ) )
129122 . collect ( ) ,
130123 } ) )
131124 }
132125}
133126
134127fn add_row_to_vector (
135- column_name : & str ,
136- data_type : & ConcreteDataType ,
128+ column_schema : & ColumnSchema ,
137129 sql_val : & SqlValue ,
138130 builder : & mut Box < dyn MutableVector > ,
139131) -> Result < ( ) > {
140- let value = statements:: sql_value_to_value ( column_name, data_type, sql_val)
141- . context ( ParseSqlValueSnafu ) ?;
132+ let value = if replace_default ( sql_val) {
133+ column_schema
134+ . create_default ( )
135+ . context ( ColumnDefaultValueSnafu {
136+ column : column_schema. name . to_string ( ) ,
137+ } ) ?
138+ . context ( ColumnNoneDefaultValueSnafu {
139+ column : column_schema. name . to_string ( ) ,
140+ } ) ?
141+ } else {
142+ statements:: sql_value_to_value ( & column_schema. name , & column_schema. data_type , sql_val)
143+ . context ( ParseSqlSnafu ) ?
144+ } ;
142145 builder. push_value_ref ( value. as_value_ref ( ) ) . unwrap ( ) ;
143-
144146 Ok ( ( ) )
145147}
148+
149+ fn replace_default ( sql_val : & SqlValue ) -> bool {
150+ matches ! ( sql_val, SqlValue :: Placeholder ( s) if s. to_lowercase( ) == DEFAULT_PLACEHOLDER_VALUE )
151+ }
0 commit comments