text: -- 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
  
  -- 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
  
  --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)
    FROM ( SELECT $$a$$ || x AS b, y AS c, 
                 ARRAY[ROW(x.*,ARRAY[1,2,3]),
                 ROW(y.*,ARRAY[4,5,6])] AS z 
           FROM generate_series(1,2) x, 
                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'));
  
  SELECT row_to_json(q) 
  FROM (SELECT $$a$$ || x AS b, 
           y AS c, 
           ARRAY[ROW(x.*,ARRAY[1,2,3]),
                 ROW(y.*,ARRAY[4,5,6])] AS z 
        FROM generate_series(1,2) x, 
             generate_series(4,5) y) q;
  
  SELECT row_to_json(q,true) 
  FROM (SELECT $$a$$ || x AS b, 
           y AS c, 
           ARRAY[ROW(x.*,ARRAY[1,2,3]),
                 ROW(y.*,ARRAY[4,5,6])] AS z 
        FROM generate_series(1,2) x, 
             generate_series(4,5) y) q;
  
  CREATE TEMP TABLE rows AS
  SELECT x, 'txt' || x as y
  FROM generate_series(1,3) AS x;
  
  SELECT row_to_json(q,true) 
  FROM rows q;
  
  SELECT row_to_json(row((select array_agg(x) as d from generate_series(5,10) x)),false);
  
  -- 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;
  
  