@@ -10996,47 +10996,85 @@ fn parse_is_boolean() {
1099610996 verified_stmt("SELECT f FROM foo WHERE field IS UNKNOWN");
1099710997 verified_stmt("SELECT f FROM foo WHERE field IS NOT UNKNOWN");
1099810998
10999- let sql = "SELECT f from foo where field is 0";
11000- let res = parse_sql_statements(sql);
11001- assert_eq!(
11002- ParserError::ParserError(
11003- "Expected: [NOT] NULL | TRUE | FALSE | DISTINCT | [form] NORMALIZED FROM after IS, found: 0"
11004- .to_string()
11005- ),
11006- res.unwrap_err()
11007- );
10999+ for sql in [
11000+ "SELECT f from foo where field is 0",
11001+ "SELECT s, s IS XYZ NORMALIZED FROM foo",
11002+ "SELECT s, s IS NFKC FROM foo",
11003+ "SELECT s, s IS TRIM(' NFKC ') FROM foo",
11004+ ] {
11005+ assert!(
11006+ parse_sql_statements(sql).is_err(),
11007+ "expected a parse failure for `{sql}`"
11008+ );
11009+ }
11010+ }
1100811011
11009- let sql = "SELECT s, s IS XYZ NORMALIZED FROM foo";
11010- let res = parse_sql_statements(sql);
11011- assert_eq!(
11012- ParserError::ParserError(
11013- "Expected: [NOT] NULL | TRUE | FALSE | DISTINCT | [form] NORMALIZED FROM after IS, found: XYZ"
11014- .to_string()
11015- ),
11016- res.unwrap_err()
11017- );
11012+ #[test]
11013+ fn parse_is_json_predicate() {
11014+ use self::Expr::*;
1101811015
11019- let sql = "SELECT s, s IS NFKC FROM foo";
11020- let res = parse_sql_statements(sql) ;
11016+ // Assert the full AST once for a case that exercises every field.
11017+ let sql = "a IS NOT JSON OBJECT WITHOUT UNIQUE KEYS" ;
1102111018 assert_eq!(
11022- ParserError::ParserError(
11023- "Expected: [NOT] NULL | TRUE | FALSE | DISTINCT | [form] NORMALIZED FROM after IS, found: FROM"
11024- .to_string()
11025- ),
11026- res.unwrap_err()
11019+ IsJson {
11020+ expr: Box::new(Identifier(Ident::new("a"))),
11021+ kind: Some(JsonPredicateType::Object),
11022+ unique_keys: Some(JsonKeyUniqueness::WithoutUniqueKeys),
11023+ negated: true,
11024+ },
11025+ verified_expr(sql)
1102711026 );
1102811027
11029- let sql = "SELECT s, s IS TRIM(' NFKC ') FROM foo";
11030- let res = parse_sql_statements(sql);
11031- assert_eq!(
11032- ParserError::ParserError(
11033- "Expected: [NOT] NULL | TRUE | FALSE | DISTINCT | [form] NORMALIZED FROM after IS, found: TRIM"
11034- .to_string()
11035- ),
11036- res.unwrap_err()
11028+ // The remaining forms only need to round-trip.
11029+ verified_expr("a IS JSON");
11030+ verified_expr("a IS NOT JSON");
11031+ verified_expr("a IS JSON VALUE");
11032+ verified_expr("a IS JSON SCALAR");
11033+ verified_expr("a IS JSON ARRAY");
11034+ verified_expr("a IS JSON OBJECT");
11035+ verified_expr("a IS JSON WITH UNIQUE KEYS");
11036+ verified_expr("a IS JSON WITHOUT UNIQUE KEYS");
11037+
11038+ all_dialects().expr_parses_to("a IS JSON WITH UNIQUE", "a IS JSON WITH UNIQUE KEYS");
11039+ all_dialects().expr_parses_to("a IS JSON WITHOUT UNIQUE", "a IS JSON WITHOUT UNIQUE KEYS");
11040+
11041+ assert_matches!(
11042+ verified_expr("NOT a IS JSON"),
11043+ Expr::UnaryOp {
11044+ op: UnaryOperator::Not,
11045+ expr
11046+ } if matches!(&*expr, Expr::IsJson { .. })
1103711047 );
1103811048}
1103911049
11050+ #[test]
11051+ fn parse_is_json_predicate_invalid() {
11052+ let dialects = all_dialects();
11053+
11054+ let invalid = [
11055+ "SELECT * FROM t WHERE a IS JSON WITH FROM",
11056+ "SELECT * FROM t WHERE a IS JSON WITH KEYS",
11057+ "SELECT * FROM t WHERE a IS JSON WITHOUT FROM",
11058+ "SELECT * FROM t WHERE a IS JSON WITHOUT KEYS",
11059+ "SELECT * FROM t WHERE a IS NOT JSON WITH FROM",
11060+ "SELECT * FROM t WHERE a IS JSON VALUE ARRAY",
11061+ "SELECT * FROM t WHERE a IS JSON OBJECT VALUE",
11062+ "SELECT * FROM t WHERE a IS JSON WITH UNIQUE EXTRA",
11063+ "SELECT * FROM t WHERE a IS JSON WITH UNIQUE KEYS EXTRA",
11064+ "SELECT * FROM t WHERE a IS JSON WITHOUT UNIQUE EXTRA",
11065+ "SELECT * FROM t WHERE a IS JSON WITHOUT UNIQUE KEYS EXTRA",
11066+ "SELECT * FROM t WHERE a IS JSON WITH UNIQUE KEYS WITH UNIQUE KEYS",
11067+ "SELECT * FROM t WHERE a IS JSON WITHOUT UNIQUE KEYS WITHOUT UNIQUE KEYS",
11068+ ];
11069+
11070+ for sql in invalid {
11071+ assert!(
11072+ dialects.parse_sql_statements(sql).is_err(),
11073+ "expected a parse failure for `{sql}`"
11074+ );
11075+ }
11076+ }
11077+
1104011078#[test]
1104111079fn parse_discard() {
1104211080 let sql = "DISCARD ALL";
0 commit comments