@@ -1069,24 +1069,107 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
1069
1069
}
1070
1070
}
1071
1071
1072
+ fn parse_sql_binary_op (
1073
+ & self ,
1074
+ left : & SQLExpr ,
1075
+ op : & BinaryOperator ,
1076
+ right : & SQLExpr ,
1077
+ schema : & DFSchema ,
1078
+ ) -> Result < Expr > {
1079
+ let operator = match * op {
1080
+ BinaryOperator :: Gt => Ok ( Operator :: Gt ) ,
1081
+ BinaryOperator :: GtEq => Ok ( Operator :: GtEq ) ,
1082
+ BinaryOperator :: Lt => Ok ( Operator :: Lt ) ,
1083
+ BinaryOperator :: LtEq => Ok ( Operator :: LtEq ) ,
1084
+ BinaryOperator :: Eq => Ok ( Operator :: Eq ) ,
1085
+ BinaryOperator :: NotEq => Ok ( Operator :: NotEq ) ,
1086
+ BinaryOperator :: Plus => Ok ( Operator :: Plus ) ,
1087
+ BinaryOperator :: Minus => Ok ( Operator :: Minus ) ,
1088
+ BinaryOperator :: Multiply => Ok ( Operator :: Multiply ) ,
1089
+ BinaryOperator :: Divide => Ok ( Operator :: Divide ) ,
1090
+ BinaryOperator :: Modulo => Ok ( Operator :: Modulo ) ,
1091
+ BinaryOperator :: And => Ok ( Operator :: And ) ,
1092
+ BinaryOperator :: Or => Ok ( Operator :: Or ) ,
1093
+ BinaryOperator :: Like => Ok ( Operator :: Like ) ,
1094
+ BinaryOperator :: NotLike => Ok ( Operator :: NotLike ) ,
1095
+ BinaryOperator :: PGRegexMatch => Ok ( Operator :: RegexMatch ) ,
1096
+ BinaryOperator :: PGRegexIMatch => Ok ( Operator :: RegexIMatch ) ,
1097
+ BinaryOperator :: PGRegexNotMatch => Ok ( Operator :: RegexNotMatch ) ,
1098
+ BinaryOperator :: PGRegexNotIMatch => Ok ( Operator :: RegexNotIMatch ) ,
1099
+ _ => Err ( DataFusionError :: NotImplemented ( format ! (
1100
+ "Unsupported SQL binary operator {:?}" ,
1101
+ op
1102
+ ) ) ) ,
1103
+ } ?;
1104
+
1105
+ Ok ( Expr :: BinaryExpr {
1106
+ left : Box :: new ( self . sql_expr_to_logical_expr ( left, schema) ?) ,
1107
+ op : operator,
1108
+ right : Box :: new ( self . sql_expr_to_logical_expr ( right, schema) ?) ,
1109
+ } )
1110
+ }
1111
+
1112
+ fn parse_sql_unary_op (
1113
+ & self ,
1114
+ op : & UnaryOperator ,
1115
+ expr : & SQLExpr ,
1116
+ schema : & DFSchema ,
1117
+ ) -> Result < Expr > {
1118
+ match op {
1119
+ UnaryOperator :: Not => Ok ( Expr :: Not ( Box :: new (
1120
+ self . sql_expr_to_logical_expr ( expr, schema) ?,
1121
+ ) ) ) ,
1122
+ UnaryOperator :: Plus => Ok ( self . sql_expr_to_logical_expr ( expr, schema) ?) ,
1123
+ UnaryOperator :: Minus => {
1124
+ match expr {
1125
+ // optimization: if it's a number literal, we apply the negative operator
1126
+ // here directly to calculate the new literal.
1127
+ SQLExpr :: Value ( Value :: Number ( n, _) ) => match n. parse :: < i64 > ( ) {
1128
+ Ok ( n) => Ok ( lit ( -n) ) ,
1129
+ Err ( _) => Ok ( lit ( -n
1130
+ . parse :: < f64 > ( )
1131
+ . map_err ( |_e| {
1132
+ DataFusionError :: Internal ( format ! (
1133
+ "negative operator can be only applied to integer and float operands, got: {}" ,
1134
+ n) )
1135
+ } ) ?) ) ,
1136
+ } ,
1137
+ // not a literal, apply negative operator on expression
1138
+ _ => Ok ( Expr :: Negative ( Box :: new ( self . sql_expr_to_logical_expr ( expr, schema) ?) ) ) ,
1139
+ }
1140
+ }
1141
+ _ => Err ( DataFusionError :: NotImplemented ( format ! (
1142
+ "Unsupported SQL unary operator {:?}" ,
1143
+ op
1144
+ ) ) ) ,
1145
+ }
1146
+ }
1147
+
1072
1148
fn sql_values_to_plan ( & self , values : & SQLValues ) -> Result < LogicalPlan > {
1149
+ // values should not be based on any other schema
1150
+ let schema = DFSchema :: empty ( ) ;
1073
1151
let values = values
1074
1152
. 0
1075
1153
. iter ( )
1076
1154
. map ( |row| {
1077
1155
row. iter ( )
1078
1156
. map ( |v| match v {
1079
- SQLExpr :: Value ( Value :: Number ( n, _) ) => match n. parse :: < i64 > ( ) {
1080
- Ok ( n) => Ok ( lit ( n) ) ,
1081
- Err ( _) => Ok ( lit ( n. parse :: < f64 > ( ) . unwrap ( ) ) ) ,
1082
- } ,
1157
+ SQLExpr :: Value ( Value :: Number ( n, _) ) => parse_sql_number ( n) ,
1083
1158
SQLExpr :: Value ( Value :: SingleQuotedString ( ref s) ) => {
1084
1159
Ok ( lit ( s. clone ( ) ) )
1085
1160
}
1086
1161
SQLExpr :: Value ( Value :: Null ) => {
1087
1162
Ok ( Expr :: Literal ( ScalarValue :: Utf8 ( None ) ) )
1088
1163
}
1089
1164
SQLExpr :: Value ( Value :: Boolean ( n) ) => Ok ( lit ( * n) ) ,
1165
+ SQLExpr :: UnaryOp { ref op, ref expr } => {
1166
+ self . parse_sql_unary_op ( op, expr, & schema)
1167
+ }
1168
+ SQLExpr :: BinaryOp {
1169
+ ref left,
1170
+ ref op,
1171
+ ref right,
1172
+ } => self . parse_sql_binary_op ( left, op, right, & schema) ,
1090
1173
other => Err ( DataFusionError :: NotImplemented ( format ! (
1091
1174
"Unsupported value {:?} in a values list expression" ,
1092
1175
other
@@ -1100,14 +1183,9 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
1100
1183
1101
1184
fn sql_expr_to_logical_expr ( & self , sql : & SQLExpr , schema : & DFSchema ) -> Result < Expr > {
1102
1185
match sql {
1103
- SQLExpr :: Value ( Value :: Number ( n, _) ) => match n. parse :: < i64 > ( ) {
1104
- Ok ( n) => Ok ( lit ( n) ) ,
1105
- Err ( _) => Ok ( lit ( n. parse :: < f64 > ( ) . unwrap ( ) ) ) ,
1106
- } ,
1186
+ SQLExpr :: Value ( Value :: Number ( n, _) ) => parse_sql_number ( n) ,
1107
1187
SQLExpr :: Value ( Value :: SingleQuotedString ( ref s) ) => Ok ( lit ( s. clone ( ) ) ) ,
1108
-
1109
1188
SQLExpr :: Value ( Value :: Boolean ( n) ) => Ok ( lit ( * n) ) ,
1110
-
1111
1189
SQLExpr :: Value ( Value :: Null ) => Ok ( Expr :: Literal ( ScalarValue :: Utf8 ( None ) ) ) ,
1112
1190
SQLExpr :: Extract { field, expr } => Ok ( Expr :: ScalarFunction {
1113
1191
fun : functions:: BuiltinScalarFunction :: DatePart ,
@@ -1244,34 +1322,9 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
1244
1322
right : Box :: new ( self . sql_expr_to_logical_expr ( right, schema) ?) ,
1245
1323
} ) ,
1246
1324
1247
- SQLExpr :: UnaryOp { ref op, ref expr } => match op {
1248
- UnaryOperator :: Not => Ok ( Expr :: Not ( Box :: new (
1249
- self . sql_expr_to_logical_expr ( expr, schema) ?,
1250
- ) ) ) ,
1251
- UnaryOperator :: Plus => Ok ( self . sql_expr_to_logical_expr ( expr, schema) ?) ,
1252
- UnaryOperator :: Minus => {
1253
- match expr. as_ref ( ) {
1254
- // optimization: if it's a number literal, we apply the negative operator
1255
- // here directly to calculate the new literal.
1256
- SQLExpr :: Value ( Value :: Number ( n, _) ) => match n. parse :: < i64 > ( ) {
1257
- Ok ( n) => Ok ( lit ( -n) ) ,
1258
- Err ( _) => Ok ( lit ( -n
1259
- . parse :: < f64 > ( )
1260
- . map_err ( |_e| {
1261
- DataFusionError :: Internal ( format ! (
1262
- "negative operator can be only applied to integer and float operands, got: {}" ,
1263
- n) )
1264
- } ) ?) ) ,
1265
- } ,
1266
- // not a literal, apply negative operator on expression
1267
- _ => Ok ( Expr :: Negative ( Box :: new ( self . sql_expr_to_logical_expr ( expr, schema) ?) ) ) ,
1268
- }
1269
- }
1270
- _ => Err ( DataFusionError :: NotImplemented ( format ! (
1271
- "Unsupported SQL unary operator {:?}" ,
1272
- op
1273
- ) ) ) ,
1274
- } ,
1325
+ SQLExpr :: UnaryOp { ref op, ref expr } => {
1326
+ self . parse_sql_unary_op ( op, expr, schema)
1327
+ }
1275
1328
1276
1329
SQLExpr :: Between {
1277
1330
ref expr,
@@ -1306,39 +1359,7 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
1306
1359
ref left,
1307
1360
ref op,
1308
1361
ref right,
1309
- } => {
1310
- let operator = match * op {
1311
- BinaryOperator :: Gt => Ok ( Operator :: Gt ) ,
1312
- BinaryOperator :: GtEq => Ok ( Operator :: GtEq ) ,
1313
- BinaryOperator :: Lt => Ok ( Operator :: Lt ) ,
1314
- BinaryOperator :: LtEq => Ok ( Operator :: LtEq ) ,
1315
- BinaryOperator :: Eq => Ok ( Operator :: Eq ) ,
1316
- BinaryOperator :: NotEq => Ok ( Operator :: NotEq ) ,
1317
- BinaryOperator :: Plus => Ok ( Operator :: Plus ) ,
1318
- BinaryOperator :: Minus => Ok ( Operator :: Minus ) ,
1319
- BinaryOperator :: Multiply => Ok ( Operator :: Multiply ) ,
1320
- BinaryOperator :: Divide => Ok ( Operator :: Divide ) ,
1321
- BinaryOperator :: Modulo => Ok ( Operator :: Modulo ) ,
1322
- BinaryOperator :: And => Ok ( Operator :: And ) ,
1323
- BinaryOperator :: Or => Ok ( Operator :: Or ) ,
1324
- BinaryOperator :: Like => Ok ( Operator :: Like ) ,
1325
- BinaryOperator :: NotLike => Ok ( Operator :: NotLike ) ,
1326
- BinaryOperator :: PGRegexMatch => Ok ( Operator :: RegexMatch ) ,
1327
- BinaryOperator :: PGRegexIMatch => Ok ( Operator :: RegexIMatch ) ,
1328
- BinaryOperator :: PGRegexNotMatch => Ok ( Operator :: RegexNotMatch ) ,
1329
- BinaryOperator :: PGRegexNotIMatch => Ok ( Operator :: RegexNotIMatch ) ,
1330
- _ => Err ( DataFusionError :: NotImplemented ( format ! (
1331
- "Unsupported SQL binary operator {:?}" ,
1332
- op
1333
- ) ) ) ,
1334
- } ?;
1335
-
1336
- Ok ( Expr :: BinaryExpr {
1337
- left : Box :: new ( self . sql_expr_to_logical_expr ( left, schema) ?) ,
1338
- op : operator,
1339
- right : Box :: new ( self . sql_expr_to_logical_expr ( right, schema) ?) ,
1340
- } )
1341
- }
1362
+ } => self . parse_sql_binary_op ( left, op, right, schema) ,
1342
1363
1343
1364
SQLExpr :: Trim { expr, trim_where } => {
1344
1365
let ( fun, where_expr) = match trim_where {
@@ -3630,3 +3651,10 @@ mod tests {
3630
3651
quick_test ( sql, expected) ;
3631
3652
}
3632
3653
}
3654
+
3655
+ fn parse_sql_number ( n : & str ) -> Result < Expr > {
3656
+ match n. parse :: < i64 > ( ) {
3657
+ Ok ( n) => Ok ( lit ( n) ) ,
3658
+ Err ( _) => Ok ( lit ( n. parse :: < f64 > ( ) . unwrap ( ) ) ) ,
3659
+ }
3660
+ }
0 commit comments