Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions testdata/diff/create_view/add_view/diff.sql
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
42 changes: 41 additions & 1 deletion testdata/diff/create_view/add_view/new.sql
Original file line number Diff line number Diff line change
Expand Up @@ -61,4 +61,44 @@ SELECT
END AS assignment_status
FROM employees e
JOIN departments d USING (id)
WHERE e.priority > 0;
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;
6 changes: 6 additions & 0 deletions testdata/diff/create_view/add_view/plan.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
33 changes: 33 additions & 0 deletions testdata/diff/create_view/add_view/plan.sql
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
38 changes: 36 additions & 2 deletions testdata/diff/create_view/add_view/plan.txt
Original file line number Diff line number Diff line change
@@ -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

Expand All @@ -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,
Expand Down