123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747 |
- # Copyright 2015 - 2019 The Cockroach Authors. All rights reserved.
- # Copyright Materialize, Inc. and contributors. All rights reserved.
- #
- # Use of this software is governed by the Business Source License
- # included in the LICENSE file at the root of this repository.
- #
- # As of the Change Date specified in that file, in accordance with
- # the Business Source License, use of this software will be governed
- # by the Apache License, Version 2.0.
- #
- # This file is derived from the logic test suite in CockroachDB. The
- # original file was retrieved on June 10, 2019 from:
- #
- # https://github.com/cockroachdb/cockroach/blob/d2f7fbf5dd1fc1a099bbad790a2e1f7c60a66cc3/pkg/sql/logictest/testdata/logic_test/json
- #
- # The original source code is subject to the terms of the Apache
- # 2.0 license, a copy of which can be found in the LICENSE file at the
- # root of this repository.
- mode cockroach
- simple conn=mz_system,user=mz_system
- ALTER SYSTEM SET unsafe_enable_table_keys = true
- ----
- COMPLETE 0
- ## Basic creation
- query TT
- SELECT '1'::JSONB, '2'::JSON
- ----
- 1 2
- query T
- SELECT pg_typeof(JSON '1')
- ----
- jsonb
- query T
- SELECT pg_typeof(JSONB '1')
- ----
- jsonb
- query T
- SELECT '1.00'::JSON
- ----
- 1.00
- statement error unexpected EOF
- SELECT '{'::JSON
- query T
- SELECT '"hello"'::JSON
- ----
- "hello"
- query T
- SELECT '"abc\n123"'::JSON
- ----
- "abc\n123"
- query TTT
- SELECT 'true'::JSON, 'false'::JSON, 'null'::JSON
- ----
- true false null
- query T
- SELECT '[]'::JSON
- ----
- []
- query T
- SELECT '[1,2,3]'::JSON
- ----
- [1,2,3]
- query T
- SELECT '[1,"hello",[[[true,false]]]]'::JSON
- ----
- [1,"hello",[[[true,false]]]]
- query T
- SELECT '[1,"hello",{"a": ["foo",{"b": 3}]}]'::JSON
- ----
- [1,"hello",{"a":["foo",{"b":3}]}]
- query T
- SELECT '{}'::JSON
- ----
- {}
- query T
- SELECT '{"a":"b","c":"d"}'::JSON
- ----
- {"a":"b","c":"d"}
- query T
- SELECT '{"a":1,"c":{"foo":"bar"}}'::JSON
- ----
- {"a":1,"c":{"foo":"bar"}}
- # Only the final occurrence of a key in an object is kept.
- query T
- SELECT '{"a":1,"a":2}'::JSON
- ----
- {"a":2}
- query T
- SELECT NULL::JSON
- ----
- NULL
- statement error arrays of jsonb not allowed.*\nHINT:.*23468
- SELECT ARRAY['"hello"'::JSON]
- statement error arrays of jsonb not allowed.*\nHINT:.*23468
- SELECT '{}'::JSONB[]
- statement error arrays of jsonb not allowed.*\nHINT:.*23468
- CREATE TABLE x (y JSONB[])
- statement ok
- CREATE TABLE foo (bar JSON)
- statement ok
- INSERT INTO foo VALUES
- ('{"a":"b"}'),
- ('[1,2,3]'),
- ('"hello"'),
- ('1.000'),
- ('true'),
- ('false'),
- (NULL),
- ('{"x":[1,2,3]}'),
- ('{"x":{"y":"z"}}')
- query T rowsort
- SELECT bar FROM foo
- ----
- {"a":"b"}
- [1,2,3]
- "hello"
- 1.000
- true
- false
- NULL
- {"x":[1,2,3]}
- {"x":{"y":"z"}}
- query T
- SELECT bar FROM foo WHERE bar->>'a' = 'b'
- ----
- {"a":"b"}
- query T
- SELECT bar FROM foo WHERE bar ? 'a'
- ----
- {"a":"b"}
- query BBBBBBB
- VALUES (
- '"hello"'::JSONB ? 'hello',
- '"hello"'::JSONB ? 'goodbye',
- '"hello"'::JSONB ? 'ello',
- '"hello"'::JSONB ? 'h',
- 'true'::JSONB ? 'true',
- '1'::JSONB ? '1',
- 'null'::JSONB ? 'null'
- )
- ----
- true false false false false false false
- query T
- SELECT bar FROM foo WHERE bar ? 'hello'
- ----
- "hello"
- query T
- SELECT bar FROM foo WHERE bar ? 'goodbye'
- ----
- query T
- SELECT bar FROM foo WHERE bar ?| ARRAY['a','b']
- ----
- {"a":"b"}
- query T
- SELECT bar FROM foo WHERE bar ?& ARRAY['a','b']
- ----
- # ?| and ?& ignore NULLs.
- query T
- SELECT bar FROM foo WHERE bar ?| ARRAY['a',null]
- ----
- {"a":"b"}
- # TODO(justin):cockroach#29355
- # query T
- # SELECT bar FROM foo WHERE bar ?| ARRAY[null,null]::STRING[]
- # ----
- query T
- SELECT bar FROM foo WHERE bar ?& ARRAY['a',null]
- ----
- {"a":"b"}
- query T
- SELECT bar FROM foo WHERE bar->'a' = '"b"'::JSON
- ----
- {"a":"b"}
- statement error pgcode 0A000 can't order by column type jsonb.*\nHINT.*32706
- SELECT bar FROM foo ORDER BY bar
- statement error pgcode 0A000 column k is of type jsonb and thus is not indexable
- CREATE TABLE pk (k JSON PRIMARY KEY)
- query T rowsort
- SELECT bar->'a' FROM foo
- ----
- "b"
- NULL
- NULL
- NULL
- NULL
- NULL
- NULL
- NULL
- NULL
- query T
- SELECT * from foo where bar->'x' = '[1]'
- ----
- query T
- SELECT * from foo where bar->'x' = '{}'
- ----
- statement ok
- DELETE FROM foo
- statement ok
- INSERT INTO foo VALUES ('{"a":{"c":"d"}}');
- query TT
- SELECT bar->'a'->'c',bar->'a'->>'c' FROM foo
- ----
- "d" d
- statement ok
- CREATE TABLE multiple (a JSON,b JSON)
- statement ok
- INSERT INTO multiple VALUES ('{"a":"b"}','[1,2,3,4,"foo"]')
- query T
- SELECT a FROM multiple
- ----
- {"a":"b"}
- query T
- SELECT b FROM multiple
- ----
- [1,2,3,4,"foo"]
- ## Comparisons
- # We opt to not expose <,>,<=,>= at this time,to avoid having to commit to
- # an ordering.
- query B
- SELECT '1'::JSON = '1'::JSON
- ----
- true
- query B
- SELECT '1'::JSON = '1'
- ----
- true
- query B
- SELECT '1'::JSON = '2'::JSON
- ----
- false
- query B
- SELECT '1.00'::JSON = '1'::JSON
- ----
- true
- query BB
- SELECT '"hello"'::JSON = '"hello"'::JSON,'"hello"'::JSON = '"goodbye"'::JSON
- ----
- true false
- query B
- SELECT '"hello"'::JSON IN ('"hello"'::JSON,'1'::JSON,'[]'::JSON)
- ----
- true
- query B
- SELECT 'false'::JSON IN ('"hello"'::JSON,'1'::JSON,'[]'::JSON)
- ----
- false
- ## Operators
- query T
- SELECT '{"a":1}'::JSONB->'a'
- ----
- 1
- query T
- SELECT pg_typeof('{"a":1}'::JSONB->'a')
- ----
- jsonb
- query T
- SELECT '{"a":1,"b":2}'::JSONB->'b'
- ----
- 2
- query T
- SELECT '{"a":1,"b":{"c":3}}'::JSONB->'b'->'c'
- ----
- 3
- query TT
- SELECT '{"a":1,"b":2}'::JSONB->'c','{"c":1}'::JSONB->'a'
- ----
- NULL NULL
- query TT
- SELECT '2'::JSONB->'b','[1,2,3]'::JSONB->'0'
- ----
- NULL NULL
- query T
- SELECT '[1,2,3]'::JSONB->0
- ----
- 1
- query T
- SELECT '[1,2,3]'::JSONB->3
- ----
- NULL
- query T
- SELECT '{"a":"b"}'::JSONB->>'a'
- ----
- b
- query T
- SELECT '[null]'::JSONB->>0
- ----
- NULL
- query T
- SELECT '{"a":null}'::JSONB->>'a'
- ----
- NULL
- query T
- SELECT pg_typeof('{"a":1}'::JSONB->>'a')
- ----
- string
- query T
- SELECT '{"a":1,"b":2}'::JSONB->>'b'
- ----
- 2
- query TT
- SELECT '{"a":1,"b":2}'::JSONB->>'c','{"c":1}'::JSONB->>'a'
- ----
- NULL NULL
- query TT
- SELECT '2'::JSONB->>'b','[1,2,3]'::JSONB->>'0'
- ----
- NULL NULL
- query T
- SELECT '[1,2,3]'::JSONB->>0
- ----
- 1
- query T
- SELECT '[1,2,3]'::JSONB->>3
- ----
- NULL
- query T
- SELECT '{"a":1}'::JSONB#>'{a}'::STRING[]
- ----
- 1
- query T
- SELECT '{"a":{"b":"c"}}'::JSONB#>'{a,b}'::STRING[]
- ----
- "c"
- query T
- SELECT '{"a":["b"]}'::JSONB#>'{a,b}'::STRING[]
- ----
- NULL
- query T
- SELECT '{"a":["b"]}'::JSONB#>'{a,0}'::STRING[]
- ----
- "b"
- query T
- SELECT '{"a":1}'::JSONB#>>ARRAY['foo',null]
- ----
- NULL
- query T
- SELECT '{"a":1}'::JSONB#>>'{a}'::STRING[]
- ----
- 1
- query T
- SELECT '{"a":{"b":"c"}}'::JSONB#>>'{a,b}'::STRING[]
- ----
- c
- query T
- SELECT '{"a":["b"]}'::JSONB#>>'{a,b}'::STRING[]
- ----
- NULL
- query T
- SELECT '{"a":["b"]}'::JSONB#>>'{a,0}'::STRING[]
- ----
- b
- query T
- SELECT '{"a":[null]}'::JSONB#>>'{a,0}'::STRING[]
- ----
- NULL
- query BB
- SELECT '{"a":1}'::JSONB ? 'a','{"a":1}'::JSONB ? 'b'
- ----
- true false
- query BB
- SELECT '{"a":1,"b":1}'::JSONB ? 'a','{"a":1,"b":1}'::JSONB ? 'b'
- ----
- true true
- query BB
- SELECT '{"a":1}'::JSONB ?| ARRAY['a','b'],'{"b":1}'::JSONB ?| ARRAY['a','b']
- ----
- true true
- query B
- SELECT '{"c":1}'::JSONB ?| ARRAY['a','b']
- ----
- false
- query BB
- SELECT '{"a":1}'::JSONB ?& ARRAY['a','b'],'{"b":1}'::JSONB ?& ARRAY['a','b']
- ----
- false false
- query B
- SELECT '{"a":1,"b":1,"c":1}'::JSONB ?& ARRAY['a','b']
- ----
- true
- ## Arrays do not `?` their stringified indices.
- query B
- SELECT '[1,2,3]'::JSONB ? '0'
- ----
- false
- ## Arrays `?` string elements.
- query B
- SELECT '["foo","bar","baz"]'::JSONB ? 'foo'
- ----
- true
- query B
- SELECT '["foo","bar","baz"]'::JSONB ? 'baz'
- ----
- true
- query B
- SELECT '["foo","bar","baz"]'::JSONB ? 'gup'
- ----
- false
- query B
- SELECT '["foo","bar","baz"]'::JSONB ?| ARRAY['foo','gup']
- ----
- true
- query B
- SELECT '["foo","bar","baz"]'::JSONB ?| ARRAY['buh','gup']
- ----
- false
- query B
- SELECT '["foo","bar","baz"]'::JSONB ?& ARRAY['foo','bar']
- ----
- true
- query B
- SELECT '["foo","bar","baz"]'::JSONB ?& ARRAY['foo','buh']
- ----
- false
- query T
- SELECT '{"a":1}'::JSONB - 'a'
- ----
- {}
- query T
- SELECT '{"a":1}'::JSONB - 'b'
- ----
- {"a":1}
- # `-` is one of the very few cases that PG errors in a JSON type mismatch with operators.
- query T
- SELECT '[1,2,3]'::JSONB - 0
- ----
- [2,3]
- query T
- SELECT '[1,2,3]'::JSONB - 1
- ----
- [1,3]
- statement error pgcode 22023 cannot delete from scalar
- SELECT '3'::JSONB - 'b'
- statement error pgcode 22023 cannot delete from object using integer index
- SELECT '{}'::JSONB - 1
- query B
- SELECT '[1,2,3]'::JSONB <@ '[1,2]'::JSONB
- ----
- false
- query B
- SELECT '[1,2]'::JSONB <@ '[1,2,3]'::JSONB
- ----
- true
- query B
- SELECT '[1,2]'::JSONB @> '[1,2,3]'::JSONB
- ----
- false
- query B
- SELECT '[1,2,3]'::JSONB @> '[1,2]'::JSONB
- ----
- true
- query B
- SELECT '{"a":[1,2,3]}'::JSONB->'a' @> '2'::JSONB
- ----
- true
- statement ok
- CREATE TABLE x (j JSONB)
- statement ok
- INSERT INTO x VALUES ('{"a":[1,2,3]}')
- query B
- SELECT true FROM x WHERE j->'a' @> '2'::JSONB
- ----
- true
- statement ok
- CREATE INVERTED INDEX ON x (j)
- query B
- SELECT true FROM x WHERE j->'a' @> '2'::JSONB
- ----
- true
- query T
- SELECT '{"foo":{"bar":1}}'::JSONB #- ARRAY['foo','bar']
- ----
- {"foo":{}}
- statement error path element at position 1 is null
- SELECT '{"foo":{"bar":1}}'::JSONB #- ARRAY[null,'foo']
- statement error path element at position 2 is null
- SELECT '{"foo":{"bar":1}}'::JSONB #- ARRAY['foo',null]
- query T
- SELECT '{"foo":{"bar":1}}'::JSONB #- ARRAY['foo']
- ----
- {}
- query T
- SELECT '{"foo":{"bar":1}}'::JSONB #- ARRAY['bar']
- ----
- {"foo":{"bar":1}}
- query T
- SELECT '{"foo":{"bar":1},"one":1,"two":2}'::JSONB #- ARRAY['one']
- ----
- {"foo":{"bar":1},"two":2}
- query T
- SELECT '{}'::JSONB #- ARRAY['foo']
- ----
- {}
- query T
- SELECT '{"foo":{"bar":1}}'::JSONB #- ARRAY['']
- ----
- {"foo":{"bar":1}}
- query T
- SELECT '{"a":"b"}'::JSONB::STRING
- ----
- {"a":"b"}
- query T
- SELECT CAST('{"a":"b"}'::JSONB AS STRING)
- ----
- {"a":"b"}
- query T
- SELECT '["1","2","3"]'::JSONB - '1'
- ----
- ["2","3"]
- query T
- SELECT '["1","2","1","2","3"]'::JSONB - '2'
- ----
- ["1","1","3"]
- query T
- SELECT '["1","2","3"]'::JSONB - '4'
- ----
- ["1","2","3"]
- query T
- SELECT '[]'::JSONB - '1'
- ----
- []
- query T
- SELECT '["1","2","3"]'::JSONB - ''
- ----
- ["1","2","3"]
- query T
- SELECT '[1,"1",1.0]'::JSONB - '1'
- ----
- [1,1.0]
- query T
- SELECT '[1,2,3]'::JSONB #- ARRAY['0']
- ----
- [2,3]
- query T
- SELECT '[1,2,3]'::JSONB #- ARRAY['3']
- ----
- [1,2,3]
- query T
- SELECT '[]'::JSONB #- ARRAY['0']
- ----
- []
- statement error pgcode 22P02 a path element is not an integer:foo
- SELECT '["foo"]'::JSONB #- ARRAY['foo']
- query T
- SELECT '{"a":["foo"]}'::JSONB #- ARRAY['a','0']
- ----
- {"a":[]}
- query T
- SELECT '{"a":["foo","bar"]}'::JSONB #- ARRAY['a','1']
- ----
- {"a":["foo"]}
- query T
- SELECT '{"a":[]}'::JSONB #- ARRAY['a','0']
- ----
- {"a":[]}
- query T
- SELECT '{"a":123,"b":456,"c":567}'::JSONB - array[]:::text[];
- ----
- {"a":123,"b":456,"c":567}
- query T
- SELECT '{"a":123,"b":456,"c":567}'::JSONB - array['a','c'];
- ----
- {"b":456}
- query T
- SELECT '{"a":123,"c":"asdf"}'::JSONB - array['a','c'];
- ----
- {}
- query T
- SELECT '{}'::JSONB - array['a','c'];
- ----
- {}
- query T
- SELECT '{"b":[],"c":{"a":"b"}}'::JSONB - array['a'];
- ----
- {"b":[],"c":{"a":"b"}}
- # Regression test for cockroach#34756.
- query T
- SELECT '{"b":[],"c":{"a":"b"}}'::JSONB - array['foo',NULL]
- ----
- {"b":[],"c":{"a":"b"}}
- statement error pgcode 22P02 a path element is not an integer:foo
- SELECT '{"a":{"b":["foo"]}}'::JSONB #- ARRAY['a','b','foo']
- subtest single_family_jsonb
- statement ok
- CREATE TABLE json_family (a INT PRIMARY KEY,b JSONB,FAMILY fam0(a),FAMILY fam1(b))
- statement ok
- INSERT INTO json_family VALUES(0,'{}')
- statement ok
- INSERT INTO json_family VALUES(1,'{"a":123,"c":"asdf"}')
- query IT colnames
- SELECT a,b FROM json_family ORDER BY a
- ----
- a b
- 0 {}
- 1 {"a":123,"c":"asdf"}
- statement ok
- DROP TABLE json_family
|