2012-01-31 17:48:23 +01:00
-- Strings.
SELECT ' "" ' : : json ; -- OK.
SELECT $ $ ' ' $ $ : : json ; -- ERROR, single quotes are not allowed
SELECT ' "abc" ' : : json ; -- OK
SELECT ' "abc ' : : json ; -- ERROR, quotes not closed
SELECT ' "abc
def " '::json; -- ERROR, unescaped newline in string constant
SELECT ' "\n\"\\" ' : : json ; -- OK, legal escapes
SELECT ' "\v" ' : : json ; -- ERROR, not a valid JSON escape
SELECT ' "\u" ' : : json ; -- ERROR, incomplete escape
SELECT ' "\u00" ' : : json ; -- ERROR, incomplete escape
SELECT ' "\u000g" ' : : json ; -- ERROR, g is not a hex digit
SELECT ' "\u0000" ' : : json ; -- OK, legal escape
SELECT ' "\uaBcD" ' : : json ; -- OK, uppercase and lower case both OK
-- Numbers.
SELECT ' 1 ' : : json ; -- OK
SELECT ' 0 ' : : json ; -- OK
SELECT ' 01 ' : : json ; -- ERROR, not valid according to JSON spec
SELECT ' 0.1 ' : : json ; -- OK
SELECT ' 9223372036854775808 ' : : json ; -- OK, even though it's too large for int8
SELECT ' 1e100 ' : : json ; -- OK
SELECT ' 1.3e100 ' : : json ; -- OK
SELECT ' 1f2 ' : : json ; -- ERROR
2012-05-20 01:24:46 +02:00
SELECT ' 0.x1 ' : : json ; -- ERROR
SELECT ' 1.3ex100 ' : : json ; -- ERROR
2012-01-31 17:48:23 +01:00
-- Arrays.
SELECT ' [] ' : : json ; -- OK
SELECT ' [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] ' : : json ; -- OK
SELECT ' [1,2] ' : : json ; -- OK
SELECT ' [1,2,] ' : : json ; -- ERROR, trailing comma
SELECT ' [1,2 ' : : json ; -- ERROR, no closing bracket
SELECT ' [1,[2] ' : : json ; -- ERROR, no closing bracket
-- Objects.
SELECT ' {} ' : : json ; -- OK
SELECT ' {"abc"} ' : : json ; -- ERROR, no value
SELECT ' {"abc":1} ' : : json ; -- OK
SELECT ' {1:"abc"} ' : : json ; -- ERROR, keys must be strings
SELECT ' {"abc",1} ' : : json ; -- ERROR, wrong separator
SELECT ' {"abc"=1} ' : : json ; -- ERROR, totally wrong separator
SELECT ' {"abc"::1} ' : : json ; -- ERROR, another wrong separator
SELECT ' {"abc":1,"def":2,"ghi":[3,4],"hij":{"klm":5,"nop":[6]}} ' : : json ; -- OK
SELECT ' {"abc":1:2} ' : : json ; -- ERROR, colon in wrong spot
SELECT ' {"abc":1,3} ' : : json ; -- ERROR, no value
-- Miscellaneous stuff.
SELECT ' true ' : : json ; -- OK
SELECT ' false ' : : json ; -- OK
SELECT ' null ' : : json ; -- OK
SELECT ' true ' : : json ; -- OK, even with extra whitespace
SELECT ' true false ' : : json ; -- ERROR, too many values
SELECT ' true, false ' : : json ; -- ERROR, too many values
SELECT ' truf ' : : json ; -- ERROR, not a keyword
SELECT ' trues ' : : json ; -- ERROR, not a keyword
SELECT ' ' : : json ; -- ERROR, no value
SELECT ' ' : : json ; -- ERROR, no value
2012-02-03 18:11:16 +01:00
- - constructors
-- array_to_json
SELECT array_to_json ( array ( select 1 as a ) ) ;
SELECT array_to_json ( array_agg ( q ) , false ) from ( select x as b , x * 2 as c from generate_series ( 1 , 3 ) x ) q ;
SELECT array_to_json ( array_agg ( q ) , true ) from ( select x as b , x * 2 as c from generate_series ( 1 , 3 ) x ) q ;
SELECT array_to_json ( array_agg ( q ) , false )
2012-05-15 21:19:04 +02:00
FROM ( SELECT $ $ a $ $ | | x AS b , y AS c ,
2012-02-03 18:11:16 +01:00
ARRAY [ ROW ( x . * , ARRAY [ 1 , 2 , 3 ] ) ,
2012-05-15 21:19:04 +02:00
ROW ( y . * , ARRAY [ 4 , 5 , 6 ] ) ] AS z
FROM generate_series ( 1 , 2 ) x ,
2012-02-03 18:11:16 +01:00
generate_series ( 4 , 5 ) y ) q ;
SELECT array_to_json ( array_agg ( x ) , false ) from generate_series ( 5 , 10 ) x ;
SELECT array_to_json ( ' {{1,5},{99,100}} ' : : int [ ] ) ;
-- row_to_json
SELECT row_to_json ( row ( 1 , ' foo ' ) ) ;
2012-05-15 21:19:04 +02:00
SELECT row_to_json ( q )
FROM ( SELECT $ $ a $ $ | | x AS b ,
y AS c ,
2012-02-03 18:11:16 +01:00
ARRAY [ ROW ( x . * , ARRAY [ 1 , 2 , 3 ] ) ,
2012-05-15 21:19:04 +02:00
ROW ( y . * , ARRAY [ 4 , 5 , 6 ] ) ] AS z
FROM generate_series ( 1 , 2 ) x ,
2012-02-03 18:11:16 +01:00
generate_series ( 4 , 5 ) y ) q ;
2012-05-15 21:19:04 +02:00
SELECT row_to_json ( q , true )
FROM ( SELECT $ $ a $ $ | | x AS b ,
y AS c ,
2012-02-03 18:11:16 +01:00
ARRAY [ ROW ( x . * , ARRAY [ 1 , 2 , 3 ] ) ,
2012-05-15 21:19:04 +02:00
ROW ( y . * , ARRAY [ 4 , 5 , 6 ] ) ] AS z
FROM generate_series ( 1 , 2 ) x ,
2012-02-03 18:11:16 +01:00
generate_series ( 4 , 5 ) y ) q ;
CREATE TEMP TABLE rows AS
SELECT x , ' txt ' | | x as y
FROM generate_series ( 1 , 3 ) AS x ;
2012-05-15 21:19:04 +02:00
SELECT row_to_json ( q , true )
2012-02-03 18:11:16 +01:00
FROM rows q ;
SELECT row_to_json ( row ( ( select array_agg ( x ) as d from generate_series ( 5 , 10 ) x ) ) , false ) ;
2012-02-20 21:01:03 +01:00
-- non-numeric output
SELECT row_to_json ( q )
FROM ( SELECT ' NaN ' : : float8 AS " float8field " ) q ;
SELECT row_to_json ( q )
FROM ( SELECT ' Infinity ' : : float8 AS " float8field " ) q ;
SELECT row_to_json ( q )
FROM ( SELECT ' -Infinity ' : : float8 AS " float8field " ) q ;
-- json input
SELECT row_to_json ( q )
FROM ( SELECT ' {"a":1,"b": [2,3,4,"d","e","f"],"c":{"p":1,"q":2}} ' : : json AS " jsonfield " ) q ;