@@ -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 ;
@@ -965,38 +965,103 @@ fn parse_limit_by() {
965965
966966#[ test]
967967fn parse_settings_in_query ( ) {
968- match clickhouse_and_generic ( )
969- . verified_stmt ( r#"SELECT * FROM t SETTINGS max_threads = 1, max_block_size = 10000"# )
970- {
971- Statement :: Query ( query) => {
972- assert_eq ! (
973- query. settings,
974- Some ( vec![
975- Setting {
976- key: Ident :: new( "max_threads" ) ,
977- value: Number ( "1" . parse( ) . unwrap( ) , false )
978- } ,
979- Setting {
980- key: Ident :: new( "max_block_size" ) ,
981- value: Number ( "10000" . parse( ) . unwrap( ) , false )
982- } ,
983- ] )
984- ) ;
968+ fn check_settings ( sql : & str , expected : Vec < Setting > ) {
969+ match clickhouse_and_generic ( ) . verified_stmt ( sql) {
970+ Statement :: Query ( q) => {
971+ assert_eq ! ( q. settings, Some ( expected) ) ;
972+ }
973+ _ => unreachable ! ( ) ,
985974 }
986- _ => unreachable ! ( ) ,
975+ }
976+
977+ for ( sql, expected_settings) in [
978+ (
979+ r#"SELECT * FROM t SETTINGS max_threads = 1, max_block_size = 10000"# ,
980+ vec ! [
981+ Setting {
982+ key: Ident :: new( "max_threads" ) ,
983+ value: Expr :: value( number( "1" ) ) ,
984+ } ,
985+ Setting {
986+ key: Ident :: new( "max_block_size" ) ,
987+ value: Expr :: value( number( "10000" ) ) ,
988+ } ,
989+ ] ,
990+ ) ,
991+ (
992+ r#"SELECT * FROM t SETTINGS additional_table_filters = {'table_1': 'x != 2'}"# ,
993+ vec ! [ Setting {
994+ key: Ident :: new( "additional_table_filters" ) ,
995+ value: Expr :: Dictionary ( vec![ DictionaryField {
996+ key: Ident :: with_quote( '\'' , "table_1" ) ,
997+ value: Expr :: value( single_quoted_string( "x != 2" ) ) . into( ) ,
998+ } ] ) ,
999+ } ] ,
1000+ ) ,
1001+ (
1002+ r#"SELECT * FROM t SETTINGS additional_result_filter = 'x != 2', query_plan_optimize_lazy_materialization = false"# ,
1003+ vec ! [
1004+ Setting {
1005+ key: Ident :: new( "additional_result_filter" ) ,
1006+ value: Expr :: value( single_quoted_string( "x != 2" ) ) ,
1007+ } ,
1008+ Setting {
1009+ key: Ident :: new( "query_plan_optimize_lazy_materialization" ) ,
1010+ value: Expr :: value( Boolean ( false ) ) ,
1011+ } ,
1012+ ] ,
1013+ ) ,
1014+ ] {
1015+ check_settings ( sql, expected_settings) ;
9871016 }
9881017
9891018 let invalid_cases = vec ! [
990- "SELECT * FROM t SETTINGS a" ,
991- "SELECT * FROM t SETTINGS a=" ,
992- "SELECT * FROM t SETTINGS a=1, b" ,
993- "SELECT * FROM t SETTINGS a=1, b=" ,
994- "SELECT * FROM t SETTINGS a=1, b=c" ,
1019+ ( "SELECT * FROM t SETTINGS a" , "Expected: =, found: EOF" ) ,
1020+ (
1021+ "SELECT * FROM t SETTINGS a=" ,
1022+ "Expected: an expression, found: EOF" ,
1023+ ) ,
1024+ ( "SELECT * FROM t SETTINGS a=1, b" , "Expected: =, found: EOF" ) ,
1025+ (
1026+ "SELECT * FROM t SETTINGS a=1, b=" ,
1027+ "Expected: an expression, found: EOF" ,
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+ ) ,
9951057 ] ;
996- for sql in invalid_cases {
997- clickhouse_and_generic ( )
998- . parse_sql_statements ( sql)
999- . 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+ ) ;
10001065 }
10011066}
10021067#[ test]
@@ -1550,11 +1615,11 @@ fn parse_select_table_function_settings() {
15501615 settings : Some ( vec ! [
15511616 Setting {
15521617 key: "s0" . into( ) ,
1553- value: Value :: Number ( "3" . parse ( ) . unwrap ( ) , false ) ,
1618+ value: Expr :: value ( number ( "3" ) ) ,
15541619 } ,
15551620 Setting {
15561621 key: "s1" . into( ) ,
1557- value: Value :: SingleQuotedString ( "s" . into ( ) ) ,
1622+ value: Expr :: value ( single_quoted_string ( "s" ) ) ,
15581623 } ,
15591624 ] ) ,
15601625 } ,
@@ -1575,11 +1640,11 @@ fn parse_select_table_function_settings() {
15751640 settings : Some ( vec ! [
15761641 Setting {
15771642 key: "s0" . into( ) ,
1578- value: Value :: Number ( "3" . parse ( ) . unwrap ( ) , false ) ,
1643+ value: Expr :: value ( number ( "3" ) ) ,
15791644 } ,
15801645 Setting {
15811646 key: "s1" . into( ) ,
1582- value: Value :: SingleQuotedString ( "s" . into ( ) ) ,
1647+ value: Expr :: value ( single_quoted_string ( "s" ) ) ,
15831648 } ,
15841649 ] ) ,
15851650 } ,
@@ -1589,7 +1654,6 @@ fn parse_select_table_function_settings() {
15891654 "SELECT * FROM t(SETTINGS a=)" ,
15901655 "SELECT * FROM t(SETTINGS a=1, b)" ,
15911656 "SELECT * FROM t(SETTINGS a=1, b=)" ,
1592- "SELECT * FROM t(SETTINGS a=1, b=c)" ,
15931657 ] ;
15941658 for sql in invalid_cases {
15951659 clickhouse_and_generic ( )
0 commit comments