@@ -30,7 +30,9 @@ import (
3030
3131var Cases = []TestCase {
3232 {Run : JSONExtract , Schema : JSONExtract_Schema },
33- {Run : JSONPathOperations },
33+ {Run : FnJSONKeys },
34+ {Run : FnJSONExtract },
35+ {Run : FnJSONContainsPath },
3436 {Run : JSONArray },
3537 {Run : JSONObject },
3638 {Run : CharsetConversionOperators },
@@ -176,18 +178,67 @@ var Cases = []TestCase{
176178 {Run : RegexpReplace },
177179}
178180
179- func JSONPathOperations (yield Query ) {
181+ func FnJSONKeys (yield Query ) {
180182 for _ , obj := range inputJSONObjects {
181183 yield (fmt .Sprintf ("JSON_KEYS('%s')" , obj ), nil , false )
182184
185+ for _ , path1 := range inputJSONPaths {
186+ yield (fmt .Sprintf ("JSON_KEYS('%s', '%s')" , obj , path1 ), nil , false )
187+ }
188+ }
189+ }
190+
191+ func FnJSONExtract (yield Query ) {
192+ for _ , obj := range inputJSONObjects {
183193 for _ , path1 := range inputJSONPaths {
184194 yield (fmt .Sprintf ("JSON_EXTRACT('%s', '%s')" , obj , path1 ), nil , false )
195+
196+ for _ , path2 := range inputJSONPaths {
197+ yield (fmt .Sprintf ("JSON_EXTRACT('%s', '%s', '%s')" , obj , path1 , path2 ), nil , false )
198+ }
199+ }
200+ }
201+
202+ yield (`JSON_EXTRACT('{"a": 1}', '$.a')` , nil , false )
203+ yield (`JSON_EXTRACT('{"a": 1}', '$.*')` , nil , false )
204+ yield (`JSON_EXTRACT('[1, 2, 3]', '$[0 to 2]')` , nil , false )
205+ yield (`JSON_EXTRACT('{"a": 1, "b": 2}', '$.a', '$.b')` , nil , false )
206+ yield (`JSON_EXTRACT('{"a": 1}', '$.a', '$.z')` , nil , false )
207+
208+ yield (`JSON_EXTRACT(CONCAT('{', '"a"', ':', ' ', '1', '}'), '$.a')` , nil , false )
209+ yield (`JSON_EXTRACT('{"a": 1}', CONCAT('$', '.', 'a'))` , nil , false )
210+
211+ yield (`JSON_EXTRACT(NULL, '$.a')` , nil , false )
212+ yield (`JSON_EXTRACT(NULL, NULL)` , nil , false )
213+
214+ yield (`JSON_EXTRACT('{"a": 1}', NULL)` , nil , false )
215+ yield (`JSON_EXTRACT('{"a": 1}', '$.a', NULL)` , nil , false )
216+ yield (`JSON_EXTRACT('{"a": 1}', NULL, '$.a')` , nil , false )
217+
218+ yield (`JSON_EXTRACT('{"a": 1}', '$.b')` , nil , false )
219+ yield (`JSON_EXTRACT('{"a": 1}', '$.b', '$.c')` , nil , false )
220+ yield (`JSON_EXTRACT('[1,2,3]', '$[10]')` , nil , false )
221+
222+ yield (`JSON_EXTRACT('{invalid}', '$.a')` , nil , false )
223+ yield (`JSON_EXTRACT('not json', '$.a')` , nil , false )
224+ yield (`JSON_EXTRACT('', '$.a')` , nil , false )
225+ yield (`JSON_EXTRACT('{invalid}', NULL)` , nil , false )
226+
227+ yield (`JSON_EXTRACT('{"a": 1}', '$.b[ 1 ].')` , nil , false )
228+
229+ yield (`JSON_EXTRACT(NULL, 'invalid-path')` , nil , false )
230+ yield (`JSON_EXTRACT('{"a": 1}', NULL, 'invalid-path')` , nil , false )
231+ yield (`JSON_EXTRACT('{"a": 1}', 'invalid-path', NULL)` , nil , false )
232+ yield (`JSON_EXTRACT('{"a": 1}', '$.a', 'invalid')` , nil , false )
233+ }
234+
235+ func FnJSONContainsPath (yield Query ) {
236+ for _ , obj := range inputJSONObjects {
237+ for _ , path1 := range inputJSONPaths {
185238 yield (fmt .Sprintf ("JSON_CONTAINS_PATH('%s', 'one', '%s')" , obj , path1 ), nil , false )
186239 yield (fmt .Sprintf ("JSON_CONTAINS_PATH('%s', 'all', '%s')" , obj , path1 ), nil , false )
187- yield (fmt .Sprintf ("JSON_KEYS('%s', '%s')" , obj , path1 ), nil , false )
188240
189241 for _ , path2 := range inputJSONPaths {
190- yield (fmt .Sprintf ("JSON_EXTRACT('%s', '%s', '%s')" , obj , path1 , path2 ), nil , false )
191242 yield (fmt .Sprintf ("JSON_CONTAINS_PATH('%s', 'one', '%s', '%s')" , obj , path1 , path2 ), nil , false )
192243 yield (fmt .Sprintf ("JSON_CONTAINS_PATH('%s', 'all', '%s', '%s')" , obj , path1 , path2 ), nil , false )
193244 }
0 commit comments