@@ -830,11 +830,139 @@ select '"XXX"'::jsonb @@ '#.$="XXX"';
830830 f
831831(1 row)
832832
833+ --Unicode
834+ select 'a\t = "dollar \u0024 character"'::jsquery;
835+ jsquery
836+ ------------------------------
837+ "a\t" = "dollar $ character"
838+ (1 row)
839+
840+ select '{ "a": "dollar \u0024 character" }'::jsonb @@ '* = "dollar \u0024 character"';
841+ ?column?
842+ ----------
843+ t
844+ (1 row)
845+
846+ select '{ "a": "dollar \u0024 character" }'::jsonb @@ '* = "dollar $ character"';
847+ ?column?
848+ ----------
849+ t
850+ (1 row)
851+
852+ select '{ "a": "dollar $ character" }'::jsonb @@ '* = "dollar \u0024 character"';
853+ ?column?
854+ ----------
855+ t
856+ (1 row)
857+
858+ select 'a\r = "\n\""'::jsquery;
859+ jsquery
860+ ----------------
861+ "a\r" = "\n\""
862+ (1 row)
863+
864+ select 'a\r = "\u0000"'::jsquery;
865+ jsquery
866+ ------------------
867+ "a\r" = "\u0000"
868+ (1 row)
869+
870+ select 'a\r = \u0000'::jsquery;
871+ jsquery
872+ ------------------
873+ "a\r" = "\u0000"
874+ (1 row)
875+
876+ select 'a\r = "\abcd"'::jsquery AS err;
877+ ERROR: bad jsquery representation
878+ LINE 1: select 'a\r = "\abcd"'::jsquery AS err;
879+ ^
880+ DETAIL: Escape sequence is invalid at or near "\a"
881+ select 'a\r = "\\abcd"'::jsquery;
882+ jsquery
883+ ------------------
884+ "a\r" = "\\abcd"
885+ (1 row)
886+
887+ select 'a\r = "x\u0000"'::jsquery;
888+ jsquery
889+ -------------------
890+ "a\r" = "x\u0000"
891+ (1 row)
892+
893+ select 'a\r = x\u0000'::jsquery;
894+ jsquery
895+ -------------------
896+ "a\r" = "x\u0000"
897+ (1 row)
898+
899+ select 'a\r = "x\abcd"'::jsquery AS err;
900+ ERROR: bad jsquery representation
901+ LINE 1: select 'a\r = "x\abcd"'::jsquery AS err;
902+ ^
903+ DETAIL: Escape sequence is invalid at or near "\a"
904+ select 'a\r = "x\\abcd"'::jsquery;
905+ jsquery
906+ -------------------
907+ "a\r" = "x\\abcd"
908+ (1 row)
909+
910+ select 'a\r = "x\u0000x"'::jsquery;
911+ jsquery
912+ --------------------
913+ "a\r" = "x\u0000x"
914+ (1 row)
915+
916+ select 'a\r = x\u0000x'::jsquery;
917+ jsquery
918+ --------------------
919+ "a\r" = "x\u0000x"
920+ (1 row)
921+
922+ select 'a\r = "x\abcdx"'::jsquery AS err;
923+ ERROR: bad jsquery representation
924+ LINE 1: select 'a\r = "x\abcdx"'::jsquery AS err;
925+ ^
926+ DETAIL: Escape sequence is invalid at or near "\a"
927+ select 'a\r = "x\\abcdx"'::jsquery;
928+ jsquery
929+ --------------------
930+ "a\r" = "x\\abcdx"
931+ (1 row)
932+
933+ select 'a\r = "\u0000x"'::jsquery;
934+ jsquery
935+ -------------------
936+ "a\r" = "\u0000x"
937+ (1 row)
938+
939+ select 'a\r = \u0000x'::jsquery;
940+ jsquery
941+ -------------------
942+ "a\r" = "\u0000x"
943+ (1 row)
944+
945+ select 'a\r = "\abcdx"'::jsquery AS err;
946+ ERROR: bad jsquery representation
947+ LINE 1: select 'a\r = "\abcdx"'::jsquery AS err;
948+ ^
949+ DETAIL: Escape sequence is invalid at or near "\a"
950+ select 'a\r = "\\abcdx"'::jsquery;
951+ jsquery
952+ -------------------
953+ "a\r" = "\\abcdx"
954+ (1 row)
955+
956+ select 'a\r = x"\\abcd"'::jsquery AS err;
957+ ERROR: bad jsquery representation
958+ LINE 1: select 'a\r = x"\\abcd"'::jsquery AS err;
959+ ^
960+ DETAIL: syntax error, unexpected STRING_P, expecting $end at or near """
833961---table and index
834962select count(*) from test_jsquery where (v->>'review_helpful_votes')::int4 > 0;
835963 count
836964-------
837- 653
965+ 654
838966(1 row)
839967
840968select count(*) from test_jsquery where (v->>'review_helpful_votes')::int4 > 19;
@@ -846,7 +974,7 @@ select count(*) from test_jsquery where (v->>'review_helpful_votes')::int4 > 19;
846974select count(*) from test_jsquery where (v->>'review_helpful_votes')::int4 < 19;
847975 count
848976-------
849- 984
977+ 985
850978(1 row)
851979
852980select count(*) from test_jsquery where (v->>'review_helpful_votes')::int4 >= 19;
@@ -858,7 +986,7 @@ select count(*) from test_jsquery where (v->>'review_helpful_votes')::int4 >= 19
858986select count(*) from test_jsquery where (v->>'review_helpful_votes')::int4 <= 19;
859987 count
860988-------
861- 987
989+ 988
862990(1 row)
863991
864992select count(*) from test_jsquery where (v->>'review_helpful_votes')::int4 = 19;
@@ -877,7 +1005,7 @@ select count(*) from test_jsquery where (v->>'review_helpful_votes')::int4 > 16
8771005select count(*) from test_jsquery where v @@ 'review_helpful_votes > 0';
8781006 count
8791007-------
880- 653
1008+ 654
8811009(1 row)
8821010
8831011select count(*) from test_jsquery where v @@ 'review_helpful_votes > 19';
@@ -889,7 +1017,7 @@ select count(*) from test_jsquery where v @@ 'review_helpful_votes > 19';
8891017select count(*) from test_jsquery where v @@ 'review_helpful_votes < 19';
8901018 count
8911019-------
892- 984
1020+ 985
8931021(1 row)
8941022
8951023select count(*) from test_jsquery where v @@ 'review_helpful_votes >= 19';
@@ -901,7 +1029,7 @@ select count(*) from test_jsquery where v @@ 'review_helpful_votes >= 19';
9011029select count(*) from test_jsquery where v @@ 'review_helpful_votes <= 19';
9021030 count
9031031-------
904- 987
1032+ 988
9051033(1 row)
9061034
9071035select count(*) from test_jsquery where v @@ 'review_helpful_votes = 19';
@@ -953,6 +1081,24 @@ select count(*) from test_jsquery where v @@ 'similar_product_ids && ["044018029
9531081 4
9541082(1 row)
9551083
1084+ select count(*) from test_jsquery where v @@ 'customer_id = null';
1085+ count
1086+ -------
1087+ 1
1088+ (1 row)
1089+
1090+ select count(*) from test_jsquery where v @@ 'review_votes = true';
1091+ count
1092+ -------
1093+ 1
1094+ (1 row)
1095+
1096+ select count(*) from test_jsquery where v @@ 'product_group = false';
1097+ count
1098+ -------
1099+ 1
1100+ (1 row)
1101+
9561102create index t_idx on test_jsquery using gin (v jsonb_bloom_value_ops);
9571103set enable_seqscan = off;
9581104explain (costs off) select count(*) from test_jsquery where v @@ 'review_helpful_votes > 0';
@@ -968,7 +1114,7 @@ explain (costs off) select count(*) from test_jsquery where v @@ 'review_helpful
9681114select count(*) from test_jsquery where v @@ 'review_helpful_votes > 0';
9691115 count
9701116-------
971- 653
1117+ 654
9721118(1 row)
9731119
9741120select count(*) from test_jsquery where v @@ 'review_helpful_votes > 19';
@@ -980,7 +1126,7 @@ select count(*) from test_jsquery where v @@ 'review_helpful_votes > 19';
9801126select count(*) from test_jsquery where v @@ 'review_helpful_votes < 19';
9811127 count
9821128-------
983- 984
1129+ 985
9841130(1 row)
9851131
9861132select count(*) from test_jsquery where v @@ 'review_helpful_votes >= 19';
@@ -992,7 +1138,7 @@ select count(*) from test_jsquery where v @@ 'review_helpful_votes >= 19';
9921138select count(*) from test_jsquery where v @@ 'review_helpful_votes <= 19';
9931139 count
9941140-------
995- 987
1141+ 988
9961142(1 row)
9971143
9981144select count(*) from test_jsquery where v @@ 'review_helpful_votes = 19';
@@ -1044,6 +1190,24 @@ select count(*) from test_jsquery where v @@ 'similar_product_ids && ["044018029
10441190 4
10451191(1 row)
10461192
1193+ select count(*) from test_jsquery where v @@ 'customer_id = null';
1194+ count
1195+ -------
1196+ 1
1197+ (1 row)
1198+
1199+ select count(*) from test_jsquery where v @@ 'review_votes = true';
1200+ count
1201+ -------
1202+ 1
1203+ (1 row)
1204+
1205+ select count(*) from test_jsquery where v @@ 'product_group = false';
1206+ count
1207+ -------
1208+ 1
1209+ (1 row)
1210+
10471211drop index t_idx;
10481212create index t_idx on test_jsquery using gin (v jsonb_hash_value_ops);
10491213set enable_seqscan = off;
@@ -1060,7 +1224,7 @@ explain (costs off) select count(*) from test_jsquery where v @@ 'review_helpful
10601224select count(*) from test_jsquery where v @@ 'review_helpful_votes > 0';
10611225 count
10621226-------
1063- 653
1227+ 654
10641228(1 row)
10651229
10661230select count(*) from test_jsquery where v @@ 'review_helpful_votes > 19';
@@ -1072,7 +1236,7 @@ select count(*) from test_jsquery where v @@ 'review_helpful_votes > 19';
10721236select count(*) from test_jsquery where v @@ 'review_helpful_votes < 19';
10731237 count
10741238-------
1075- 984
1239+ 985
10761240(1 row)
10771241
10781242select count(*) from test_jsquery where v @@ 'review_helpful_votes >= 19';
@@ -1084,7 +1248,7 @@ select count(*) from test_jsquery where v @@ 'review_helpful_votes >= 19';
10841248select count(*) from test_jsquery where v @@ 'review_helpful_votes <= 19';
10851249 count
10861250-------
1087- 987
1251+ 988
10881252(1 row)
10891253
10901254select count(*) from test_jsquery where v @@ 'review_helpful_votes = 19';
@@ -1136,4 +1300,22 @@ select count(*) from test_jsquery where v @@ 'similar_product_ids && ["044018029
11361300 4
11371301(1 row)
11381302
1303+ select count(*) from test_jsquery where v @@ 'customer_id = null';
1304+ count
1305+ -------
1306+ 1
1307+ (1 row)
1308+
1309+ select count(*) from test_jsquery where v @@ 'review_votes = true';
1310+ count
1311+ -------
1312+ 1
1313+ (1 row)
1314+
1315+ select count(*) from test_jsquery where v @@ 'product_group = false';
1316+ count
1317+ -------
1318+ 1
1319+ (1 row)
1320+
11391321RESET enable_seqscan;