1
1
use sqlparser:: ast:: * ;
2
- use sqlparser:: dialect:: DatabricksDialect ;
2
+ use sqlparser:: dialect:: { DatabricksDialect , GenericDialect } ;
3
3
use sqlparser:: parser:: ParserError ;
4
4
use test_utils:: * ;
5
5
@@ -13,6 +13,13 @@ fn databricks() -> TestedDialects {
13
13
}
14
14
}
15
15
16
+ fn databricks_and_generic ( ) -> TestedDialects {
17
+ TestedDialects {
18
+ dialects : vec ! [ Box :: new( DatabricksDialect { } ) , Box :: new( GenericDialect { } ) ] ,
19
+ options : None ,
20
+ }
21
+ }
22
+
16
23
#[ test]
17
24
fn test_databricks_identifiers ( ) {
18
25
// databricks uses backtick for delimited identifiers
@@ -124,3 +131,60 @@ fn test_databricks_lambdas() {
124
131
) ;
125
132
databricks ( ) . verified_expr ( "transform(array(1, 2, 3), x -> x + 1)" ) ;
126
133
}
134
+
135
+ #[ test]
136
+ fn test_values_clause ( ) {
137
+ let values = Values {
138
+ explicit_row : false ,
139
+ rows : vec ! [
140
+ vec![
141
+ Expr :: Value ( Value :: DoubleQuotedString ( "one" . to_owned( ) ) ) ,
142
+ Expr :: Value ( number( "1" ) ) ,
143
+ ] ,
144
+ vec![
145
+ Expr :: Value ( Value :: SingleQuotedString ( "two" . to_owned( ) ) ) ,
146
+ Expr :: Value ( number( "2" ) ) ,
147
+ ] ,
148
+ ] ,
149
+ } ;
150
+
151
+ let query = databricks ( ) . verified_query ( r#"VALUES ("one", 1), ('two', 2)"# ) ;
152
+ assert_eq ! ( SetExpr :: Values ( values. clone( ) ) , * query. body) ;
153
+
154
+ // VALUES is permitted in a FROM clause without a subquery
155
+ let query = databricks ( ) . verified_query_with_canonical (
156
+ r#"SELECT * FROM VALUES ("one", 1), ('two', 2)"# ,
157
+ r#"SELECT * FROM (VALUES ("one", 1), ('two', 2))"# ,
158
+ ) ;
159
+ let Some ( TableFactor :: Derived { subquery, .. } ) = query
160
+ . body
161
+ . as_select ( )
162
+ . map ( |select| & select. from [ 0 ] . relation )
163
+ else {
164
+ panic ! ( "expected subquery" ) ;
165
+ } ;
166
+ assert_eq ! ( SetExpr :: Values ( values) , * subquery. body) ;
167
+
168
+ // values is also a valid table name
169
+ let query = databricks_and_generic ( ) . verified_query ( concat ! (
170
+ "WITH values AS (SELECT 42) " ,
171
+ "SELECT * FROM values" ,
172
+ ) ) ;
173
+ assert_eq ! (
174
+ Some ( & TableFactor :: Table {
175
+ name: ObjectName ( vec![ Ident :: new( "values" ) ] ) ,
176
+ alias: None ,
177
+ args: None ,
178
+ with_hints: vec![ ] ,
179
+ version: None ,
180
+ partitions: vec![ ]
181
+ } ) ,
182
+ query
183
+ . body
184
+ . as_select( )
185
+ . map( |select| & select. from[ 0 ] . relation)
186
+ ) ;
187
+
188
+ // TODO: support this example from https://docs.databricks.com/en/sql/language-manual/sql-ref-syntax-qry-select-values.html#examples
189
+ // databricks().verified_query("VALUES 1, 2, 3");
190
+ }
0 commit comments