On Thu, Aug 3, 2023 at 6:04 PM Matthias van de Meent <boekewurm+postg...@gmail.com> wrote: > > > Is it? Detoasting only happens if the argument was toasted, and I have > serious doubts that the result of (a->'a') will be toasted in our > current system. Sure, we do need to allocate an intermediate result, > but that's in a temporary memory context that should be trivially > cheap to free. > > > /* > > * v.val.numeric points into jsonb body, so we need to make a copy to > > * return > > */ > > retValue = DatumGetNumericCopy(NumericGetDatum(v.val.numeric)); > > > > At last this method needs 1 extra FuncExpr than my method, this would > > cost some expression execution effort. I'm not saying we need to avoid > > expression execution generally, but extracting numeric fields from jsonb > > looks a reasonable case. > > What's tb here? > > > Kind regards, > > Matthias van de Meent > Neon (https://neon.tech) > >
can confirm the patch's jsonb_object_field_numeric is faster than pg_catalog."numeric"(jsonb). also it works accurately either jsonb is in the page or in toast schema chunks. I don't understand why we need to allocate an intermediate result part. since you cannot directly update a jsonb value field. This function is not easy to find out... select numeric('{"a":11}'->'a'); --fail. select jsonb_numeric(jsonb'{"a":11}'->'a'); --fail select "numeric"('{"a":11}'::jsonb->'a'); --ok