perf: use LATERAL instead of CTE for json body
* add pgbench test for INSERT and RPC * use LATERAL for RPC and INSERT * add tests for inlining
This commit is contained in:
committed by
Steve Chavez
parent
253f2bf537
commit
0d5d209bfb
@@ -0,0 +1,20 @@
|
||||
WITH pgrst_source AS (
|
||||
SELECT pgrst_call.*
|
||||
FROM (
|
||||
SELECT '{"id": 4}'::json as json_data
|
||||
) pgrst_payload,
|
||||
LATERAL (
|
||||
SELECT CASE WHEN json_typeof(pgrst_payload.json_data) = 'array' THEN pgrst_payload.json_data ELSE json_build_array(pgrst_payload.json_data) END AS val
|
||||
) pgrst_uniform_json,
|
||||
LATERAL (
|
||||
SELECT * FROM json_to_recordset(pgrst_uniform_json.val) AS _("id" integer) LIMIT 1
|
||||
) pgrst_body,
|
||||
LATERAL "test"."get_projects_below"("id" := pgrst_body.id) pgrst_call
|
||||
)
|
||||
SELECT
|
||||
null::bigint AS total_result_set,
|
||||
pg_catalog.count(_postgrest_t) AS page_total,
|
||||
coalesce(json_agg(_postgrest_t), '[]')::character varying AS body,
|
||||
nullif(current_setting('response.headers', true), '') AS response_headers,
|
||||
nullif(current_setting('response.status', true), '') AS response_status
|
||||
FROM (SELECT "projects".* FROM "pgrst_source" AS "projects") _postgrest_t;
|
||||
@@ -0,0 +1,15 @@
|
||||
WITH pgrst_source AS (
|
||||
WITH
|
||||
pgrst_payload AS (SELECT '{"id": 4}'::json AS json_data),
|
||||
pgrst_body AS ( SELECT CASE WHEN json_typeof(json_data) = 'array' THEN json_data ELSE json_build_array(json_data) END AS val FROM pgrst_payload),
|
||||
pgrst_args AS ( SELECT * FROM json_to_recordset((SELECT val FROM pgrst_body)) AS _("id" integer) )
|
||||
SELECT "get_projects_below".*
|
||||
FROM "test"."get_projects_below"("id" := (SELECT "id" FROM pgrst_args LIMIT 1))
|
||||
)
|
||||
SELECT
|
||||
null::bigint AS total_result_set,
|
||||
pg_catalog.count(_postgrest_t) AS page_total,
|
||||
coalesce(json_agg(_postgrest_t), '[]')::character varying AS body,
|
||||
nullif(current_setting('response.headers', true), '') AS response_headers,
|
||||
nullif(current_setting('response.status', true), '') AS response_status
|
||||
FROM (SELECT "projects".* FROM "pgrst_source" AS "projects") _postgrest_t;
|
||||
@@ -0,0 +1,12 @@
|
||||
INSERT INTO "test"."complex_items"("arr_data", "field-with_sep", "id", "name")
|
||||
SELECT pgrst_body."arr_data", pgrst_body."field-with_sep", pgrst_body."id", pgrst_body."name"
|
||||
FROM (
|
||||
SELECT '[{"id": 4, "name": "Vier"}, {"id": 5, "name": "Funf", "arr_data": null}, {"id": 6, "name": "Sechs", "arr_data": [1, 2, 3], "field-with_sep": 6}]'::json as json_data
|
||||
) pgrst_payload,
|
||||
LATERAL (
|
||||
SELECT CASE WHEN json_typeof(pgrst_payload.json_data) = 'array' THEN pgrst_payload.json_data ELSE json_build_array(pgrst_payload.json_data) END AS val
|
||||
) pgrst_uniform_json,
|
||||
LATERAL (
|
||||
SELECT * FROM json_to_recordset (pgrst_uniform_json.val) AS _ ("arr_data" integer[], "field-with_sep" integer, "id" bigint, "name" text)
|
||||
) pgrst_body
|
||||
RETURNING "test"."complex_items".*
|
||||
@@ -0,0 +1,7 @@
|
||||
WITH
|
||||
pgrst_payload AS (SELECT '[{"id": 4, "name": "Vier"}, {"id": 5, "name": "Funf", "arr_data": null}, {"id": 6, "name": "Sechs", "arr_data": [1, 2, 3], "field-with_sep": 6}]'::json AS json_data),
|
||||
pgrst_body AS ( SELECT CASE WHEN json_typeof(json_data) = 'array' THEN json_data ELSE json_build_array(json_data) END AS val FROM pgrst_payload)
|
||||
INSERT INTO "test"."complex_items"("arr_data", "field-with_sep", "id", "name")
|
||||
SELECT "arr_data", "field-with_sep", "id", "name"
|
||||
FROM json_to_recordset ((SELECT val FROM pgrst_body)) AS _ ("arr_data" integer[], "field-with_sep" integer, "id" bigint, "name" text)
|
||||
RETURNING "test"."complex_items".*
|
||||
@@ -0,0 +1,8 @@
|
||||
## pgbench tests
|
||||
|
||||
Can be used as:
|
||||
|
||||
```
|
||||
postgrest-with-postgresql-15 -f test/pgbench/fixtures.sql pgbench -n -T 10 -f test/pgbench/2677/old.sql
|
||||
postgrest-with-postgresql-15 -f test/pgbench/fixtures.sql pgbench -n -T 10 -f test/pgbench/2677/new.sql
|
||||
```
|
||||
@@ -0,0 +1,7 @@
|
||||
\ir ../spec/fixtures/load.sql
|
||||
|
||||
ALTER TABLE test.complex_items
|
||||
DROP CONSTRAINT complex_items_pkey;
|
||||
|
||||
ALTER TABLE test.complex_items
|
||||
ALTER COLUMN "field-with_sep" DROP NOT NULL;
|
||||
Reference in New Issue
Block a user