postgresql/src/test/regress/expected/jsonpath.out
Peter Eisentraut 102a5c164a SQL JSON path enhanced numeric literals
Add support for non-decimal integer literals and underscores in
numeric literals to SQL JSON path language.  This follows the rules of
ECMAScript, as referred to by the SQL standard.

Internally, all the numeric literal parsing of jsonpath goes through
numeric_in, which already supports all this, so this patch is just a
bit of lexer work and some tests and documentation.

Reviewed-by: Dean Rasheed <dean.a.rasheed@gmail.com>
Discussion: https://www.postgresql.org/message-id/flat/b11b25bb-6ec1-d42f-cedd-311eae59e1fb@enterprisedb.com
2023-03-05 15:19:58 +01:00

1219 lines
24 KiB
Plaintext

--jsonpath io
select ''::jsonpath;
ERROR: invalid input syntax for type jsonpath: ""
LINE 1: select ''::jsonpath;
^
select '$'::jsonpath;
jsonpath
----------
$
(1 row)
select 'strict $'::jsonpath;
jsonpath
----------
strict $
(1 row)
select 'lax $'::jsonpath;
jsonpath
----------
$
(1 row)
select '$.a'::jsonpath;
jsonpath
----------
$."a"
(1 row)
select '$.a.v'::jsonpath;
jsonpath
-----------
$."a"."v"
(1 row)
select '$.a.*'::jsonpath;
jsonpath
----------
$."a".*
(1 row)
select '$.*[*]'::jsonpath;
jsonpath
----------
$.*[*]
(1 row)
select '$.a[*]'::jsonpath;
jsonpath
----------
$."a"[*]
(1 row)
select '$.a[*][*]'::jsonpath;
jsonpath
-------------
$."a"[*][*]
(1 row)
select '$[*]'::jsonpath;
jsonpath
----------
$[*]
(1 row)
select '$[0]'::jsonpath;
jsonpath
----------
$[0]
(1 row)
select '$[*][0]'::jsonpath;
jsonpath
----------
$[*][0]
(1 row)
select '$[*].a'::jsonpath;
jsonpath
----------
$[*]."a"
(1 row)
select '$[*][0].a.b'::jsonpath;
jsonpath
-----------------
$[*][0]."a"."b"
(1 row)
select '$.a.**.b'::jsonpath;
jsonpath
--------------
$."a".**."b"
(1 row)
select '$.a.**{2}.b'::jsonpath;
jsonpath
-----------------
$."a".**{2}."b"
(1 row)
select '$.a.**{2 to 2}.b'::jsonpath;
jsonpath
-----------------
$."a".**{2}."b"
(1 row)
select '$.a.**{2 to 5}.b'::jsonpath;
jsonpath
----------------------
$."a".**{2 to 5}."b"
(1 row)
select '$.a.**{0 to 5}.b'::jsonpath;
jsonpath
----------------------
$."a".**{0 to 5}."b"
(1 row)
select '$.a.**{5 to last}.b'::jsonpath;
jsonpath
-------------------------
$."a".**{5 to last}."b"
(1 row)
select '$.a.**{last}.b'::jsonpath;
jsonpath
--------------------
$."a".**{last}."b"
(1 row)
select '$.a.**{last to 5}.b'::jsonpath;
jsonpath
-------------------------
$."a".**{last to 5}."b"
(1 row)
select '$+1'::jsonpath;
jsonpath
----------
($ + 1)
(1 row)
select '$-1'::jsonpath;
jsonpath
----------
($ - 1)
(1 row)
select '$--+1'::jsonpath;
jsonpath
----------
($ - -1)
(1 row)
select '$.a/+-1'::jsonpath;
jsonpath
--------------
($."a" / -1)
(1 row)
select '1 * 2 + 4 % -3 != false'::jsonpath;
jsonpath
---------------------------
(1 * 2 + 4 % -3 != false)
(1 row)
select '"\b\f\r\n\t\v\"\''\\"'::jsonpath;
jsonpath
-------------------------
"\b\f\r\n\t\u000b\"'\\"
(1 row)
select '"\x50\u0067\u{53}\u{051}\u{00004C}"'::jsonpath;
jsonpath
----------
"PgSQL"
(1 row)
select '$.foo\x50\u0067\u{53}\u{051}\u{00004C}\t\"bar'::jsonpath;
jsonpath
---------------------
$."fooPgSQL\t\"bar"
(1 row)
select '"\z"'::jsonpath; -- unrecognized escape is just the literal char
jsonpath
----------
"z"
(1 row)
select '$.g ? ($.a == 1)'::jsonpath;
jsonpath
--------------------
$."g"?($."a" == 1)
(1 row)
select '$.g ? (@ == 1)'::jsonpath;
jsonpath
----------------
$."g"?(@ == 1)
(1 row)
select '$.g ? (@.a == 1)'::jsonpath;
jsonpath
--------------------
$."g"?(@."a" == 1)
(1 row)
select '$.g ? (@.a == 1 || @.a == 4)'::jsonpath;
jsonpath
----------------------------------
$."g"?(@."a" == 1 || @."a" == 4)
(1 row)
select '$.g ? (@.a == 1 && @.a == 4)'::jsonpath;
jsonpath
----------------------------------
$."g"?(@."a" == 1 && @."a" == 4)
(1 row)
select '$.g ? (@.a == 1 || @.a == 4 && @.b == 7)'::jsonpath;
jsonpath
------------------------------------------------
$."g"?(@."a" == 1 || @."a" == 4 && @."b" == 7)
(1 row)
select '$.g ? (@.a == 1 || !(@.a == 4) && @.b == 7)'::jsonpath;
jsonpath
---------------------------------------------------
$."g"?(@."a" == 1 || !(@."a" == 4) && @."b" == 7)
(1 row)
select '$.g ? (@.a == 1 || !(@.x >= 123 || @.a == 4) && @.b == 7)'::jsonpath;
jsonpath
-------------------------------------------------------------------
$."g"?(@."a" == 1 || !(@."x" >= 123 || @."a" == 4) && @."b" == 7)
(1 row)
select '$.g ? (@.x >= @[*]?(@.a > "abc"))'::jsonpath;
jsonpath
---------------------------------------
$."g"?(@."x" >= @[*]?(@."a" > "abc"))
(1 row)
select '$.g ? ((@.x >= 123 || @.a == 4) is unknown)'::jsonpath;
jsonpath
-------------------------------------------------
$."g"?((@."x" >= 123 || @."a" == 4) is unknown)
(1 row)
select '$.g ? (exists (@.x))'::jsonpath;
jsonpath
------------------------
$."g"?(exists (@."x"))
(1 row)
select '$.g ? (exists (@.x ? (@ == 14)))'::jsonpath;
jsonpath
----------------------------------
$."g"?(exists (@."x"?(@ == 14)))
(1 row)
select '$.g ? ((@.x >= 123 || @.a == 4) && exists (@.x ? (@ == 14)))'::jsonpath;
jsonpath
------------------------------------------------------------------
$."g"?((@."x" >= 123 || @."a" == 4) && exists (@."x"?(@ == 14)))
(1 row)
select '$.g ? (+@.x >= +-(+@.a + 2))'::jsonpath;
jsonpath
------------------------------------
$."g"?(+@."x" >= +(-(+@."a" + 2)))
(1 row)
select '$a'::jsonpath;
jsonpath
----------
$"a"
(1 row)
select '$a.b'::jsonpath;
jsonpath
----------
$"a"."b"
(1 row)
select '$a[*]'::jsonpath;
jsonpath
----------
$"a"[*]
(1 row)
select '$.g ? (@.zip == $zip)'::jsonpath;
jsonpath
---------------------------
$."g"?(@."zip" == $"zip")
(1 row)
select '$.a[1,2, 3 to 16]'::jsonpath;
jsonpath
--------------------
$."a"[1,2,3 to 16]
(1 row)
select '$.a[$a + 1, ($b[*]) to -($[0] * 2)]'::jsonpath;
jsonpath
----------------------------------------
$."a"[$"a" + 1,$"b"[*] to -($[0] * 2)]
(1 row)
select '$.a[$.a.size() - 3]'::jsonpath;
jsonpath
-------------------------
$."a"[$."a".size() - 3]
(1 row)
select 'last'::jsonpath;
ERROR: LAST is allowed only in array subscripts
LINE 1: select 'last'::jsonpath;
^
select '"last"'::jsonpath;
jsonpath
----------
"last"
(1 row)
select '$.last'::jsonpath;
jsonpath
----------
$."last"
(1 row)
select '$ ? (last > 0)'::jsonpath;
ERROR: LAST is allowed only in array subscripts
LINE 1: select '$ ? (last > 0)'::jsonpath;
^
select '$[last]'::jsonpath;
jsonpath
----------
$[last]
(1 row)
select '$[$[0] ? (last > 0)]'::jsonpath;
jsonpath
--------------------
$[$[0]?(last > 0)]
(1 row)
select 'null.type()'::jsonpath;
jsonpath
-------------
null.type()
(1 row)
select '1.type()'::jsonpath;
ERROR: trailing junk after numeric literal at or near "1.t" of jsonpath input
LINE 1: select '1.type()'::jsonpath;
^
select '(1).type()'::jsonpath;
jsonpath
------------
(1).type()
(1 row)
select '1.2.type()'::jsonpath;
jsonpath
--------------
(1.2).type()
(1 row)
select '"aaa".type()'::jsonpath;
jsonpath
--------------
"aaa".type()
(1 row)
select 'true.type()'::jsonpath;
jsonpath
-------------
true.type()
(1 row)
select '$.double().floor().ceiling().abs()'::jsonpath;
jsonpath
------------------------------------
$.double().floor().ceiling().abs()
(1 row)
select '$.keyvalue().key'::jsonpath;
jsonpath
--------------------
$.keyvalue()."key"
(1 row)
select '$.datetime()'::jsonpath;
jsonpath
--------------
$.datetime()
(1 row)
select '$.datetime("datetime template")'::jsonpath;
jsonpath
---------------------------------
$.datetime("datetime template")
(1 row)
select '$ ? (@ starts with "abc")'::jsonpath;
jsonpath
-------------------------
$?(@ starts with "abc")
(1 row)
select '$ ? (@ starts with $var)'::jsonpath;
jsonpath
--------------------------
$?(@ starts with $"var")
(1 row)
select '$ ? (@ like_regex "(invalid pattern")'::jsonpath;
ERROR: invalid regular expression: parentheses () not balanced
LINE 1: select '$ ? (@ like_regex "(invalid pattern")'::jsonpath;
^
select '$ ? (@ like_regex "pattern")'::jsonpath;
jsonpath
----------------------------
$?(@ like_regex "pattern")
(1 row)
select '$ ? (@ like_regex "pattern" flag "")'::jsonpath;
jsonpath
----------------------------
$?(@ like_regex "pattern")
(1 row)
select '$ ? (@ like_regex "pattern" flag "i")'::jsonpath;
jsonpath
-------------------------------------
$?(@ like_regex "pattern" flag "i")
(1 row)
select '$ ? (@ like_regex "pattern" flag "is")'::jsonpath;
jsonpath
--------------------------------------
$?(@ like_regex "pattern" flag "is")
(1 row)
select '$ ? (@ like_regex "pattern" flag "isim")'::jsonpath;
jsonpath
---------------------------------------
$?(@ like_regex "pattern" flag "ism")
(1 row)
select '$ ? (@ like_regex "pattern" flag "xsms")'::jsonpath;
ERROR: XQuery "x" flag (expanded regular expressions) is not implemented
LINE 1: select '$ ? (@ like_regex "pattern" flag "xsms")'::jsonpath;
^
select '$ ? (@ like_regex "pattern" flag "q")'::jsonpath;
jsonpath
-------------------------------------
$?(@ like_regex "pattern" flag "q")
(1 row)
select '$ ? (@ like_regex "pattern" flag "iq")'::jsonpath;
jsonpath
--------------------------------------
$?(@ like_regex "pattern" flag "iq")
(1 row)
select '$ ? (@ like_regex "pattern" flag "smixq")'::jsonpath;
jsonpath
-----------------------------------------
$?(@ like_regex "pattern" flag "ismxq")
(1 row)
select '$ ? (@ like_regex "pattern" flag "a")'::jsonpath;
ERROR: invalid input syntax for type jsonpath
LINE 1: select '$ ? (@ like_regex "pattern" flag "a")'::jsonpath;
^
DETAIL: Unrecognized flag character "a" in LIKE_REGEX predicate.
select '$ < 1'::jsonpath;
jsonpath
----------
($ < 1)
(1 row)
select '($ < 1) || $.a.b <= $x'::jsonpath;
jsonpath
------------------------------
($ < 1 || $."a"."b" <= $"x")
(1 row)
select '@ + 1'::jsonpath;
ERROR: @ is not allowed in root expressions
LINE 1: select '@ + 1'::jsonpath;
^
select '($).a.b'::jsonpath;
jsonpath
-----------
$."a"."b"
(1 row)
select '($.a.b).c.d'::jsonpath;
jsonpath
-------------------
$."a"."b"."c"."d"
(1 row)
select '($.a.b + -$.x.y).c.d'::jsonpath;
jsonpath
----------------------------------
($."a"."b" + -$."x"."y")."c"."d"
(1 row)
select '(-+$.a.b).c.d'::jsonpath;
jsonpath
-------------------------
(-(+$."a"."b"))."c"."d"
(1 row)
select '1 + ($.a.b + 2).c.d'::jsonpath;
jsonpath
-------------------------------
(1 + ($."a"."b" + 2)."c"."d")
(1 row)
select '1 + ($.a.b > 2).c.d'::jsonpath;
jsonpath
-------------------------------
(1 + ($."a"."b" > 2)."c"."d")
(1 row)
select '($)'::jsonpath;
jsonpath
----------
$
(1 row)
select '(($))'::jsonpath;
jsonpath
----------
$
(1 row)
select '((($ + 1)).a + ((2)).b ? ((((@ > 1)) || (exists(@.c)))))'::jsonpath;
jsonpath
---------------------------------------------------
(($ + 1)."a" + (2)."b"?(@ > 1 || exists (@."c")))
(1 row)
select '$ ? (@.a < 1)'::jsonpath;
jsonpath
---------------
$?(@."a" < 1)
(1 row)
select '$ ? (@.a < -1)'::jsonpath;
jsonpath
----------------
$?(@."a" < -1)
(1 row)
select '$ ? (@.a < +1)'::jsonpath;
jsonpath
---------------
$?(@."a" < 1)
(1 row)
select '$ ? (@.a < .1)'::jsonpath;
jsonpath
-----------------
$?(@."a" < 0.1)
(1 row)
select '$ ? (@.a < -.1)'::jsonpath;
jsonpath
------------------
$?(@."a" < -0.1)
(1 row)
select '$ ? (@.a < +.1)'::jsonpath;
jsonpath
-----------------
$?(@."a" < 0.1)
(1 row)
select '$ ? (@.a < 0.1)'::jsonpath;
jsonpath
-----------------
$?(@."a" < 0.1)
(1 row)
select '$ ? (@.a < -0.1)'::jsonpath;
jsonpath
------------------
$?(@."a" < -0.1)
(1 row)
select '$ ? (@.a < +0.1)'::jsonpath;
jsonpath
-----------------
$?(@."a" < 0.1)
(1 row)
select '$ ? (@.a < 10.1)'::jsonpath;
jsonpath
------------------
$?(@."a" < 10.1)
(1 row)
select '$ ? (@.a < -10.1)'::jsonpath;
jsonpath
-------------------
$?(@."a" < -10.1)
(1 row)
select '$ ? (@.a < +10.1)'::jsonpath;
jsonpath
------------------
$?(@."a" < 10.1)
(1 row)
select '$ ? (@.a < 1e1)'::jsonpath;
jsonpath
----------------
$?(@."a" < 10)
(1 row)
select '$ ? (@.a < -1e1)'::jsonpath;
jsonpath
-----------------
$?(@."a" < -10)
(1 row)
select '$ ? (@.a < +1e1)'::jsonpath;
jsonpath
----------------
$?(@."a" < 10)
(1 row)
select '$ ? (@.a < .1e1)'::jsonpath;
jsonpath
---------------
$?(@."a" < 1)
(1 row)
select '$ ? (@.a < -.1e1)'::jsonpath;
jsonpath
----------------
$?(@."a" < -1)
(1 row)
select '$ ? (@.a < +.1e1)'::jsonpath;
jsonpath
---------------
$?(@."a" < 1)
(1 row)
select '$ ? (@.a < 0.1e1)'::jsonpath;
jsonpath
---------------
$?(@."a" < 1)
(1 row)
select '$ ? (@.a < -0.1e1)'::jsonpath;
jsonpath
----------------
$?(@."a" < -1)
(1 row)
select '$ ? (@.a < +0.1e1)'::jsonpath;
jsonpath
---------------
$?(@."a" < 1)
(1 row)
select '$ ? (@.a < 10.1e1)'::jsonpath;
jsonpath
-----------------
$?(@."a" < 101)
(1 row)
select '$ ? (@.a < -10.1e1)'::jsonpath;
jsonpath
------------------
$?(@."a" < -101)
(1 row)
select '$ ? (@.a < +10.1e1)'::jsonpath;
jsonpath
-----------------
$?(@."a" < 101)
(1 row)
select '$ ? (@.a < 1e-1)'::jsonpath;
jsonpath
-----------------
$?(@."a" < 0.1)
(1 row)
select '$ ? (@.a < -1e-1)'::jsonpath;
jsonpath
------------------
$?(@."a" < -0.1)
(1 row)
select '$ ? (@.a < +1e-1)'::jsonpath;
jsonpath
-----------------
$?(@."a" < 0.1)
(1 row)
select '$ ? (@.a < .1e-1)'::jsonpath;
jsonpath
------------------
$?(@."a" < 0.01)
(1 row)
select '$ ? (@.a < -.1e-1)'::jsonpath;
jsonpath
-------------------
$?(@."a" < -0.01)
(1 row)
select '$ ? (@.a < +.1e-1)'::jsonpath;
jsonpath
------------------
$?(@."a" < 0.01)
(1 row)
select '$ ? (@.a < 0.1e-1)'::jsonpath;
jsonpath
------------------
$?(@."a" < 0.01)
(1 row)
select '$ ? (@.a < -0.1e-1)'::jsonpath;
jsonpath
-------------------
$?(@."a" < -0.01)
(1 row)
select '$ ? (@.a < +0.1e-1)'::jsonpath;
jsonpath
------------------
$?(@."a" < 0.01)
(1 row)
select '$ ? (@.a < 10.1e-1)'::jsonpath;
jsonpath
------------------
$?(@."a" < 1.01)
(1 row)
select '$ ? (@.a < -10.1e-1)'::jsonpath;
jsonpath
-------------------
$?(@."a" < -1.01)
(1 row)
select '$ ? (@.a < +10.1e-1)'::jsonpath;
jsonpath
------------------
$?(@."a" < 1.01)
(1 row)
select '$ ? (@.a < 1e+1)'::jsonpath;
jsonpath
----------------
$?(@."a" < 10)
(1 row)
select '$ ? (@.a < -1e+1)'::jsonpath;
jsonpath
-----------------
$?(@."a" < -10)
(1 row)
select '$ ? (@.a < +1e+1)'::jsonpath;
jsonpath
----------------
$?(@."a" < 10)
(1 row)
select '$ ? (@.a < .1e+1)'::jsonpath;
jsonpath
---------------
$?(@."a" < 1)
(1 row)
select '$ ? (@.a < -.1e+1)'::jsonpath;
jsonpath
----------------
$?(@."a" < -1)
(1 row)
select '$ ? (@.a < +.1e+1)'::jsonpath;
jsonpath
---------------
$?(@."a" < 1)
(1 row)
select '$ ? (@.a < 0.1e+1)'::jsonpath;
jsonpath
---------------
$?(@."a" < 1)
(1 row)
select '$ ? (@.a < -0.1e+1)'::jsonpath;
jsonpath
----------------
$?(@."a" < -1)
(1 row)
select '$ ? (@.a < +0.1e+1)'::jsonpath;
jsonpath
---------------
$?(@."a" < 1)
(1 row)
select '$ ? (@.a < 10.1e+1)'::jsonpath;
jsonpath
-----------------
$?(@."a" < 101)
(1 row)
select '$ ? (@.a < -10.1e+1)'::jsonpath;
jsonpath
------------------
$?(@."a" < -101)
(1 row)
select '$ ? (@.a < +10.1e+1)'::jsonpath;
jsonpath
-----------------
$?(@."a" < 101)
(1 row)
-- numeric literals
select '0'::jsonpath;
jsonpath
----------
0
(1 row)
select '00'::jsonpath;
ERROR: trailing junk after numeric literal at or near "00" of jsonpath input
LINE 1: select '00'::jsonpath;
^
select '0755'::jsonpath;
ERROR: syntax error at end of jsonpath input
LINE 1: select '0755'::jsonpath;
^
select '0.0'::jsonpath;
jsonpath
----------
0.0
(1 row)
select '0.000'::jsonpath;
jsonpath
----------
0.000
(1 row)
select '0.000e1'::jsonpath;
jsonpath
----------
0.00
(1 row)
select '0.000e2'::jsonpath;
jsonpath
----------
0.0
(1 row)
select '0.000e3'::jsonpath;
jsonpath
----------
0
(1 row)
select '0.0010'::jsonpath;
jsonpath
----------
0.0010
(1 row)
select '0.0010e-1'::jsonpath;
jsonpath
----------
0.00010
(1 row)
select '0.0010e+1'::jsonpath;
jsonpath
----------
0.010
(1 row)
select '0.0010e+2'::jsonpath;
jsonpath
----------
0.10
(1 row)
select '.001'::jsonpath;
jsonpath
----------
0.001
(1 row)
select '.001e1'::jsonpath;
jsonpath
----------
0.01
(1 row)
select '1.'::jsonpath;
jsonpath
----------
1
(1 row)
select '1.e1'::jsonpath;
jsonpath
----------
10
(1 row)
select '1a'::jsonpath;
ERROR: trailing junk after numeric literal at or near "1a" of jsonpath input
LINE 1: select '1a'::jsonpath;
^
select '1e'::jsonpath;
ERROR: trailing junk after numeric literal at or near "1e" of jsonpath input
LINE 1: select '1e'::jsonpath;
^
select '1.e'::jsonpath;
ERROR: trailing junk after numeric literal at or near "1.e" of jsonpath input
LINE 1: select '1.e'::jsonpath;
^
select '1.2a'::jsonpath;
ERROR: trailing junk after numeric literal at or near "1.2a" of jsonpath input
LINE 1: select '1.2a'::jsonpath;
^
select '1.2e'::jsonpath;
ERROR: trailing junk after numeric literal at or near "1.2e" of jsonpath input
LINE 1: select '1.2e'::jsonpath;
^
select '1.2.e'::jsonpath;
jsonpath
-----------
(1.2)."e"
(1 row)
select '(1.2).e'::jsonpath;
jsonpath
-----------
(1.2)."e"
(1 row)
select '1e3'::jsonpath;
jsonpath
----------
1000
(1 row)
select '1.e3'::jsonpath;
jsonpath
----------
1000
(1 row)
select '1.e3.e'::jsonpath;
jsonpath
------------
(1000)."e"
(1 row)
select '1.e3.e4'::jsonpath;
jsonpath
-------------
(1000)."e4"
(1 row)
select '1.2e3'::jsonpath;
jsonpath
----------
1200
(1 row)
select '1.2e3a'::jsonpath;
ERROR: trailing junk after numeric literal at or near "1.2e3a" of jsonpath input
LINE 1: select '1.2e3a'::jsonpath;
^
select '1.2.e3'::jsonpath;
jsonpath
------------
(1.2)."e3"
(1 row)
select '(1.2).e3'::jsonpath;
jsonpath
------------
(1.2)."e3"
(1 row)
select '1..e'::jsonpath;
jsonpath
----------
(1)."e"
(1 row)
select '1..e3'::jsonpath;
jsonpath
----------
(1)."e3"
(1 row)
select '(1.).e'::jsonpath;
jsonpath
----------
(1)."e"
(1 row)
select '(1.).e3'::jsonpath;
jsonpath
----------
(1)."e3"
(1 row)
select '1?(2>3)'::jsonpath;
jsonpath
-------------
(1)?(2 > 3)
(1 row)
-- nondecimal
select '0b100101'::jsonpath;
jsonpath
----------
37
(1 row)
select '0o273'::jsonpath;
jsonpath
----------
187
(1 row)
select '0x42F'::jsonpath;
jsonpath
----------
1071
(1 row)
-- error cases
select '0b'::jsonpath;
ERROR: trailing junk after numeric literal at or near "0b" of jsonpath input
LINE 1: select '0b'::jsonpath;
^
select '1b'::jsonpath;
ERROR: trailing junk after numeric literal at or near "1b" of jsonpath input
LINE 1: select '1b'::jsonpath;
^
select '0b0x'::jsonpath;
ERROR: syntax error at end of jsonpath input
LINE 1: select '0b0x'::jsonpath;
^
select '0o'::jsonpath;
ERROR: trailing junk after numeric literal at or near "0o" of jsonpath input
LINE 1: select '0o'::jsonpath;
^
select '1o'::jsonpath;
ERROR: trailing junk after numeric literal at or near "1o" of jsonpath input
LINE 1: select '1o'::jsonpath;
^
select '0o0x'::jsonpath;
ERROR: syntax error at end of jsonpath input
LINE 1: select '0o0x'::jsonpath;
^
select '0x'::jsonpath;
ERROR: trailing junk after numeric literal at or near "0x" of jsonpath input
LINE 1: select '0x'::jsonpath;
^
select '1x'::jsonpath;
ERROR: trailing junk after numeric literal at or near "1x" of jsonpath input
LINE 1: select '1x'::jsonpath;
^
select '0x0y'::jsonpath;
ERROR: syntax error at end of jsonpath input
LINE 1: select '0x0y'::jsonpath;
^
-- underscores
select '1_000_000'::jsonpath;
jsonpath
----------
1000000
(1 row)
select '1_2_3'::jsonpath;
jsonpath
----------
123
(1 row)
select '0x1EEE_FFFF'::jsonpath;
jsonpath
-----------
518979583
(1 row)
select '0o2_73'::jsonpath;
jsonpath
----------
187
(1 row)
select '0b10_0101'::jsonpath;
jsonpath
----------
37
(1 row)
select '1_000.000_005'::jsonpath;
jsonpath
-------------
1000.000005
(1 row)
select '1_000.'::jsonpath;
jsonpath
----------
1000
(1 row)
select '.000_005'::jsonpath;
jsonpath
----------
0.000005
(1 row)
select '1_000.5e0_1'::jsonpath;
jsonpath
----------
10005
(1 row)
-- error cases
select '_100'::jsonpath;
ERROR: syntax error at end of jsonpath input
LINE 1: select '_100'::jsonpath;
^
select '100_'::jsonpath;
ERROR: trailing junk after numeric literal at or near "100_" of jsonpath input
LINE 1: select '100_'::jsonpath;
^
select '100__000'::jsonpath;
ERROR: syntax error at end of jsonpath input
LINE 1: select '100__000'::jsonpath;
^
select '_1_000.5'::jsonpath;
ERROR: syntax error at end of jsonpath input
LINE 1: select '_1_000.5'::jsonpath;
^
select '1_000_.5'::jsonpath;
ERROR: trailing junk after numeric literal at or near "1_000_" of jsonpath input
LINE 1: select '1_000_.5'::jsonpath;
^
select '1_000._5'::jsonpath;
ERROR: trailing junk after numeric literal at or near "1_000._" of jsonpath input
LINE 1: select '1_000._5'::jsonpath;
^
select '1_000.5_'::jsonpath;
ERROR: trailing junk after numeric literal at or near "1_000.5_" of jsonpath input
LINE 1: select '1_000.5_'::jsonpath;
^
select '1_000.5e_1'::jsonpath;
ERROR: trailing junk after numeric literal at or near "1_000.5e" of jsonpath input
LINE 1: select '1_000.5e_1'::jsonpath;
^
-- underscore after prefix not allowed in JavaScript (but allowed in SQL)
select '0b_10_0101'::jsonpath;
ERROR: syntax error at end of jsonpath input
LINE 1: select '0b_10_0101'::jsonpath;
^
select '0o_273'::jsonpath;
ERROR: syntax error at end of jsonpath input
LINE 1: select '0o_273'::jsonpath;
^
select '0x_42F'::jsonpath;
ERROR: syntax error at end of jsonpath input
LINE 1: select '0x_42F'::jsonpath;
^
-- test non-error-throwing API
SELECT str as jsonpath,
pg_input_is_valid(str,'jsonpath') as ok,
errinfo.sql_error_code,
errinfo.message,
errinfo.detail,
errinfo.hint
FROM unnest(ARRAY['$ ? (@ like_regex "pattern" flag "smixq")'::text,
'$ ? (@ like_regex "pattern" flag "a")',
'@ + 1',
'00',
'1a']) str,
LATERAL pg_input_error_info(str, 'jsonpath') as errinfo;
jsonpath | ok | sql_error_code | message | detail | hint
-------------------------------------------+----+----------------+-----------------------------------------------------------------------+----------------------------------------------------------+------
$ ? (@ like_regex "pattern" flag "smixq") | t | | | |
$ ? (@ like_regex "pattern" flag "a") | f | 42601 | invalid input syntax for type jsonpath | Unrecognized flag character "a" in LIKE_REGEX predicate. |
@ + 1 | f | 42601 | @ is not allowed in root expressions | |
00 | f | 42601 | trailing junk after numeric literal at or near "00" of jsonpath input | |
1a | f | 42601 | trailing junk after numeric literal at or near "1a" of jsonpath input | |
(5 rows)