@@ -28,7 +28,7 @@ use test_utils::*;
2828use sqlparser:: ast:: Expr :: { BinaryOp , Identifier } ;
2929use sqlparser:: ast:: SelectItem :: UnnamedExpr ;
3030use sqlparser:: ast:: TableFactor :: Table ;
31- use sqlparser:: ast:: Value :: Number ;
31+ use sqlparser:: ast:: Value :: Boolean ;
3232use sqlparser:: ast:: * ;
3333use sqlparser:: dialect:: ClickHouseDialect ;
3434use sqlparser:: dialect:: GenericDialect ;
@@ -961,38 +961,107 @@ fn parse_limit_by() {
961961
962962#[ test]
963963fn parse_settings_in_query ( ) {
964- match clickhouse_and_generic ( )
965- . verified_stmt ( r#"SELECT * FROM t SETTINGS max_threads = 1, max_block_size = 10000"# )
966- {
967- Statement :: Query ( query) => {
968- assert_eq ! (
969- query. settings,
970- Some ( vec![
971- Setting {
972- key: Ident :: new( "max_threads" ) ,
973- value: Number ( "1" . parse( ) . unwrap( ) , false )
974- } ,
975- Setting {
976- key: Ident :: new( "max_block_size" ) ,
977- value: Number ( "10000" . parse( ) . unwrap( ) , false )
978- } ,
979- ] )
980- ) ;
964+ fn check_settings ( sql : & str , expected : Vec < Setting > ) {
965+ match clickhouse_and_generic ( ) . verified_stmt ( sql) {
966+ Statement :: Query ( q) => {
967+ assert_eq ! ( q. settings, Some ( expected) ) ;
968+ }
969+ _ => unreachable ! ( ) ,
981970 }
982- _ => unreachable ! ( ) ,
971+ }
972+
973+ for ( sql, expected_settings) in vec ! [
974+ (
975+ r#"SELECT * FROM t SETTINGS max_threads = 1, max_block_size = 10000"# ,
976+ vec![
977+ Setting {
978+ key: Ident :: new( "max_threads" ) ,
979+ value: Expr :: value( number( "1" ) ) ,
980+ } ,
981+ Setting {
982+ key: Ident :: new( "max_block_size" ) ,
983+ value: Expr :: value( number( "10000" ) ) ,
984+ } ,
985+ ] ,
986+ ) ,
987+ (
988+ r#"SELECT * FROM t SETTINGS additional_table_filters = {'table_1': 'x != 2'}"# ,
989+ vec![ Setting {
990+ key: Ident :: new( "additional_table_filters" ) ,
991+ value: Expr :: Dictionary ( vec![ DictionaryField {
992+ key: Ident :: with_quote( '\'' , "table_1" ) ,
993+ value: Expr :: value( single_quoted_string( "x != 2" ) ) . into( ) ,
994+ } ] ) ,
995+ } ] ,
996+ ) ,
997+ (
998+ r#"SELECT * FROM t SETTINGS additional_result_filter = 'x != 2', query_plan_optimize_lazy_materialization = false"# ,
999+ vec![
1000+ Setting {
1001+ key: Ident :: new( "additional_result_filter" ) ,
1002+ value: Expr :: value( single_quoted_string( "x != 2" ) ) ,
1003+ } ,
1004+ Setting {
1005+ key: Ident :: new( "query_plan_optimize_lazy_materialization" ) ,
1006+ value: Expr :: value( Boolean ( false ) ) ,
1007+ } ,
1008+ ] ,
1009+ ) ,
1010+ ] {
1011+ check_settings ( sql, expected_settings) ;
9831012 }
9841013
9851014 let invalid_cases = vec ! [
986- "SELECT * FROM t SETTINGS a" ,
987- "SELECT * FROM t SETTINGS a=" ,
988- "SELECT * FROM t SETTINGS a=1, b" ,
989- "SELECT * FROM t SETTINGS a=1, b=" ,
990- "SELECT * FROM t SETTINGS a=1, b=c" ,
1015+ ( "SELECT * FROM t SETTINGS a" , "Expected: =, found: EOF" ) ,
1016+ (
1017+ "SELECT * FROM t SETTINGS a=" ,
1018+ "Expected: a value, found: EOF" ,
1019+ ) ,
1020+ ( "SELECT * FROM t SETTINGS a=1, b" , "Expected: =, found: EOF" ) ,
1021+ (
1022+ "SELECT * FROM t SETTINGS a=1, b=" ,
1023+ "Expected: a value, found: EOF" ,
1024+ ) ,
1025+ (
1026+ "SELECT * FROM t SETTINGS a=1, b=c" ,
1027+ "Expected: a concrete value, found: c" ,
1028+ ) ,
1029+ (
1030+ "SELECT * FROM t SETTINGS a = {" ,
1031+ "Expected: identifier, found: EOF" ,
1032+ ) ,
1033+ (
1034+ "SELECT * FROM t SETTINGS a = {'b'" ,
1035+ "Expected: :, found: EOF" ,
1036+ ) ,
1037+ (
1038+ "SELECT * FROM t SETTINGS a = {'b': " ,
1039+ "Expected: an expression, found: EOF" ,
1040+ ) ,
1041+ (
1042+ "SELECT * FROM t SETTINGS a = {'b': 'c',}" ,
1043+ "Expected: identifier, found: }" ,
1044+ ) ,
1045+ (
1046+ "SELECT * FROM t SETTINGS a = {'b': 'c', 'd'}" ,
1047+ "Expected: :, found: }" ,
1048+ ) ,
1049+ (
1050+ "SELECT * FROM t SETTINGS a = {'b': 'c', 'd': }" ,
1051+ "Expected: an expression, found: }" ,
1052+ ) ,
1053+ (
1054+ "SELECT * FROM t SETTINGS a = {ANY(b)}" ,
1055+ "Expected: :, found: (" ,
1056+ ) ,
9911057 ] ;
992- for sql in invalid_cases {
993- clickhouse_and_generic ( )
994- . parse_sql_statements ( sql)
995- . expect_err ( "Expected: SETTINGS key = value, found: " ) ;
1058+ for ( sql, error_msg) in invalid_cases {
1059+ assert_eq ! (
1060+ clickhouse_and_generic( )
1061+ . parse_sql_statements( sql)
1062+ . unwrap_err( ) ,
1063+ ParserError ( error_msg. to_string( ) )
1064+ ) ;
9961065 }
9971066}
9981067#[ test]
@@ -1546,11 +1615,11 @@ fn parse_select_table_function_settings() {
15461615 settings : Some ( vec ! [
15471616 Setting {
15481617 key: "s0" . into( ) ,
1549- value: Value :: Number ( "3" . parse ( ) . unwrap ( ) , false ) ,
1618+ value: Expr :: value ( number ( "3" ) ) ,
15501619 } ,
15511620 Setting {
15521621 key: "s1" . into( ) ,
1553- value: Value :: SingleQuotedString ( "s" . into ( ) ) ,
1622+ value: Expr :: value ( single_quoted_string ( "s" ) ) ,
15541623 } ,
15551624 ] ) ,
15561625 } ,
@@ -1571,11 +1640,11 @@ fn parse_select_table_function_settings() {
15711640 settings : Some ( vec ! [
15721641 Setting {
15731642 key: "s0" . into( ) ,
1574- value: Value :: Number ( "3" . parse ( ) . unwrap ( ) , false ) ,
1643+ value: Expr :: value ( number ( "3" ) ) ,
15751644 } ,
15761645 Setting {
15771646 key: "s1" . into( ) ,
1578- value: Value :: SingleQuotedString ( "s" . into ( ) ) ,
1647+ value: Expr :: value ( single_quoted_string ( "s" ) ) ,
15791648 } ,
15801649 ] ) ,
15811650 } ,
0 commit comments