From b79fedcce28018d23859ed568e19b885e29fb750 Mon Sep 17 00:00:00 2001 From: tianzhou Date: Wed, 22 Oct 2025 18:52:24 +0800 Subject: [PATCH] chore: merge test case --- internal/diff/diff_test.go | 3 +- internal/diff/view.go | 1 + ir/formatter.go | 9 ++++- ir/normalize.go | 18 +++------ testdata/diff/create_table/add_check/diff.sql | 2 +- testdata/diff/create_view/add_view/diff.sql | 25 +++++++++---- testdata/diff/create_view/add_view/new.sql | 37 ++++++++++++++----- testdata/diff/create_view/add_view/old.sql | 8 +++- testdata/diff/create_view/add_view/plan.json | 12 ++++-- testdata/diff/create_view/add_view/plan.sql | 25 +++++++++---- testdata/diff/create_view/add_view/plan.txt | 32 ++++++++++------ .../add_view_array_operators/diff.sql | 9 ----- .../add_view_array_operators/new.sql | 21 ----------- .../add_view_array_operators/old.sql | 5 --- .../add_view_array_operators/plan.json | 20 ---------- .../add_view_array_operators/plan.sql | 9 ----- .../add_view_array_operators/plan.txt | 20 ---------- .../create_view/add_view_coalesce/diff.sql | 8 ---- .../create_view/add_view_coalesce/new.sql | 18 --------- .../create_view/add_view_coalesce/old.sql | 8 ---- .../create_view/add_view_coalesce/plan.json | 20 ---------- .../create_view/add_view_coalesce/plan.sql | 8 ---- .../create_view/add_view_coalesce/plan.txt | 19 ---------- testdata/diff/create_view/alter_view/diff.sql | 9 ++--- .../diff/create_view/alter_view/plan.json | 4 +- testdata/diff/create_view/alter_view/plan.sql | 9 ++--- testdata/diff/create_view/alter_view/plan.txt | 9 ++--- .../issue_82_view_logic_expr/pgschema.sql | 3 +- testdata/dump/sakila/pgschema.sql | 10 ++--- 29 files changed, 135 insertions(+), 246 deletions(-) delete mode 100644 testdata/diff/create_view/add_view_array_operators/diff.sql delete mode 100644 testdata/diff/create_view/add_view_array_operators/new.sql delete mode 100644 testdata/diff/create_view/add_view_array_operators/old.sql delete mode 100644 testdata/diff/create_view/add_view_array_operators/plan.json delete mode 100644 testdata/diff/create_view/add_view_array_operators/plan.sql delete mode 100644 testdata/diff/create_view/add_view_array_operators/plan.txt delete mode 100644 testdata/diff/create_view/add_view_coalesce/diff.sql delete mode 100644 testdata/diff/create_view/add_view_coalesce/new.sql delete mode 100644 testdata/diff/create_view/add_view_coalesce/old.sql delete mode 100644 testdata/diff/create_view/add_view_coalesce/plan.json delete mode 100644 testdata/diff/create_view/add_view_coalesce/plan.sql delete mode 100644 testdata/diff/create_view/add_view_coalesce/plan.txt diff --git a/internal/diff/diff_test.go b/internal/diff/diff_test.go index bec49254..4f6aedf5 100644 --- a/internal/diff/diff_test.go +++ b/internal/diff/diff_test.go @@ -213,7 +213,8 @@ func normalizeSQL(sql string) string { var normalizedLines []string for _, line := range lines { - trimmed := strings.TrimSpace(line) + // Preserve leading whitespace (indentation) but trim trailing whitespace + trimmed := strings.TrimRight(line, " \t") if trimmed != "" { normalizedLines = append(normalizedLines, trimmed) } diff --git a/internal/diff/view.go b/internal/diff/view.go index 96966213..05d457b4 100644 --- a/internal/diff/view.go +++ b/internal/diff/view.go @@ -301,6 +301,7 @@ func generateViewSQL(view *ir.View, targetSchema string) string { createClause = "CREATE OR REPLACE VIEW" } + // Use the view definition as-is - it has already been normalized return fmt.Sprintf("%s %s AS\n%s;", createClause, viewName, view.Definition) } diff --git a/ir/formatter.go b/ir/formatter.go index 88ef4461..88084aea 100644 --- a/ir/formatter.go +++ b/ir/formatter.go @@ -85,9 +85,9 @@ func (f *postgreSQLFormatter) formatSelectStmt(stmt *pg_query.SelectStmt) { func (f *postgreSQLFormatter) formatTargetList(targets []*pg_query.Node) { for i, target := range targets { if i == 0 { - f.buffer.WriteString("\n ") // First column indentation + f.buffer.WriteString(" ") // First column on same line as SELECT } else { - f.buffer.WriteString(",\n ") // Subsequent columns + f.buffer.WriteString(",\n ") // Subsequent columns indented } if resTarget := target.GetResTarget(); resTarget != nil { @@ -424,6 +424,11 @@ func (f *postgreSQLFormatter) formatFuncCall(funcCall *pg_query.FuncCall) { // Format arguments f.buffer.WriteString("(") + // Handle DISTINCT for aggregate functions + if funcCall.AggDistinct { + f.buffer.WriteString("DISTINCT ") + } + // Handle aggregate functions with star (like COUNT(*)) if funcCall.AggStar { f.buffer.WriteString("*") diff --git a/ir/normalize.go b/ir/normalize.go index fa1ffac2..b54e2255 100644 --- a/ir/normalize.go +++ b/ir/normalize.go @@ -1066,7 +1066,6 @@ func normalizeViewWithAST(definition string, viewSchema string) string { } // Step 1: Normalize ORDER BY clauses (modify AST if needed) - orderByModified := false if len(selectStmt.SortClause) > 0 { // Build reverse alias map (expression -> alias) from target list exprToAliasMap := buildExpressionToAliasMap(selectStmt.TargetList) @@ -1074,21 +1073,16 @@ func normalizeViewWithAST(definition string, viewSchema string) string { // Transform ORDER BY clauses: replace complex expressions with aliases when possible for _, sortItem := range selectStmt.SortClause { if sortBy := sortItem.GetSortBy(); sortBy != nil { - if wasModified := normalizeOrderByExpressionToAlias(sortBy, exprToAliasMap); wasModified { - orderByModified = true - } + normalizeOrderByExpressionToAlias(sortBy, exprToAliasMap) } } } - // Step 2: Check if we need to use custom formatter - // Use custom formatter if: - // a) The view definition contains "= ANY" (needs conversion to IN) - // b) ORDER BY was modified - needsCustomFormatter := strings.Contains(definition, "= ANY") || orderByModified - - if needsCustomFormatter { - // Use custom formatter to format the entire query + // Step 2: Check if we need to use custom formatter for normalization + // Use custom formatter only if the view definition contains "= ANY" (needs conversion to IN) + // For other cases, preserve the original definition to avoid breaking complex expressions + if strings.Contains(definition, "= ANY") { + // Use custom formatter to normalize the query // The formatter will handle: // - Converting "= ANY (ARRAY[...])" to "IN (...)" // - Proper formatting of all expressions diff --git a/testdata/diff/create_table/add_check/diff.sql b/testdata/diff/create_table/add_check/diff.sql index 2b331ac2..79766077 100644 --- a/testdata/diff/create_table/add_check/diff.sql +++ b/testdata/diff/create_table/add_check/diff.sql @@ -1,2 +1,2 @@ ALTER TABLE code - ADD CONSTRAINT code_check CHECK (code > 0 AND code < 255); +ADD CONSTRAINT code_check CHECK (code > 0 AND code < 255); diff --git a/testdata/diff/create_view/add_view/diff.sql b/testdata/diff/create_view/add_view/diff.sql index 416c6f8b..c570e7fc 100644 --- a/testdata/diff/create_view/add_view/diff.sql +++ b/testdata/diff/create_view/add_view/diff.sql @@ -1,8 +1,17 @@ -CREATE OR REPLACE VIEW employee_department_view AS - SELECT e.id, - e.name AS employee_name, - d.name AS department_name, - d.manager_id - FROM employees e - JOIN departments d ON e.department_id = d.id - WHERE e.name IS NOT NULL AND d.manager_id IS NOT NULL; +CREATE OR REPLACE VIEW array_operators_view AS + SELECT id, + priority, + CASE WHEN priority IN (10, 20, 30) THEN 'matched' ELSE 'not_matched' END AS equal_any_test, + CASE WHEN priority > ANY (ARRAY[10, 20, 30]) THEN 'high' ELSE 'low' END AS greater_any_test, + CASE WHEN priority < ANY (ARRAY[5, 15, 25]) THEN 'found_lower' ELSE 'all_higher' END AS less_any_test, + CASE WHEN priority <> ANY (ARRAY[1, 2, 3]) THEN 'different' ELSE 'same' END AS not_equal_any_test + FROM employees; + +CREATE OR REPLACE VIEW text_search_view AS + SELECT id, + COALESCE((first_name::text || ' '::text) || last_name::text, 'Anonymous'::text) AS display_name, + COALESCE(email, ''::character varying) AS email, + COALESCE(bio, 'No description available'::text) AS description, + to_tsvector('english'::regconfig, (((COALESCE(first_name, ''::character varying)::text || ' '::text) || COALESCE(last_name, ''::character varying)::text) || ' '::text) || COALESCE(bio, ''::text)) AS search_vector + FROM employees + WHERE status::text = 'active'::text; diff --git a/testdata/diff/create_view/add_view/new.sql b/testdata/diff/create_view/add_view/new.sql index 1db56cb8..a9e99143 100644 --- a/testdata/diff/create_view/add_view/new.sql +++ b/testdata/diff/create_view/add_view/new.sql @@ -1,7 +1,13 @@ CREATE TABLE public.employees ( id SERIAL PRIMARY KEY, name VARCHAR(100), - department_id INTEGER + first_name VARCHAR(50), + last_name VARCHAR(50), + email VARCHAR(100), + bio TEXT, + status VARCHAR(20) NOT NULL, + department_id INTEGER, + priority INTEGER ); CREATE TABLE public.departments ( @@ -10,12 +16,25 @@ CREATE TABLE public.departments ( manager_id INTEGER ); -CREATE VIEW public.employee_department_view AS +-- View testing array operators: all ANY/ALL operators are preserved +CREATE VIEW public.array_operators_view AS SELECT - e.id, - e.name AS employee_name, - d.name AS department_name, - d.manager_id -FROM employees e -JOIN departments d ON e.department_id = d.id -WHERE e.name IS NOT NULL AND d.manager_id IS NOT NULL; \ No newline at end of file + id, + priority, + -- All ANY operations preserve the ANY syntax + CASE WHEN priority = ANY(ARRAY[10, 20, 30]) THEN 'matched' ELSE 'not_matched' END AS equal_any_test, + CASE WHEN priority > ANY(ARRAY[10, 20, 30]) THEN 'high' ELSE 'low' END AS greater_any_test, + CASE WHEN priority < ANY(ARRAY[5, 15, 25]) THEN 'found_lower' ELSE 'all_higher' END AS less_any_test, + CASE WHEN priority <> ANY(ARRAY[1, 2, 3]) THEN 'different' ELSE 'same' END AS not_equal_any_test +FROM employees; + +-- View testing COALESCE, string concatenation, and to_tsvector for full text search +CREATE VIEW public.text_search_view AS +SELECT + id, + COALESCE(first_name || ' ' || last_name, 'Anonymous') AS display_name, + COALESCE(email, '') AS email, + 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 diff --git a/testdata/diff/create_view/add_view/old.sql b/testdata/diff/create_view/add_view/old.sql index ac757190..fa22a354 100644 --- a/testdata/diff/create_view/add_view/old.sql +++ b/testdata/diff/create_view/add_view/old.sql @@ -1,7 +1,13 @@ CREATE TABLE public.employees ( id SERIAL PRIMARY KEY, name VARCHAR(100), - department_id INTEGER + first_name VARCHAR(50), + last_name VARCHAR(50), + email VARCHAR(100), + bio TEXT, + status VARCHAR(20) NOT NULL, + department_id INTEGER, + priority INTEGER ); CREATE TABLE public.departments ( diff --git a/testdata/diff/create_view/add_view/plan.json b/testdata/diff/create_view/add_view/plan.json index a969fd71..b0cce441 100644 --- a/testdata/diff/create_view/add_view/plan.json +++ b/testdata/diff/create_view/add_view/plan.json @@ -3,16 +3,22 @@ "pgschema_version": "1.4.0", "created_at": "1970-01-01T00:00:00Z", "source_fingerprint": { - "hash": "95ad22fa390833179c9661028a1d5b17d27f87223dac3481576654941198336c" + "hash": "e937536446c155860f69ab4a38fc142791a9a3636ada3e9113057afd9d875190" }, "groups": [ { "steps": [ { - "sql": "CREATE OR REPLACE VIEW employee_department_view AS\n SELECT e.id,\n e.name AS employee_name,\n d.name AS department_name,\n d.manager_id\n FROM employees e\n JOIN departments d ON e.department_id = d.id\n WHERE e.name IS NOT NULL AND d.manager_id IS NOT NULL;", + "sql": "CREATE OR REPLACE VIEW array_operators_view AS\n SELECT id,\n priority,\n CASE WHEN priority IN (10, 20, 30) THEN 'matched' ELSE 'not_matched' END AS equal_any_test,\n CASE WHEN priority > ANY (ARRAY[10, 20, 30]) THEN 'high' ELSE 'low' END AS greater_any_test,\n CASE WHEN priority < ANY (ARRAY[5, 15, 25]) THEN 'found_lower' ELSE 'all_higher' END AS less_any_test,\n CASE WHEN priority <> ANY (ARRAY[1, 2, 3]) THEN 'different' ELSE 'same' END AS not_equal_any_test\n FROM employees;", "type": "view", "operation": "create", - "path": "public.employee_department_view" + "path": "public.array_operators_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", + "operation": "create", + "path": "public.text_search_view" } ] } diff --git a/testdata/diff/create_view/add_view/plan.sql b/testdata/diff/create_view/add_view/plan.sql index 416c6f8b..c570e7fc 100644 --- a/testdata/diff/create_view/add_view/plan.sql +++ b/testdata/diff/create_view/add_view/plan.sql @@ -1,8 +1,17 @@ -CREATE OR REPLACE VIEW employee_department_view AS - SELECT e.id, - e.name AS employee_name, - d.name AS department_name, - d.manager_id - FROM employees e - JOIN departments d ON e.department_id = d.id - WHERE e.name IS NOT NULL AND d.manager_id IS NOT NULL; +CREATE OR REPLACE VIEW array_operators_view AS + SELECT id, + priority, + CASE WHEN priority IN (10, 20, 30) THEN 'matched' ELSE 'not_matched' END AS equal_any_test, + CASE WHEN priority > ANY (ARRAY[10, 20, 30]) THEN 'high' ELSE 'low' END AS greater_any_test, + CASE WHEN priority < ANY (ARRAY[5, 15, 25]) THEN 'found_lower' ELSE 'all_higher' END AS less_any_test, + CASE WHEN priority <> ANY (ARRAY[1, 2, 3]) THEN 'different' ELSE 'same' END AS not_equal_any_test + FROM employees; + +CREATE OR REPLACE VIEW text_search_view AS + SELECT id, + COALESCE((first_name::text || ' '::text) || last_name::text, 'Anonymous'::text) AS display_name, + COALESCE(email, ''::character varying) AS email, + COALESCE(bio, 'No description available'::text) AS description, + to_tsvector('english'::regconfig, (((COALESCE(first_name, ''::character varying)::text || ' '::text) || COALESCE(last_name, ''::character varying)::text) || ' '::text) || COALESCE(bio, ''::text)) AS search_vector + FROM employees + WHERE status::text = 'active'::text; diff --git a/testdata/diff/create_view/add_view/plan.txt b/testdata/diff/create_view/add_view/plan.txt index 7339a769..e72181ac 100644 --- a/testdata/diff/create_view/add_view/plan.txt +++ b/testdata/diff/create_view/add_view/plan.txt @@ -1,19 +1,29 @@ -Plan: 1 to add. +Plan: 2 to add. Summary by type: - views: 1 to add + views: 2 to add Views: - + employee_department_view + + array_operators_view + + text_search_view DDL to be executed: -------------------------------------------------- -CREATE OR REPLACE VIEW employee_department_view AS - SELECT e.id, - e.name AS employee_name, - d.name AS department_name, - d.manager_id - FROM employees e - JOIN departments d ON e.department_id = d.id - WHERE e.name IS NOT NULL AND d.manager_id IS NOT NULL; +CREATE OR REPLACE VIEW array_operators_view AS + SELECT id, + priority, + CASE WHEN priority IN (10, 20, 30) THEN 'matched' ELSE 'not_matched' END AS equal_any_test, + CASE WHEN priority > ANY (ARRAY[10, 20, 30]) THEN 'high' ELSE 'low' END AS greater_any_test, + CASE WHEN priority < ANY (ARRAY[5, 15, 25]) THEN 'found_lower' ELSE 'all_higher' END AS less_any_test, + CASE WHEN priority <> ANY (ARRAY[1, 2, 3]) THEN 'different' ELSE 'same' END AS not_equal_any_test + FROM employees; + +CREATE OR REPLACE VIEW text_search_view AS + SELECT id, + COALESCE((first_name::text || ' '::text) || last_name::text, 'Anonymous'::text) AS display_name, + COALESCE(email, ''::character varying) AS email, + COALESCE(bio, 'No description available'::text) AS description, + to_tsvector('english'::regconfig, (((COALESCE(first_name, ''::character varying)::text || ' '::text) || COALESCE(last_name, ''::character varying)::text) || ' '::text) || COALESCE(bio, ''::text)) AS search_vector + FROM employees + WHERE status::text = 'active'::text; diff --git a/testdata/diff/create_view/add_view_array_operators/diff.sql b/testdata/diff/create_view/add_view_array_operators/diff.sql deleted file mode 100644 index 1b4fa9fa..00000000 --- a/testdata/diff/create_view/add_view_array_operators/diff.sql +++ /dev/null @@ -1,9 +0,0 @@ -CREATE OR REPLACE VIEW test_array_operators AS - SELECT - id, - value, - CASE WHEN value IN (10, 20, 30) THEN 'matched' ELSE 'not_matched' END AS equal_any_test, - CASE WHEN value > ANY (ARRAY[10, 20, 30]) THEN 'high' ELSE 'low' END AS greater_any_test, - CASE WHEN value < ANY (ARRAY[5, 15, 25]) THEN 'found_lower' ELSE 'all_higher' END AS less_any_test, - CASE WHEN priority <> ANY (ARRAY[1, 2, 3]) THEN 'different' ELSE 'same' END AS not_equal_any_test - FROM test_data; diff --git a/testdata/diff/create_view/add_view_array_operators/new.sql b/testdata/diff/create_view/add_view_array_operators/new.sql deleted file mode 100644 index c45b242f..00000000 --- a/testdata/diff/create_view/add_view_array_operators/new.sql +++ /dev/null @@ -1,21 +0,0 @@ -CREATE TABLE public.test_data ( - id SERIAL PRIMARY KEY, - value INTEGER, - priority INTEGER -); - --- View with various array operators to test ScalarArrayOpExpr formatting --- The fix ensures that: --- 1. Only "= ANY" is converted to "IN" syntax --- 2. Other operators (>, <, <>) preserve "ANY" syntax -CREATE VIEW public.test_array_operators AS -SELECT - id, - value, - -- This SHOULD be converted to IN syntax (= ANY -> IN) - CASE WHEN value = ANY(ARRAY[10, 20, 30]) THEN 'matched' ELSE 'not_matched' END AS equal_any_test, - -- These should NOT be converted to IN syntax - they must preserve ANY - CASE WHEN value > ANY(ARRAY[10, 20, 30]) THEN 'high' ELSE 'low' END AS greater_any_test, - CASE WHEN value < ANY(ARRAY[5, 15, 25]) THEN 'found_lower' ELSE 'all_higher' END AS less_any_test, - CASE WHEN priority <> ANY(ARRAY[1, 2, 3]) THEN 'different' ELSE 'same' END AS not_equal_any_test -FROM test_data; diff --git a/testdata/diff/create_view/add_view_array_operators/old.sql b/testdata/diff/create_view/add_view_array_operators/old.sql deleted file mode 100644 index bbbae4c7..00000000 --- a/testdata/diff/create_view/add_view_array_operators/old.sql +++ /dev/null @@ -1,5 +0,0 @@ -CREATE TABLE public.test_data ( - id SERIAL PRIMARY KEY, - value INTEGER, - priority INTEGER -); diff --git a/testdata/diff/create_view/add_view_array_operators/plan.json b/testdata/diff/create_view/add_view_array_operators/plan.json deleted file mode 100644 index b263f0eb..00000000 --- a/testdata/diff/create_view/add_view_array_operators/plan.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "version": "1.0.0", - "pgschema_version": "1.4.0", - "created_at": "1970-01-01T00:00:00Z", - "source_fingerprint": { - "hash": "423516aca5eb1f6a8f040d2cf4f1dee6e0dc441f91fc54489812bcdedb29bc28" - }, - "groups": [ - { - "steps": [ - { - "sql": "CREATE OR REPLACE VIEW test_array_operators AS\n SELECT\n id,\n value,\n CASE WHEN value IN (10, 20, 30) THEN 'matched' ELSE 'not_matched' END AS equal_any_test,\n CASE WHEN value > ANY (ARRAY[10, 20, 30]) THEN 'high' ELSE 'low' END AS greater_any_test,\n CASE WHEN value < ANY (ARRAY[5, 15, 25]) THEN 'found_lower' ELSE 'all_higher' END AS less_any_test,\n CASE WHEN priority <> ANY (ARRAY[1, 2, 3]) THEN 'different' ELSE 'same' END AS not_equal_any_test\n FROM test_data;", - "type": "view", - "operation": "create", - "path": "public.test_array_operators" - } - ] - } - ] -} diff --git a/testdata/diff/create_view/add_view_array_operators/plan.sql b/testdata/diff/create_view/add_view_array_operators/plan.sql deleted file mode 100644 index 1b4fa9fa..00000000 --- a/testdata/diff/create_view/add_view_array_operators/plan.sql +++ /dev/null @@ -1,9 +0,0 @@ -CREATE OR REPLACE VIEW test_array_operators AS - SELECT - id, - value, - CASE WHEN value IN (10, 20, 30) THEN 'matched' ELSE 'not_matched' END AS equal_any_test, - CASE WHEN value > ANY (ARRAY[10, 20, 30]) THEN 'high' ELSE 'low' END AS greater_any_test, - CASE WHEN value < ANY (ARRAY[5, 15, 25]) THEN 'found_lower' ELSE 'all_higher' END AS less_any_test, - CASE WHEN priority <> ANY (ARRAY[1, 2, 3]) THEN 'different' ELSE 'same' END AS not_equal_any_test - FROM test_data; diff --git a/testdata/diff/create_view/add_view_array_operators/plan.txt b/testdata/diff/create_view/add_view_array_operators/plan.txt deleted file mode 100644 index cfc15a12..00000000 --- a/testdata/diff/create_view/add_view_array_operators/plan.txt +++ /dev/null @@ -1,20 +0,0 @@ -Plan: 1 to add. - -Summary by type: - views: 1 to add - -Views: - + test_array_operators - -DDL to be executed: --------------------------------------------------- - -CREATE OR REPLACE VIEW test_array_operators AS - SELECT - id, - value, - CASE WHEN value IN (10, 20, 30) THEN 'matched' ELSE 'not_matched' END AS equal_any_test, - CASE WHEN value > ANY (ARRAY[10, 20, 30]) THEN 'high' ELSE 'low' END AS greater_any_test, - CASE WHEN value < ANY (ARRAY[5, 15, 25]) THEN 'found_lower' ELSE 'all_higher' END AS less_any_test, - CASE WHEN priority <> ANY (ARRAY[1, 2, 3]) THEN 'different' ELSE 'same' END AS not_equal_any_test - FROM test_data; diff --git a/testdata/diff/create_view/add_view_coalesce/diff.sql b/testdata/diff/create_view/add_view_coalesce/diff.sql deleted file mode 100644 index cfe14235..00000000 --- a/testdata/diff/create_view/add_view_coalesce/diff.sql +++ /dev/null @@ -1,8 +0,0 @@ -CREATE OR REPLACE VIEW user_search_view AS - SELECT id, - COALESCE((first_name::text || ' '::text) || last_name::text, 'Anonymous'::text) AS display_name, - COALESCE(email, ''::character varying) AS email, - COALESCE(bio, 'No description available'::text) AS description, - to_tsvector('english'::regconfig, (((COALESCE(first_name, ''::character varying)::text || ' '::text) || COALESCE(last_name, ''::character varying)::text) || ' '::text) || COALESCE(bio, ''::text)) AS search_vector - FROM users - WHERE status::text = 'active'::text; \ No newline at end of file diff --git a/testdata/diff/create_view/add_view_coalesce/new.sql b/testdata/diff/create_view/add_view_coalesce/new.sql deleted file mode 100644 index b815032e..00000000 --- a/testdata/diff/create_view/add_view_coalesce/new.sql +++ /dev/null @@ -1,18 +0,0 @@ -CREATE TABLE public.users ( - id SERIAL PRIMARY KEY, - first_name VARCHAR(50), - last_name VARCHAR(50), - email VARCHAR(100), - bio TEXT, - status VARCHAR(20) NOT NULL -); - -CREATE VIEW public.user_search_view AS -SELECT - id, - COALESCE(first_name || ' ' || last_name, 'Anonymous') as display_name, - COALESCE(email, '') as email, - COALESCE(bio, 'No description available') as description, - to_tsvector('english', COALESCE(first_name, '') || ' ' || COALESCE(last_name, '') || ' ' || COALESCE(bio, '')) as search_vector -FROM users -WHERE status = 'active'; \ No newline at end of file diff --git a/testdata/diff/create_view/add_view_coalesce/old.sql b/testdata/diff/create_view/add_view_coalesce/old.sql deleted file mode 100644 index a1fcee13..00000000 --- a/testdata/diff/create_view/add_view_coalesce/old.sql +++ /dev/null @@ -1,8 +0,0 @@ -CREATE TABLE public.users ( - id SERIAL PRIMARY KEY, - first_name VARCHAR(50), - last_name VARCHAR(50), - email VARCHAR(100), - bio TEXT, - status VARCHAR(20) NOT NULL -); \ No newline at end of file diff --git a/testdata/diff/create_view/add_view_coalesce/plan.json b/testdata/diff/create_view/add_view_coalesce/plan.json deleted file mode 100644 index ac33ddaf..00000000 --- a/testdata/diff/create_view/add_view_coalesce/plan.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "version": "1.0.0", - "pgschema_version": "1.4.0", - "created_at": "1970-01-01T00:00:00Z", - "source_fingerprint": { - "hash": "456620ecb7e70b3a00128c821e278d77a7d987de2b8366247296e2884ea87ede" - }, - "groups": [ - { - "steps": [ - { - "sql": "CREATE OR REPLACE VIEW user_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 users\n WHERE status::text = 'active'::text;", - "type": "view", - "operation": "create", - "path": "public.user_search_view" - } - ] - } - ] -} diff --git a/testdata/diff/create_view/add_view_coalesce/plan.sql b/testdata/diff/create_view/add_view_coalesce/plan.sql deleted file mode 100644 index 36ef97f7..00000000 --- a/testdata/diff/create_view/add_view_coalesce/plan.sql +++ /dev/null @@ -1,8 +0,0 @@ -CREATE OR REPLACE VIEW user_search_view AS - SELECT id, - COALESCE((first_name::text || ' '::text) || last_name::text, 'Anonymous'::text) AS display_name, - COALESCE(email, ''::character varying) AS email, - COALESCE(bio, 'No description available'::text) AS description, - to_tsvector('english'::regconfig, (((COALESCE(first_name, ''::character varying)::text || ' '::text) || COALESCE(last_name, ''::character varying)::text) || ' '::text) || COALESCE(bio, ''::text)) AS search_vector - FROM users - WHERE status::text = 'active'::text; diff --git a/testdata/diff/create_view/add_view_coalesce/plan.txt b/testdata/diff/create_view/add_view_coalesce/plan.txt deleted file mode 100644 index e7a54ac8..00000000 --- a/testdata/diff/create_view/add_view_coalesce/plan.txt +++ /dev/null @@ -1,19 +0,0 @@ -Plan: 1 to add. - -Summary by type: - views: 1 to add - -Views: - + user_search_view - -DDL to be executed: --------------------------------------------------- - -CREATE OR REPLACE VIEW user_search_view AS - SELECT id, - COALESCE((first_name::text || ' '::text) || last_name::text, 'Anonymous'::text) AS display_name, - COALESCE(email, ''::character varying) AS email, - COALESCE(bio, 'No description available'::text) AS description, - to_tsvector('english'::regconfig, (((COALESCE(first_name, ''::character varying)::text || ' '::text) || COALESCE(last_name, ''::character varying)::text) || ' '::text) || COALESCE(bio, ''::text)) AS search_vector - FROM users - WHERE status::text = 'active'::text; diff --git a/testdata/diff/create_view/alter_view/diff.sql b/testdata/diff/create_view/alter_view/diff.sql index 7c8b2e97..6efa6d10 100644 --- a/testdata/diff/create_view/alter_view/diff.sql +++ b/testdata/diff/create_view/alter_view/diff.sql @@ -1,10 +1,9 @@ CREATE OR REPLACE VIEW active_employees AS - SELECT - status, + SELECT status, count(*) AS employee_count, avg(salary) AS avg_salary FROM employees - WHERE status = 'active' + WHERE status::text = 'active'::text GROUP BY status - HAVING avg(salary) > 50000::pg_catalog.numeric - ORDER BY employee_count, avg_salary DESC; + HAVING avg(salary) > 50000::numeric + ORDER BY (count(*)), (avg(salary)) DESC; diff --git a/testdata/diff/create_view/alter_view/plan.json b/testdata/diff/create_view/alter_view/plan.json index 2c1dfa3e..9184f172 100644 --- a/testdata/diff/create_view/alter_view/plan.json +++ b/testdata/diff/create_view/alter_view/plan.json @@ -3,13 +3,13 @@ "pgschema_version": "1.4.0", "created_at": "1970-01-01T00:00:00Z", "source_fingerprint": { - "hash": "e8bf0c29dc098c279c558d6f394cdf8b2f6ad49f1ebabf9308998e10e6651894" + "hash": "8ddc06ab4dd2b730c2cf30a83d20e0447446b665b462de1c1caf1ebffbc4ad89" }, "groups": [ { "steps": [ { - "sql": "CREATE OR REPLACE VIEW active_employees AS\n SELECT\n status,\n count(*) AS employee_count,\n avg(salary) AS avg_salary\n FROM employees\n WHERE status = 'active'\n GROUP BY status\n HAVING avg(salary) > 50000::pg_catalog.numeric\n ORDER BY employee_count, avg_salary DESC;", + "sql": "CREATE OR REPLACE VIEW active_employees AS\n SELECT status,\n count(*) AS employee_count,\n avg(salary) AS avg_salary\n FROM employees\n WHERE status::text = 'active'::text\n GROUP BY status\n HAVING avg(salary) > 50000::numeric\n ORDER BY (count(*)), (avg(salary)) DESC;", "type": "view", "operation": "alter", "path": "public.active_employees" diff --git a/testdata/diff/create_view/alter_view/plan.sql b/testdata/diff/create_view/alter_view/plan.sql index 7c8b2e97..6efa6d10 100644 --- a/testdata/diff/create_view/alter_view/plan.sql +++ b/testdata/diff/create_view/alter_view/plan.sql @@ -1,10 +1,9 @@ CREATE OR REPLACE VIEW active_employees AS - SELECT - status, + SELECT status, count(*) AS employee_count, avg(salary) AS avg_salary FROM employees - WHERE status = 'active' + WHERE status::text = 'active'::text GROUP BY status - HAVING avg(salary) > 50000::pg_catalog.numeric - ORDER BY employee_count, avg_salary DESC; + HAVING avg(salary) > 50000::numeric + ORDER BY (count(*)), (avg(salary)) DESC; diff --git a/testdata/diff/create_view/alter_view/plan.txt b/testdata/diff/create_view/alter_view/plan.txt index 39fac2b4..602b9a06 100644 --- a/testdata/diff/create_view/alter_view/plan.txt +++ b/testdata/diff/create_view/alter_view/plan.txt @@ -10,12 +10,11 @@ DDL to be executed: -------------------------------------------------- CREATE OR REPLACE VIEW active_employees AS - SELECT - status, + SELECT status, count(*) AS employee_count, avg(salary) AS avg_salary FROM employees - WHERE status = 'active' + WHERE status::text = 'active'::text GROUP BY status - HAVING avg(salary) > 50000::pg_catalog.numeric - ORDER BY employee_count, avg_salary DESC; + HAVING avg(salary) > 50000::numeric + ORDER BY (count(*)), (avg(salary)) DESC; diff --git a/testdata/dump/issue_82_view_logic_expr/pgschema.sql b/testdata/dump/issue_82_view_logic_expr/pgschema.sql index 58588181..71b00219 100644 --- a/testdata/dump/issue_82_view_logic_expr/pgschema.sql +++ b/testdata/dump/issue_82_view_logic_expr/pgschema.sql @@ -22,8 +22,7 @@ CREATE TABLE IF NOT EXISTS orders ( -- CREATE OR REPLACE VIEW paid_orders AS - SELECT - id AS order_id, + SELECT id AS order_id, status, CASE WHEN status IN ('paid', 'completed') THEN amount ELSE NULL END AS paid_amount FROM orders diff --git a/testdata/dump/sakila/pgschema.sql b/testdata/dump/sakila/pgschema.sql index f0db0ba1..c8a90104 100644 --- a/testdata/dump/sakila/pgschema.sql +++ b/testdata/dump/sakila/pgschema.sql @@ -1092,8 +1092,7 @@ CREATE OR REPLACE VIEW nicer_but_slower_film_list AS -- CREATE MATERIALIZED VIEW IF NOT EXISTS rental_by_category AS - SELECT - c.name AS category, + SELECT c.name AS category, sum(p.amount) AS total_sales FROM payment p JOIN rental r ON p.rental_id = r.rental_id @@ -1102,7 +1101,7 @@ CREATE MATERIALIZED VIEW IF NOT EXISTS rental_by_category AS JOIN film_category fc ON f.film_id = fc.film_id JOIN category c ON fc.category_id = c.category_id GROUP BY c.name - ORDER BY total_sales DESC; + ORDER BY (sum(p.amount)) DESC; -- -- Name: rental_category; Type: INDEX; Schema: -; Owner: - @@ -1115,8 +1114,7 @@ CREATE UNIQUE INDEX IF NOT EXISTS rental_category ON rental_by_category (categor -- CREATE OR REPLACE VIEW sales_by_film_category AS - SELECT - c.name AS category, + SELECT c.name AS category, sum(p.amount) AS total_sales FROM payment p JOIN rental r ON p.rental_id = r.rental_id @@ -1125,7 +1123,7 @@ CREATE OR REPLACE VIEW sales_by_film_category AS JOIN film_category fc ON f.film_id = fc.film_id JOIN category c ON fc.category_id = c.category_id GROUP BY c.name - ORDER BY total_sales DESC; + ORDER BY (sum(p.amount)) DESC; -- -- Name: sales_by_store; Type: VIEW; Schema: -; Owner: -