@@ -11000,7 +11000,7 @@ fn parse_is_boolean() {
1100011000 let res = parse_sql_statements(sql);
1100111001 assert_eq!(
1100211002 ParserError::ParserError(
11003- "Expected: [NOT] NULL | TRUE | FALSE | DISTINCT | [form] NORMALIZED FROM after IS, found: 0"
11003+ "Expected: [NOT] NULL | TRUE | FALSE | DISTINCT | [NOT] JSON [VALUE | SCALAR | ARRAY | OBJECT] [WITH | WITHOUT UNIQUE [KEYS]] | [ form] NORMALIZED FROM after IS, found: 0"
1100411004 .to_string()
1100511005 ),
1100611006 res.unwrap_err()
@@ -11010,7 +11010,7 @@ fn parse_is_boolean() {
1101011010 let res = parse_sql_statements(sql);
1101111011 assert_eq!(
1101211012 ParserError::ParserError(
11013- "Expected: [NOT] NULL | TRUE | FALSE | DISTINCT | [form] NORMALIZED FROM after IS, found: XYZ"
11013+ "Expected: [NOT] NULL | TRUE | FALSE | DISTINCT | [NOT] JSON [VALUE | SCALAR | ARRAY | OBJECT] [WITH | WITHOUT UNIQUE [KEYS]] | [ form] NORMALIZED FROM after IS, found: XYZ"
1101411014 .to_string()
1101511015 ),
1101611016 res.unwrap_err()
@@ -11020,7 +11020,7 @@ fn parse_is_boolean() {
1102011020 let res = parse_sql_statements(sql);
1102111021 assert_eq!(
1102211022 ParserError::ParserError(
11023- "Expected: [NOT] NULL | TRUE | FALSE | DISTINCT | [form] NORMALIZED FROM after IS, found: FROM"
11023+ "Expected: [NOT] NULL | TRUE | FALSE | DISTINCT | [NOT] JSON [VALUE | SCALAR | ARRAY | OBJECT] [WITH | WITHOUT UNIQUE [KEYS]] | [ form] NORMALIZED FROM after IS, found: FROM"
1102411024 .to_string()
1102511025 ),
1102611026 res.unwrap_err()
@@ -11030,13 +11030,79 @@ fn parse_is_boolean() {
1103011030 let res = parse_sql_statements(sql);
1103111031 assert_eq!(
1103211032 ParserError::ParserError(
11033- "Expected: [NOT] NULL | TRUE | FALSE | DISTINCT | [form] NORMALIZED FROM after IS, found: TRIM"
11033+ "Expected: [NOT] NULL | TRUE | FALSE | DISTINCT | [NOT] JSON [VALUE | SCALAR | ARRAY | OBJECT] [WITH | WITHOUT UNIQUE [KEYS]] | [ form] NORMALIZED FROM after IS, found: TRIM"
1103411034 .to_string()
1103511035 ),
1103611036 res.unwrap_err()
1103711037 );
1103811038}
1103911039
11040+ #[test]
11041+ fn parse_is_json_predicate() {
11042+ use self::Expr::*;
11043+
11044+ // Assert the full AST once for a case that exercises every field.
11045+ let sql = "a IS NOT JSON OBJECT WITHOUT UNIQUE KEYS";
11046+ assert_eq!(
11047+ IsJson {
11048+ expr: Box::new(Identifier(Ident::new("a"))),
11049+ kind: Some(JsonPredicateType::Object),
11050+ unique_keys: Some(JsonKeyUniqueness::WithoutUniqueKeys),
11051+ negated: true,
11052+ },
11053+ verified_expr(sql)
11054+ );
11055+
11056+ // The remaining forms only need to round-trip.
11057+ verified_expr("a IS JSON");
11058+ verified_expr("a IS NOT JSON");
11059+ verified_expr("a IS JSON VALUE");
11060+ verified_expr("a IS JSON SCALAR");
11061+ verified_expr("a IS JSON ARRAY");
11062+ verified_expr("a IS JSON OBJECT");
11063+ verified_expr("a IS JSON WITH UNIQUE KEYS");
11064+ verified_expr("a IS JSON WITHOUT UNIQUE KEYS");
11065+
11066+ all_dialects().expr_parses_to("a IS JSON WITH UNIQUE", "a IS JSON WITH UNIQUE KEYS");
11067+ all_dialects().expr_parses_to("a IS JSON WITHOUT UNIQUE", "a IS JSON WITHOUT UNIQUE KEYS");
11068+
11069+ assert_matches!(
11070+ verified_expr("NOT a IS JSON"),
11071+ Expr::UnaryOp {
11072+ op: UnaryOperator::Not,
11073+ expr
11074+ } if matches!(&*expr, Expr::IsJson { .. })
11075+ );
11076+ }
11077+
11078+ #[test]
11079+ fn parse_is_json_predicate_invalid() {
11080+ let dialects = all_dialects();
11081+
11082+ let invalid = [
11083+ "SELECT * FROM t WHERE a IS JSON WITH FROM",
11084+ "SELECT * FROM t WHERE a IS JSON WITH KEYS",
11085+ "SELECT * FROM t WHERE a IS JSON WITHOUT FROM",
11086+ "SELECT * FROM t WHERE a IS JSON WITHOUT KEYS",
11087+ "SELECT * FROM t WHERE a IS NOT JSON WITH FROM",
11088+ "SELECT * FROM t WHERE a IS JSON VALUE ARRAY",
11089+ "SELECT * FROM t WHERE a IS JSON OBJECT VALUE",
11090+ "SELECT * FROM t WHERE a IS JSON WITH UNIQUE EXTRA",
11091+ "SELECT * FROM t WHERE a IS JSON WITH UNIQUE KEYS EXTRA",
11092+ "SELECT * FROM t WHERE a IS JSON WITHOUT UNIQUE EXTRA",
11093+ "SELECT * FROM t WHERE a IS JSON WITHOUT UNIQUE KEYS EXTRA",
11094+ "SELECT * FROM t WHERE a IS JSON WITH UNIQUE KEYS WITH UNIQUE KEYS",
11095+ "SELECT * FROM t WHERE a IS JSON WITHOUT UNIQUE KEYS WITHOUT UNIQUE KEYS",
11096+ ];
11097+
11098+ for sql in invalid {
11099+ assert!(
11100+ dialects.parse_sql_statements(sql).is_err(),
11101+ "expected a parse failure for `{sql}`"
11102+ );
11103+ }
11104+ }
11105+
1104011106#[test]
1104111107fn parse_discard() {
1104211108 let sql = "DISCARD ALL";
0 commit comments