X-Git-Url: https://git.8kb.co.uk/?a=blobdiff_plain;f=jsonb_opx.c;h=a27de35ee977ff133d709ad7950f9e524de51d67;hb=d7958daa16351c072af5fbd5d8522f10292e1aa3;hp=4442cb42df6895fcfc22ff3d81345eb21f9ce8c0;hpb=549cfa88e742fc495596c6ef165e270c677578f4;p=postgresql%2Fpg_jsonb_opx diff --git a/jsonb_opx.c b/jsonb_opx.c index 4442cb4..a27de35 100755 --- a/jsonb_opx.c +++ b/jsonb_opx.c @@ -37,11 +37,11 @@ Datum jsonb_delete_text(PG_FUNCTION_ARGS) { /* general loops */ - int i; + int i; /* pointers to incoming jsonb and text[] data */ Jsonb *input_jsonb = PG_GETARG_JSONB(0); - ArrayType *input_array = PG_GETARG_ARRAYTYPE_P(1); + ArrayType *input_array = PG_GETARG_ARRAYTYPE_P(1); /* pointers to return jsonb_value data and state to be converted to jsonb on return */ JsonbParseState *state = NULL; @@ -87,6 +87,10 @@ jsonb_delete_text(PG_FUNCTION_ARGS) deconstruct_array(input_array, TEXTOID, -1, false, 'i', &datums, &nulls, &count); + /* if the array is empty there's no work to do so return the input value */ + if (count == 0) + PG_RETURN_JSONB(input_jsonb); + /* first check to make sure at least one key exists - this is potentially just extra unwanted work */ for (i=0; iroot); while ((jsonb_iterator_token = JsonbIteratorNext(&jsonb_iterator, &jsonb_iterator_value, skip_nested)) != WJB_DONE) { @@ -362,6 +379,15 @@ jsonb_concat_jsonb(PG_FUNCTION_ARGS) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("cannot call on a non-object"))); + + /* + * check if either supplied jsonb is empty and return the other if so + * this idea was copied from https://github.com/erthalion/jsonbx/blob/master/jsonbx.c + */ + if (JB_ROOT_COUNT(input_jsonb_a) == 0) + PG_RETURN_JSONB(input_jsonb_b); + else if (JB_ROOT_COUNT(input_jsonb_b) == 0) + PG_RETURN_JSONB(input_jsonb_a); /* * The following is essentially a cut 'n shut job; discarding the closing root