diff --git a/testdata/diff/create_view/add_view/diff.sql b/testdata/diff/create_view/add_view/diff.sql index dfa849c6..1e96a59b 100644 --- a/testdata/diff/create_view/add_view/diff.sql +++ b/testdata/diff/create_view/add_view/diff.sql @@ -7,6 +7,39 @@ 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 cte_with_case_view AS + WITH monthly_stats AS ( + SELECT date_trunc('month'::text, CURRENT_DATE - ((n.n || ' months'::text)::interval)) AS month_start, + n.n AS month_offset + FROM generate_series(0, 11) n(n) + ), employee_summary AS ( + SELECT employees.department_id, + count(*) AS employee_count, + avg(employees.priority) AS avg_priority + FROM employees + WHERE employees.status::text = 'active'::text + GROUP BY employees.department_id + ) + SELECT ms.month_start, + ms.month_offset, + d.name AS department_name, + COALESCE(es.employee_count, 0::bigint) AS employee_count, + CASE + WHEN es.avg_priority > 50::numeric THEN 'high'::text + WHEN es.avg_priority > 25::numeric THEN 'medium'::text + WHEN es.avg_priority IS NOT NULL THEN 'low'::text + ELSE 'no_data'::text + END AS priority_level, + CASE + WHEN ms.month_offset = 0 THEN 'current'::text + WHEN ms.month_offset <= 3 THEN 'recent'::text + ELSE 'historical'::text + END AS period_type + FROM monthly_stats ms + CROSS JOIN departments d + LEFT JOIN employee_summary es ON d.id = es.department_id + ORDER BY ms.month_start DESC, d.name; + CREATE OR REPLACE VIEW nullif_functions_view AS SELECT e.id, e.name AS employee_name, diff --git a/testdata/diff/create_view/add_view/new.sql b/testdata/diff/create_view/add_view/new.sql index 2e7d7746..79f1ef9d 100644 --- a/testdata/diff/create_view/add_view/new.sql +++ b/testdata/diff/create_view/add_view/new.sql @@ -61,4 +61,44 @@ SELECT END AS assignment_status FROM employees e JOIN departments d USING (id) -WHERE e.priority > 0; \ No newline at end of file +WHERE e.priority > 0; + +-- View testing CTEs with CASE statements (regression test for issue #106) +CREATE VIEW public.cte_with_case_view AS +WITH monthly_stats AS ( + SELECT + date_trunc('month', CURRENT_DATE - (n || ' months')::INTERVAL) AS month_start, + n AS month_offset + FROM generate_series(0, 11) AS n +), +employee_summary AS ( + SELECT + department_id, + COUNT(*) AS employee_count, + AVG(priority) AS avg_priority + FROM employees + WHERE status = 'active' + GROUP BY department_id +) +SELECT + ms.month_start, + ms.month_offset, + d.name AS department_name, + COALESCE(es.employee_count, 0) AS employee_count, + -- CASE statement using CTE data (triggers the bug from #106) + CASE + WHEN es.avg_priority > 50 THEN 'high' + WHEN es.avg_priority > 25 THEN 'medium' + WHEN es.avg_priority IS NOT NULL THEN 'low' + ELSE 'no_data' + END AS priority_level, + -- Another CASE with CTE + CASE + WHEN ms.month_offset = 0 THEN 'current' + WHEN ms.month_offset <= 3 THEN 'recent' + ELSE 'historical' + END AS period_type +FROM monthly_stats ms +CROSS JOIN departments d +LEFT JOIN employee_summary es ON d.id = es.department_id +ORDER BY ms.month_start DESC, d.name; diff --git a/testdata/diff/create_view/add_view/plan.json b/testdata/diff/create_view/add_view/plan.json index 0c1d8f98..af248387 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 cte_with_case_view AS\n WITH monthly_stats AS (\n SELECT date_trunc('month'::text, CURRENT_DATE - ((n.n || ' months'::text)::interval)) AS month_start,\n n.n AS month_offset\n FROM generate_series(0, 11) n(n)\n ), employee_summary AS (\n SELECT employees.department_id,\n count(*) AS employee_count,\n avg(employees.priority) AS avg_priority\n FROM employees\n WHERE employees.status::text = 'active'::text\n GROUP BY employees.department_id\n )\n SELECT ms.month_start,\n ms.month_offset,\n d.name AS department_name,\n COALESCE(es.employee_count, 0::bigint) AS employee_count,\n CASE\n WHEN es.avg_priority > 50::numeric THEN 'high'::text\n WHEN es.avg_priority > 25::numeric THEN 'medium'::text\n WHEN es.avg_priority IS NOT NULL THEN 'low'::text\n ELSE 'no_data'::text\n END AS priority_level,\n CASE\n WHEN ms.month_offset = 0 THEN 'current'::text\n WHEN ms.month_offset <= 3 THEN 'recent'::text\n ELSE 'historical'::text\n END AS period_type\n FROM monthly_stats ms\n CROSS JOIN departments d\n LEFT JOIN employee_summary es ON d.id = es.department_id\n ORDER BY ms.month_start DESC, d.name;", + "type": "view", + "operation": "create", + "path": "public.cte_with_case_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", diff --git a/testdata/diff/create_view/add_view/plan.sql b/testdata/diff/create_view/add_view/plan.sql index dfa849c6..1e96a59b 100644 --- a/testdata/diff/create_view/add_view/plan.sql +++ b/testdata/diff/create_view/add_view/plan.sql @@ -7,6 +7,39 @@ 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 cte_with_case_view AS + WITH monthly_stats AS ( + SELECT date_trunc('month'::text, CURRENT_DATE - ((n.n || ' months'::text)::interval)) AS month_start, + n.n AS month_offset + FROM generate_series(0, 11) n(n) + ), employee_summary AS ( + SELECT employees.department_id, + count(*) AS employee_count, + avg(employees.priority) AS avg_priority + FROM employees + WHERE employees.status::text = 'active'::text + GROUP BY employees.department_id + ) + SELECT ms.month_start, + ms.month_offset, + d.name AS department_name, + COALESCE(es.employee_count, 0::bigint) AS employee_count, + CASE + WHEN es.avg_priority > 50::numeric THEN 'high'::text + WHEN es.avg_priority > 25::numeric THEN 'medium'::text + WHEN es.avg_priority IS NOT NULL THEN 'low'::text + ELSE 'no_data'::text + END AS priority_level, + CASE + WHEN ms.month_offset = 0 THEN 'current'::text + WHEN ms.month_offset <= 3 THEN 'recent'::text + ELSE 'historical'::text + END AS period_type + FROM monthly_stats ms + CROSS JOIN departments d + LEFT JOIN employee_summary es ON d.id = es.department_id + ORDER BY ms.month_start DESC, d.name; + CREATE OR REPLACE VIEW nullif_functions_view AS SELECT e.id, e.name AS employee_name, diff --git a/testdata/diff/create_view/add_view/plan.txt b/testdata/diff/create_view/add_view/plan.txt index 72518bbd..4e1b6171 100644 --- a/testdata/diff/create_view/add_view/plan.txt +++ b/testdata/diff/create_view/add_view/plan.txt @@ -1,10 +1,11 @@ -Plan: 3 to add. +Plan: 4 to add. Summary by type: - views: 3 to add + views: 4 to add Views: + array_operators_view + + cte_with_case_view + nullif_functions_view + text_search_view @@ -20,6 +21,39 @@ 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 cte_with_case_view AS + WITH monthly_stats AS ( + SELECT date_trunc('month'::text, CURRENT_DATE - ((n.n || ' months'::text)::interval)) AS month_start, + n.n AS month_offset + FROM generate_series(0, 11) n(n) + ), employee_summary AS ( + SELECT employees.department_id, + count(*) AS employee_count, + avg(employees.priority) AS avg_priority + FROM employees + WHERE employees.status::text = 'active'::text + GROUP BY employees.department_id + ) + SELECT ms.month_start, + ms.month_offset, + d.name AS department_name, + COALESCE(es.employee_count, 0::bigint) AS employee_count, + CASE + WHEN es.avg_priority > 50::numeric THEN 'high'::text + WHEN es.avg_priority > 25::numeric THEN 'medium'::text + WHEN es.avg_priority IS NOT NULL THEN 'low'::text + ELSE 'no_data'::text + END AS priority_level, + CASE + WHEN ms.month_offset = 0 THEN 'current'::text + WHEN ms.month_offset <= 3 THEN 'recent'::text + ELSE 'historical'::text + END AS period_type + FROM monthly_stats ms + CROSS JOIN departments d + LEFT JOIN employee_summary es ON d.id = es.department_id + ORDER BY ms.month_start DESC, d.name; + CREATE OR REPLACE VIEW nullif_functions_view AS SELECT e.id, e.name AS employee_name,