From 8fa85754c0fb12570c2d734ddd5e626cc1c16abe Mon Sep 17 00:00:00 2001 From: tianzhou Date: Thu, 23 Oct 2025 10:24:42 +0800 Subject: [PATCH] chore: add NULLIF test case --- testdata/diff/create_view/add_view/diff.sql | 18 ++++++++++++++ testdata/diff/create_view/add_view/new.sql | 26 +++++++++++++++++++- testdata/diff/create_view/add_view/plan.json | 6 +++++ testdata/diff/create_view/add_view/plan.sql | 18 ++++++++++++++ testdata/diff/create_view/add_view/plan.txt | 23 +++++++++++++++-- 5 files changed, 88 insertions(+), 3 deletions(-) diff --git a/testdata/diff/create_view/add_view/diff.sql b/testdata/diff/create_view/add_view/diff.sql index c570e7fc..dfa849c6 100644 --- a/testdata/diff/create_view/add_view/diff.sql +++ b/testdata/diff/create_view/add_view/diff.sql @@ -7,6 +7,24 @@ CREATE OR REPLACE VIEW array_operators_view AS CASE WHEN priority <> ANY (ARRAY[1, 2, 3]) THEN 'different' ELSE 'same' END AS not_equal_any_test FROM employees; +CREATE OR REPLACE VIEW nullif_functions_view AS + SELECT e.id, + e.name AS employee_name, + d.name AS department_name, + (e.priority - d.manager_id) / NULLIF(d.manager_id, 0) AS priority_ratio, + NULLIF(e.status::text, 'inactive'::text) AS active_status, + NULLIF(e.email::text, ''::text) AS valid_email, + GREATEST(e.priority, 0) AS min_priority, + LEAST(e.priority, 100) AS max_priority, + GREATEST(e.id, d.id, e.department_id) AS max_id, + CASE + WHEN NULLIF(e.department_id, 0) IS NOT NULL THEN 'assigned'::text + ELSE 'unassigned'::text + END AS assignment_status + FROM employees e + JOIN departments d USING (id) + WHERE e.priority > 0; + CREATE OR REPLACE VIEW text_search_view AS SELECT id, COALESCE((first_name::text || ' '::text) || last_name::text, 'Anonymous'::text) AS display_name, diff --git a/testdata/diff/create_view/add_view/new.sql b/testdata/diff/create_view/add_view/new.sql index a9e99143..2e7d7746 100644 --- a/testdata/diff/create_view/add_view/new.sql +++ b/testdata/diff/create_view/add_view/new.sql @@ -37,4 +37,28 @@ SELECT COALESCE(bio, 'No description available') AS description, to_tsvector('english', COALESCE(first_name, '') || ' ' || COALESCE(last_name, '') || ' ' || COALESCE(bio, '')) AS search_vector FROM employees -WHERE status = 'active'; \ No newline at end of file +WHERE status = 'active'; + +-- View testing NULLIF, GREATEST, LEAST, and joins (regression test for issue #103) +CREATE VIEW public.nullif_functions_view AS +SELECT + e.id, + e.name AS employee_name, + d.name AS department_name, + -- NULLIF to avoid divide-by-zero (main issue from #103) + (e.priority - d.manager_id) / NULLIF(d.manager_id, 0) AS priority_ratio, + -- Multiple NULLIF expressions + NULLIF(e.status, 'inactive') AS active_status, + NULLIF(e.email, '') AS valid_email, + -- GREATEST and LEAST functions + GREATEST(e.priority, 0) AS min_priority, + LEAST(e.priority, 100) AS max_priority, + GREATEST(e.id, d.id, e.department_id) AS max_id, + -- Complex CASE with NULLIF + CASE + WHEN NULLIF(e.department_id, 0) IS NOT NULL THEN 'assigned' + ELSE 'unassigned' + END AS assignment_status +FROM employees e +JOIN departments d USING (id) +WHERE e.priority > 0; \ No newline at end of file diff --git a/testdata/diff/create_view/add_view/plan.json b/testdata/diff/create_view/add_view/plan.json index b0cce441..0c1d8f98 100644 --- a/testdata/diff/create_view/add_view/plan.json +++ b/testdata/diff/create_view/add_view/plan.json @@ -14,6 +14,12 @@ "operation": "create", "path": "public.array_operators_view" }, + { + "sql": "CREATE OR REPLACE VIEW nullif_functions_view AS\n SELECT e.id,\n e.name AS employee_name,\n d.name AS department_name,\n (e.priority - d.manager_id) / NULLIF(d.manager_id, 0) AS priority_ratio,\n NULLIF(e.status::text, 'inactive'::text) AS active_status,\n NULLIF(e.email::text, ''::text) AS valid_email,\n GREATEST(e.priority, 0) AS min_priority,\n LEAST(e.priority, 100) AS max_priority,\n GREATEST(e.id, d.id, e.department_id) AS max_id,\n CASE\n WHEN NULLIF(e.department_id, 0) IS NOT NULL THEN 'assigned'::text\n ELSE 'unassigned'::text\n END AS assignment_status\n FROM employees e\n JOIN departments d USING (id)\n WHERE e.priority > 0;", + "type": "view", + "operation": "create", + "path": "public.nullif_functions_view" + }, { "sql": "CREATE OR REPLACE VIEW text_search_view AS\n SELECT id,\n COALESCE((first_name::text || ' '::text) || last_name::text, 'Anonymous'::text) AS display_name,\n COALESCE(email, ''::character varying) AS email,\n COALESCE(bio, 'No description available'::text) AS description,\n to_tsvector('english'::regconfig, (((COALESCE(first_name, ''::character varying)::text || ' '::text) || COALESCE(last_name, ''::character varying)::text) || ' '::text) || COALESCE(bio, ''::text)) AS search_vector\n FROM employees\n WHERE status::text = 'active'::text;", "type": "view", diff --git a/testdata/diff/create_view/add_view/plan.sql b/testdata/diff/create_view/add_view/plan.sql index c570e7fc..dfa849c6 100644 --- a/testdata/diff/create_view/add_view/plan.sql +++ b/testdata/diff/create_view/add_view/plan.sql @@ -7,6 +7,24 @@ CREATE OR REPLACE VIEW array_operators_view AS CASE WHEN priority <> ANY (ARRAY[1, 2, 3]) THEN 'different' ELSE 'same' END AS not_equal_any_test FROM employees; +CREATE OR REPLACE VIEW nullif_functions_view AS + SELECT e.id, + e.name AS employee_name, + d.name AS department_name, + (e.priority - d.manager_id) / NULLIF(d.manager_id, 0) AS priority_ratio, + NULLIF(e.status::text, 'inactive'::text) AS active_status, + NULLIF(e.email::text, ''::text) AS valid_email, + GREATEST(e.priority, 0) AS min_priority, + LEAST(e.priority, 100) AS max_priority, + GREATEST(e.id, d.id, e.department_id) AS max_id, + CASE + WHEN NULLIF(e.department_id, 0) IS NOT NULL THEN 'assigned'::text + ELSE 'unassigned'::text + END AS assignment_status + FROM employees e + JOIN departments d USING (id) + WHERE e.priority > 0; + CREATE OR REPLACE VIEW text_search_view AS SELECT id, COALESCE((first_name::text || ' '::text) || last_name::text, 'Anonymous'::text) AS display_name, diff --git a/testdata/diff/create_view/add_view/plan.txt b/testdata/diff/create_view/add_view/plan.txt index e72181ac..72518bbd 100644 --- a/testdata/diff/create_view/add_view/plan.txt +++ b/testdata/diff/create_view/add_view/plan.txt @@ -1,10 +1,11 @@ -Plan: 2 to add. +Plan: 3 to add. Summary by type: - views: 2 to add + views: 3 to add Views: + array_operators_view + + nullif_functions_view + text_search_view DDL to be executed: @@ -19,6 +20,24 @@ CREATE OR REPLACE VIEW array_operators_view AS CASE WHEN priority <> ANY (ARRAY[1, 2, 3]) THEN 'different' ELSE 'same' END AS not_equal_any_test FROM employees; +CREATE OR REPLACE VIEW nullif_functions_view AS + SELECT e.id, + e.name AS employee_name, + d.name AS department_name, + (e.priority - d.manager_id) / NULLIF(d.manager_id, 0) AS priority_ratio, + NULLIF(e.status::text, 'inactive'::text) AS active_status, + NULLIF(e.email::text, ''::text) AS valid_email, + GREATEST(e.priority, 0) AS min_priority, + LEAST(e.priority, 100) AS max_priority, + GREATEST(e.id, d.id, e.department_id) AS max_id, + CASE + WHEN NULLIF(e.department_id, 0) IS NOT NULL THEN 'assigned'::text + ELSE 'unassigned'::text + END AS assignment_status + FROM employees e + JOIN departments d USING (id) + WHERE e.priority > 0; + CREATE OR REPLACE VIEW text_search_view AS SELECT id, COALESCE((first_name::text || ' '::text) || last_name::text, 'Anonymous'::text) AS display_name,