diff --git a/internal/diff/procedure.go b/internal/diff/procedure.go index cde3b0d5..47115cf7 100644 --- a/internal/diff/procedure.go +++ b/internal/diff/procedure.go @@ -40,10 +40,10 @@ func generateModifyProceduresSQL(diffs []*procedureDiff, targetSchema string, co procedureName := qualifyEntityName(diff.Old.Schema, diff.Old.Name, targetSchema) var dropSQL string - // For DROP statements, we need just the parameter types, not names - paramTypes := extractParameterTypes(diff.Old) - if paramTypes != "" { - dropSQL = fmt.Sprintf("DROP PROCEDURE IF EXISTS %s(%s);", procedureName, paramTypes) + // For DROP statements, we need the full parameter signature including modes and names + paramSignature := formatProcedureParametersForDrop(diff.Old) + if paramSignature != "" { + dropSQL = fmt.Sprintf("DROP PROCEDURE IF EXISTS %s(%s);", procedureName, paramSignature) } else { dropSQL = fmt.Sprintf("DROP PROCEDURE IF EXISTS %s();", procedureName) } @@ -88,11 +88,11 @@ func generateDropProceduresSQL(procedures []*ir.Procedure, targetSchema string, procedureName := qualifyEntityName(procedure.Schema, procedure.Name, targetSchema) var sql string - // For DROP statements, we need just the parameter types, not names - // Extract types from the arguments/signature - paramTypes := extractParameterTypes(procedure) - if paramTypes != "" { - sql = fmt.Sprintf("DROP PROCEDURE IF EXISTS %s(%s);", procedureName, paramTypes) + // For DROP statements, we need the full parameter signature including modes and names + // Extract the complete signature from the procedure + paramSignature := formatProcedureParametersForDrop(procedure) + if paramSignature != "" { + sql = fmt.Sprintf("DROP PROCEDURE IF EXISTS %s(%s);", procedureName, paramSignature) } else { sql = fmt.Sprintf("DROP PROCEDURE IF EXISTS %s();", procedureName) } @@ -110,6 +110,29 @@ func generateDropProceduresSQL(procedures []*ir.Procedure, targetSchema string, } } +// formatParameterString formats a single parameter with mode, name, type, and optional default value +// includeDefault controls whether DEFAULT clauses are included in the output +func formatParameterString(param *ir.Parameter, includeDefault bool) string { + var part string + // Always include mode for clarity (IN is default but we make it explicit) + if param.Mode != "" { + part = param.Mode + " " + } else { + part = "IN " + } + // Add parameter name and type + if param.Name != "" { + part += param.Name + " " + param.DataType + } else { + part += param.DataType + } + // Add DEFAULT value if present and requested + if includeDefault && param.DefaultValue != nil { + part += " DEFAULT " + *param.DefaultValue + } + return part +} + // generateProcedureSQL generates CREATE OR REPLACE PROCEDURE SQL for a procedure func generateProcedureSQL(procedure *ir.Procedure, targetSchema string) string { var stmt strings.Builder @@ -118,8 +141,21 @@ func generateProcedureSQL(procedure *ir.Procedure, targetSchema string) string { procedureName := qualifyEntityName(procedure.Schema, procedure.Name, targetSchema) stmt.WriteString(fmt.Sprintf("CREATE OR REPLACE PROCEDURE %s", procedureName)) - // Add parameters using detailed signature if available - if procedure.Signature != "" { + // Add parameters - prefer structured Parameters array, then signature, then arguments + if len(procedure.Parameters) > 0 { + // Build parameter list from structured Parameters array + // Always include mode explicitly (matching pg_dump behavior) + var paramParts []string + for _, param := range procedure.Parameters { + paramParts = append(paramParts, formatParameterString(param, true)) + } + if len(paramParts) > 0 { + stmt.WriteString(fmt.Sprintf("(\n %s\n)", strings.Join(paramParts, ",\n "))) + } else { + stmt.WriteString("()") + } + } else if procedure.Signature != "" { + // Use detailed signature if available stmt.WriteString(fmt.Sprintf("(\n %s\n)", strings.ReplaceAll(procedure.Signature, ", ", ",\n "))) } else if procedure.Arguments != "" { // Format Arguments field with newlines if it contains multiple parameters @@ -223,55 +259,54 @@ func proceduresEqual(old, new *ir.Procedure) bool { return true } -// extractParameterTypes extracts just the parameter types from a procedure's signature or arguments -// For example: "order_id integer, amount numeric" becomes "integer, numeric" -func extractParameterTypes(procedure *ir.Procedure) string { - // Try to use Arguments field first as it should contain just types - if procedure.Arguments != "" { - // If Arguments contains parameter names (e.g., "order_id integer, amount numeric"), - // extract just the types - args := procedure.Arguments - if strings.Contains(args, " ") { - // This suggests parameter names are included, extract types - var types []string - params := strings.Split(args, ",") - for _, param := range params { - param = strings.TrimSpace(param) - // Split by spaces and take the last part (the type) - parts := strings.Fields(param) - if len(parts) >= 2 { - // Take the type (usually the second part: "name type") - types = append(types, parts[1]) - } else if len(parts) == 1 { - // If only one part, assume it's the type - types = append(types, parts[0]) - } - } - return strings.Join(types, ", ") +// formatProcedureParametersForDrop formats procedure parameters for DROP PROCEDURE statements +// Returns the full parameter signature including mode and name (e.g., "IN order_id integer, IN amount numeric") +// This is necessary for proper procedure identification in PostgreSQL +func formatProcedureParametersForDrop(procedure *ir.Procedure) string { + // First, try to use the structured Parameters array if available + if len(procedure.Parameters) > 0 { + var paramParts []string + for _, param := range procedure.Parameters { + // Use helper function with includeDefault=false for DROP statements + paramParts = append(paramParts, formatParameterString(param, false)) } - // If no spaces, assume Arguments already contains just types - return args + return strings.Join(paramParts, ", ") } - // Fallback to Signature field + // Fallback to Signature field if Parameters not available if procedure.Signature != "" { - var types []string + // Signature should already have the mode information + // Just need to remove DEFAULT clauses + var paramParts []string params := strings.Split(procedure.Signature, ",") for _, param := range params { param = strings.TrimSpace(param) - // Remove DEFAULT clauses and extract type - if strings.Contains(param, " DEFAULT ") { - param = strings.Split(param, " DEFAULT ")[0] + // Remove DEFAULT clauses + if idx := strings.Index(param, " DEFAULT "); idx != -1 { + param = param[:idx] + } + paramParts = append(paramParts, param) + } + return strings.Join(paramParts, ", ") + } + + // Last resort: try to parse Arguments field and add IN mode + if procedure.Arguments != "" { + var paramParts []string + params := strings.Split(procedure.Arguments, ",") + for _, param := range params { + param = strings.TrimSpace(param) + // Remove DEFAULT clauses + if idx := strings.Index(param, " DEFAULT "); idx != -1 { + param = param[:idx] } - // Split by spaces and take the type part - parts := strings.Fields(param) - if len(parts) >= 2 { - types = append(types, parts[1]) - } else if len(parts) == 1 { - types = append(types, parts[0]) + // Add IN mode prefix if not already present + if !strings.HasPrefix(param, "IN ") && !strings.HasPrefix(param, "OUT ") && !strings.HasPrefix(param, "INOUT ") { + param = "IN " + param } + paramParts = append(paramParts, param) } - return strings.Join(types, ", ") + return strings.Join(paramParts, ", ") } return "" diff --git a/ir/inspector.go b/ir/inspector.go index 3668de8c..9966b2a7 100644 --- a/ir/inspector.go +++ b/ir/inspector.go @@ -1170,6 +1170,7 @@ func (i *Inspector) buildFunctions(ctx context.Context, schema *IR, targetSchema // parseParametersFromSignature parses function signature string into Parameter structs // Example signature: "order_id integer, discount_percent numeric DEFAULT 0" +// Or with modes: "IN order_id integer, OUT result integer" func (i *Inspector) parseParametersFromSignature(signature string) []*Parameter { if signature == "" { return nil @@ -1187,11 +1188,11 @@ func (i *Inspector) parseParametersFromSignature(signature string) []*Parameter } param := &Parameter{ - Mode: "IN", // Default mode for inspector + Mode: "IN", // Default mode Position: position, } - // Look for DEFAULT clause + // Look for DEFAULT clause first defaultIdx := strings.Index(strings.ToUpper(paramStr), " DEFAULT ") if defaultIdx != -1 { // Extract default value @@ -1200,14 +1201,28 @@ func (i *Inspector) parseParametersFromSignature(signature string) []*Parameter paramStr = strings.TrimSpace(paramStr[:defaultIdx]) } - // Split into name and type + // Split into parts and check for mode prefix parts := strings.Fields(paramStr) - if len(parts) >= 2 { - param.Name = parts[0] - param.DataType = strings.Join(parts[1:], " ") - } else if len(parts) == 1 { - // Only type, no name (shouldn't happen but handle gracefully) - param.DataType = parts[0] + if len(parts) == 0 { + continue + } + + // Check if first part is a mode keyword (IN, OUT, INOUT, VARIADIC, TABLE) + firstPart := strings.ToUpper(parts[0]) + startIdx := 0 + if firstPart == "IN" || firstPart == "OUT" || firstPart == "INOUT" || firstPart == "VARIADIC" || firstPart == "TABLE" { + param.Mode = firstPart + startIdx = 1 + } + + // Parse name and type from remaining parts + remainingParts := parts[startIdx:] + if len(remainingParts) >= 2 { + param.Name = remainingParts[0] + param.DataType = strings.Join(remainingParts[1:], " ") + } else if len(remainingParts) == 1 { + // Only type, no name + param.DataType = remainingParts[0] } parameters = append(parameters, param) diff --git a/ir/parser.go b/ir/parser.go index 5faeb9fd..16f78f65 100644 --- a/ir/parser.go +++ b/ir/parser.go @@ -1852,10 +1852,14 @@ func (p *Parser) parseCreateProcedure(funcStmt *pg_query.CreateFunctionStmt) err parameters := p.extractFunctionParametersFromAST(funcStmt) // Convert parameters to argument string for Procedure struct + // Also build signature with explicit modes var arguments string + var signature string if len(parameters) > 0 { var argParts []string + var sigParts []string for _, param := range parameters { + // For Arguments field (legacy, without mode) if param.Name != "" { argPart := param.Name + " " + param.DataType // Add DEFAULT value if present @@ -1866,8 +1870,29 @@ func (p *Parser) parseCreateProcedure(funcStmt *pg_query.CreateFunctionStmt) err } else { argParts = append(argParts, param.DataType) } + + // For Signature field (with explicit mode) + var sigPart string + if param.Mode != "" && param.Mode != "IN" { + // Include non-default modes (OUT, INOUT, VARIADIC) + sigPart = param.Mode + " " + } else { + // Include IN mode (default) explicitly to match pg_dump behavior + sigPart = "IN " + } + if param.Name != "" { + sigPart += param.Name + " " + param.DataType + } else { + sigPart += param.DataType + } + // Add DEFAULT value if present + if param.DefaultValue != nil { + sigPart += " DEFAULT " + *param.DefaultValue + } + sigParts = append(sigParts, sigPart) } arguments = strings.Join(argParts, ", ") + signature = strings.Join(sigParts, ", ") } // Create procedure @@ -1876,6 +1901,8 @@ func (p *Parser) parseCreateProcedure(funcStmt *pg_query.CreateFunctionStmt) err Name: procName, Language: language, Arguments: arguments, + Signature: signature, + Parameters: parameters, Definition: definition, } diff --git a/testdata/diff/create_procedure/add_procedure/diff.sql b/testdata/diff/create_procedure/add_procedure/diff.sql index 2a5bb85e..5504914b 100644 --- a/testdata/diff/create_procedure/add_procedure/diff.sql +++ b/testdata/diff/create_procedure/add_procedure/diff.sql @@ -1,18 +1,11 @@ -CREATE OR REPLACE PROCEDURE update_user_status( - user_id integer, - new_status text +CREATE OR REPLACE PROCEDURE example_procedure( + IN input_value integer, + OUT output_value integer ) LANGUAGE plpgsql AS $$ BEGIN - UPDATE users - SET status = new_status, updated_at = NOW() - WHERE id = user_id; - - IF NOT FOUND THEN - RAISE EXCEPTION 'User not found: %', user_id; - END IF; - - COMMIT; + RAISE NOTICE 'Input value is: %', input_value; + output_value := input_value + 1; END; $$; diff --git a/testdata/diff/create_procedure/add_procedure/new.sql b/testdata/diff/create_procedure/add_procedure/new.sql index ab777523..6bdfafdf 100644 --- a/testdata/diff/create_procedure/add_procedure/new.sql +++ b/testdata/diff/create_procedure/add_procedure/new.sql @@ -1,18 +1,11 @@ -CREATE PROCEDURE update_user_status( - user_id integer, - new_status text +CREATE PROCEDURE example_procedure( + IN input_value integer, + OUT output_value integer ) LANGUAGE plpgsql AS $$ BEGIN - UPDATE users - SET status = new_status, updated_at = NOW() - WHERE id = user_id; - - IF NOT FOUND THEN - RAISE EXCEPTION 'User not found: %', user_id; - END IF; - - COMMIT; + RAISE NOTICE 'Input value is: %', input_value; + output_value := input_value + 1; END; $$; \ No newline at end of file diff --git a/testdata/diff/create_procedure/add_procedure/plan.json b/testdata/diff/create_procedure/add_procedure/plan.json index 8ef42bdc..4b8af5cb 100644 --- a/testdata/diff/create_procedure/add_procedure/plan.json +++ b/testdata/diff/create_procedure/add_procedure/plan.json @@ -1,6 +1,6 @@ { "version": "1.0.0", - "pgschema_version": "1.1.1", + "pgschema_version": "1.2.1", "created_at": "1970-01-01T00:00:00Z", "source_fingerprint": { "hash": "965b1131737c955e24c7f827c55bd78e4cb49a75adfd04229e0ba297376f5085" @@ -9,10 +9,10 @@ { "steps": [ { - "sql": "CREATE OR REPLACE PROCEDURE update_user_status(\n user_id integer,\n new_status text\n)\nLANGUAGE plpgsql\nAS $$\nBEGIN\n UPDATE users \n SET status = new_status, updated_at = NOW() \n WHERE id = user_id;\n \n IF NOT FOUND THEN\n RAISE EXCEPTION 'User not found: %', user_id;\n END IF;\n \n COMMIT;\nEND;\n$$;", + "sql": "CREATE OR REPLACE PROCEDURE example_procedure(\n IN input_value integer,\n OUT output_value integer\n)\nLANGUAGE plpgsql\nAS $$\nBEGIN\n RAISE NOTICE 'Input value is: %', input_value;\n output_value := input_value + 1;\nEND;\n$$;", "type": "procedure", "operation": "create", - "path": "public.update_user_status" + "path": "public.example_procedure" } ] } diff --git a/testdata/diff/create_procedure/add_procedure/plan.sql b/testdata/diff/create_procedure/add_procedure/plan.sql index 2a5bb85e..5504914b 100644 --- a/testdata/diff/create_procedure/add_procedure/plan.sql +++ b/testdata/diff/create_procedure/add_procedure/plan.sql @@ -1,18 +1,11 @@ -CREATE OR REPLACE PROCEDURE update_user_status( - user_id integer, - new_status text +CREATE OR REPLACE PROCEDURE example_procedure( + IN input_value integer, + OUT output_value integer ) LANGUAGE plpgsql AS $$ BEGIN - UPDATE users - SET status = new_status, updated_at = NOW() - WHERE id = user_id; - - IF NOT FOUND THEN - RAISE EXCEPTION 'User not found: %', user_id; - END IF; - - COMMIT; + RAISE NOTICE 'Input value is: %', input_value; + output_value := input_value + 1; END; $$; diff --git a/testdata/diff/create_procedure/add_procedure/plan.txt b/testdata/diff/create_procedure/add_procedure/plan.txt index feeb28f4..832401ca 100644 --- a/testdata/diff/create_procedure/add_procedure/plan.txt +++ b/testdata/diff/create_procedure/add_procedure/plan.txt @@ -4,26 +4,19 @@ Summary by type: procedures: 1 to add Procedures: - + update_user_status + + example_procedure DDL to be executed: -------------------------------------------------- -CREATE OR REPLACE PROCEDURE update_user_status( - user_id integer, - new_status text +CREATE OR REPLACE PROCEDURE example_procedure( + IN input_value integer, + OUT output_value integer ) LANGUAGE plpgsql AS $$ BEGIN - UPDATE users - SET status = new_status, updated_at = NOW() - WHERE id = user_id; - - IF NOT FOUND THEN - RAISE EXCEPTION 'User not found: %', user_id; - END IF; - - COMMIT; + RAISE NOTICE 'Input value is: %', input_value; + output_value := input_value + 1; END; $$; diff --git a/testdata/diff/create_procedure/alter_procedure/diff.sql b/testdata/diff/create_procedure/alter_procedure/diff.sql index 0f1babfd..11343446 100644 --- a/testdata/diff/create_procedure/alter_procedure/diff.sql +++ b/testdata/diff/create_procedure/alter_procedure/diff.sql @@ -1,9 +1,9 @@ -DROP PROCEDURE IF EXISTS process_payment(integer, numeric); +DROP PROCEDURE IF EXISTS process_payment(IN order_id integer, IN amount numeric); CREATE OR REPLACE PROCEDURE process_payment( - order_id integer, - amount numeric, - payment_method text DEFAULT 'credit_card' + IN order_id integer, + IN amount numeric, + IN payment_method text DEFAULT 'credit_card' ) LANGUAGE plpgsql AS $$ diff --git a/testdata/diff/create_procedure/alter_procedure/plan.json b/testdata/diff/create_procedure/alter_procedure/plan.json index 12b4823c..63baae47 100644 --- a/testdata/diff/create_procedure/alter_procedure/plan.json +++ b/testdata/diff/create_procedure/alter_procedure/plan.json @@ -1,21 +1,21 @@ { "version": "1.0.0", - "pgschema_version": "1.1.1", + "pgschema_version": "1.2.1", "created_at": "1970-01-01T00:00:00Z", "source_fingerprint": { - "hash": "ece8114f47983f4d2420a11efca22696d4f85552a24adba54ba0ee342127b045" + "hash": "bfc3ecb23e756b22a9efa8a07704b4ec5542c334b76a3338374dc25ea1817d29" }, "groups": [ { "steps": [ { - "sql": "DROP PROCEDURE IF EXISTS process_payment(integer, numeric);", + "sql": "DROP PROCEDURE IF EXISTS process_payment(IN order_id integer, IN amount numeric);", "type": "procedure", "operation": "drop", "path": "public.process_payment" }, { - "sql": "CREATE OR REPLACE PROCEDURE process_payment(\n order_id integer,\n amount numeric,\n payment_method text DEFAULT 'credit_card'\n)\nLANGUAGE plpgsql\nAS $$\nBEGIN\n UPDATE orders \n SET status = 'paid', \n payment_amount = amount,\n payment_method = payment_method,\n processed_at = NOW()\n WHERE id = order_id;\n \n INSERT INTO payment_history (order_id, amount, method, processed_at)\n VALUES (order_id, amount, payment_method, NOW());\n \n COMMIT;\nEND;\n$$;", + "sql": "CREATE OR REPLACE PROCEDURE process_payment(\n IN order_id integer,\n IN amount numeric,\n IN payment_method text DEFAULT 'credit_card'\n)\nLANGUAGE plpgsql\nAS $$\nBEGIN\n UPDATE orders \n SET status = 'paid', \n payment_amount = amount,\n payment_method = payment_method,\n processed_at = NOW()\n WHERE id = order_id;\n \n INSERT INTO payment_history (order_id, amount, method, processed_at)\n VALUES (order_id, amount, payment_method, NOW());\n \n COMMIT;\nEND;\n$$;", "type": "procedure", "operation": "create", "path": "public.process_payment" diff --git a/testdata/diff/create_procedure/alter_procedure/plan.sql b/testdata/diff/create_procedure/alter_procedure/plan.sql index 0f1babfd..11343446 100644 --- a/testdata/diff/create_procedure/alter_procedure/plan.sql +++ b/testdata/diff/create_procedure/alter_procedure/plan.sql @@ -1,9 +1,9 @@ -DROP PROCEDURE IF EXISTS process_payment(integer, numeric); +DROP PROCEDURE IF EXISTS process_payment(IN order_id integer, IN amount numeric); CREATE OR REPLACE PROCEDURE process_payment( - order_id integer, - amount numeric, - payment_method text DEFAULT 'credit_card' + IN order_id integer, + IN amount numeric, + IN payment_method text DEFAULT 'credit_card' ) LANGUAGE plpgsql AS $$ diff --git a/testdata/diff/create_procedure/alter_procedure/plan.txt b/testdata/diff/create_procedure/alter_procedure/plan.txt index 3907f71c..88b369ca 100644 --- a/testdata/diff/create_procedure/alter_procedure/plan.txt +++ b/testdata/diff/create_procedure/alter_procedure/plan.txt @@ -10,12 +10,12 @@ Procedures: DDL to be executed: -------------------------------------------------- -DROP PROCEDURE IF EXISTS process_payment(integer, numeric); +DROP PROCEDURE IF EXISTS process_payment(IN order_id integer, IN amount numeric); CREATE OR REPLACE PROCEDURE process_payment( - order_id integer, - amount numeric, - payment_method text DEFAULT 'credit_card' + IN order_id integer, + IN amount numeric, + IN payment_method text DEFAULT 'credit_card' ) LANGUAGE plpgsql AS $$ diff --git a/testdata/diff/create_procedure/drop_procedure/diff.sql b/testdata/diff/create_procedure/drop_procedure/diff.sql index 647565fd..d69f3bf6 100644 --- a/testdata/diff/create_procedure/drop_procedure/diff.sql +++ b/testdata/diff/create_procedure/drop_procedure/diff.sql @@ -1 +1 @@ -DROP PROCEDURE IF EXISTS cleanup_old_data(integer); +DROP PROCEDURE IF EXISTS cleanup_old_data(IN days_old integer); diff --git a/testdata/diff/create_procedure/drop_procedure/plan.json b/testdata/diff/create_procedure/drop_procedure/plan.json index 720862f3..46abd99f 100644 --- a/testdata/diff/create_procedure/drop_procedure/plan.json +++ b/testdata/diff/create_procedure/drop_procedure/plan.json @@ -1,15 +1,15 @@ { "version": "1.0.0", - "pgschema_version": "1.1.1", + "pgschema_version": "1.2.1", "created_at": "1970-01-01T00:00:00Z", "source_fingerprint": { - "hash": "f02c22162ec7f808d4acf04c1cd694d8fe513c30c21845ab600e8eca2b4f2752" + "hash": "53ad909d589a920e0f96183fa15eefd1ad2889fdcc64d7486cb100eb507a9055" }, "groups": [ { "steps": [ { - "sql": "DROP PROCEDURE IF EXISTS cleanup_old_data(integer);", + "sql": "DROP PROCEDURE IF EXISTS cleanup_old_data(IN days_old integer);", "type": "procedure", "operation": "drop", "path": "public.cleanup_old_data" diff --git a/testdata/diff/create_procedure/drop_procedure/plan.sql b/testdata/diff/create_procedure/drop_procedure/plan.sql index 647565fd..d69f3bf6 100644 --- a/testdata/diff/create_procedure/drop_procedure/plan.sql +++ b/testdata/diff/create_procedure/drop_procedure/plan.sql @@ -1 +1 @@ -DROP PROCEDURE IF EXISTS cleanup_old_data(integer); +DROP PROCEDURE IF EXISTS cleanup_old_data(IN days_old integer); diff --git a/testdata/diff/create_procedure/drop_procedure/plan.txt b/testdata/diff/create_procedure/drop_procedure/plan.txt index da857ece..266db5d9 100644 --- a/testdata/diff/create_procedure/drop_procedure/plan.txt +++ b/testdata/diff/create_procedure/drop_procedure/plan.txt @@ -9,4 +9,4 @@ Procedures: DDL to be executed: -------------------------------------------------- -DROP PROCEDURE IF EXISTS cleanup_old_data(integer); +DROP PROCEDURE IF EXISTS cleanup_old_data(IN days_old integer); diff --git a/testdata/diff/migrate/v4/diff.sql b/testdata/diff/migrate/v4/diff.sql index 526ad887..7a220cf3 100644 --- a/testdata/diff/migrate/v4/diff.sql +++ b/testdata/diff/migrate/v4/diff.sql @@ -1,6 +1,6 @@ CREATE OR REPLACE PROCEDURE simple_salary_update( - p_emp_no integer, - p_amount integer + IN p_emp_no integer, + IN p_amount integer ) LANGUAGE plpgsql AS $$ diff --git a/testdata/diff/migrate/v4/plan.json b/testdata/diff/migrate/v4/plan.json index b68d9c3d..d1f2a1b7 100644 --- a/testdata/diff/migrate/v4/plan.json +++ b/testdata/diff/migrate/v4/plan.json @@ -1,6 +1,6 @@ { "version": "1.0.0", - "pgschema_version": "1.0.0", + "pgschema_version": "1.2.1", "created_at": "1970-01-01T00:00:00Z", "source_fingerprint": { "hash": "953c5263c9185d170429fab8c78931f7801f8479579faf963c0ac9635bf2a8ed" @@ -9,7 +9,7 @@ { "steps": [ { - "sql": "CREATE OR REPLACE PROCEDURE simple_salary_update(\n p_emp_no integer,\n p_amount integer\n)\nLANGUAGE plpgsql\nAS $$\nBEGIN\n -- Simple update of salary amount\n UPDATE salary \n SET amount = p_amount \n WHERE emp_no = p_emp_no \n AND to_date = '9999-01-01';\n \n RAISE NOTICE 'Updated salary for employee % to $%', p_emp_no, p_amount;\nEND;\n$$;", + "sql": "CREATE OR REPLACE PROCEDURE simple_salary_update(\n IN p_emp_no integer,\n IN p_amount integer\n)\nLANGUAGE plpgsql\nAS $$\nBEGIN\n -- Simple update of salary amount\n UPDATE salary \n SET amount = p_amount \n WHERE emp_no = p_emp_no \n AND to_date = '9999-01-01';\n \n RAISE NOTICE 'Updated salary for employee % to $%', p_emp_no, p_amount;\nEND;\n$$;", "type": "procedure", "operation": "create", "path": "public.simple_salary_update" diff --git a/testdata/diff/migrate/v4/plan.sql b/testdata/diff/migrate/v4/plan.sql index fa84bc16..fb6a559d 100644 --- a/testdata/diff/migrate/v4/plan.sql +++ b/testdata/diff/migrate/v4/plan.sql @@ -1,6 +1,6 @@ CREATE OR REPLACE PROCEDURE simple_salary_update( - p_emp_no integer, - p_amount integer + IN p_emp_no integer, + IN p_amount integer ) LANGUAGE plpgsql AS $$ diff --git a/testdata/diff/migrate/v4/plan.txt b/testdata/diff/migrate/v4/plan.txt index c16512b4..614d285a 100644 --- a/testdata/diff/migrate/v4/plan.txt +++ b/testdata/diff/migrate/v4/plan.txt @@ -28,8 +28,8 @@ DDL to be executed: -- Transaction Group #1 CREATE OR REPLACE PROCEDURE simple_salary_update( - p_emp_no integer, - p_amount integer + IN p_emp_no integer, + IN p_amount integer ) LANGUAGE plpgsql AS $$ diff --git a/testdata/diff/migrate/v5/diff.sql b/testdata/diff/migrate/v5/diff.sql index dd92355c..a33897e8 100644 --- a/testdata/diff/migrate/v5/diff.sql +++ b/testdata/diff/migrate/v5/diff.sql @@ -1,4 +1,4 @@ -DROP PROCEDURE IF EXISTS simple_salary_update(integer, integer); +DROP PROCEDURE IF EXISTS simple_salary_update(IN p_emp_no integer, IN p_amount integer); DROP TABLE IF EXISTS title CASCADE; diff --git a/testdata/diff/migrate/v5/plan.json b/testdata/diff/migrate/v5/plan.json index 13b320f0..4772b519 100644 --- a/testdata/diff/migrate/v5/plan.json +++ b/testdata/diff/migrate/v5/plan.json @@ -1,15 +1,15 @@ { "version": "1.0.0", - "pgschema_version": "1.1.1", + "pgschema_version": "1.2.1", "created_at": "1970-01-01T00:00:00Z", "source_fingerprint": { - "hash": "d9d1c4acba93820180b7c890e1673d3e722c842c93c0bd42c2bd0b038d68681c" + "hash": "d9c2bda9bd3597eeee9005abe7e103ffd05e19890772c5c5f28e0a6020018942" }, "groups": [ { "steps": [ { - "sql": "DROP PROCEDURE IF EXISTS simple_salary_update(integer, integer);", + "sql": "DROP PROCEDURE IF EXISTS simple_salary_update(IN p_emp_no integer, IN p_amount integer);", "type": "procedure", "operation": "drop", "path": "public.simple_salary_update" diff --git a/testdata/diff/migrate/v5/plan.sql b/testdata/diff/migrate/v5/plan.sql index dd92355c..a33897e8 100644 --- a/testdata/diff/migrate/v5/plan.sql +++ b/testdata/diff/migrate/v5/plan.sql @@ -1,4 +1,4 @@ -DROP PROCEDURE IF EXISTS simple_salary_update(integer, integer); +DROP PROCEDURE IF EXISTS simple_salary_update(IN p_emp_no integer, IN p_amount integer); DROP TABLE IF EXISTS title CASCADE; diff --git a/testdata/diff/migrate/v5/plan.txt b/testdata/diff/migrate/v5/plan.txt index f885e362..9f954c82 100644 --- a/testdata/diff/migrate/v5/plan.txt +++ b/testdata/diff/migrate/v5/plan.txt @@ -28,7 +28,7 @@ Tables: DDL to be executed: -------------------------------------------------- -DROP PROCEDURE IF EXISTS simple_salary_update(integer, integer); +DROP PROCEDURE IF EXISTS simple_salary_update(IN p_emp_no integer, IN p_amount integer); DROP TABLE IF EXISTS title CASCADE; diff --git a/testdata/dump/employee/pgschema.sql b/testdata/dump/employee/pgschema.sql index 80425b90..9afa95e4 100644 --- a/testdata/dump/employee/pgschema.sql +++ b/testdata/dump/employee/pgschema.sql @@ -189,8 +189,8 @@ $$; -- CREATE OR REPLACE PROCEDURE simple_salary_update( - p_emp_no integer, - p_amount integer + IN p_emp_no integer, + IN p_amount integer ) LANGUAGE plpgsql AS $$ diff --git a/testdata/include/expected_full_schema.sql b/testdata/include/expected_full_schema.sql index ec3d34cc..73e83e2c 100644 --- a/testdata/include/expected_full_schema.sql +++ b/testdata/include/expected_full_schema.sql @@ -197,8 +197,8 @@ $$; -- CREATE OR REPLACE PROCEDURE update_status( - user_id_param integer, - new_status text + IN user_id_param integer, + IN new_status text ) LANGUAGE sql AS $$ diff --git a/testdata/include/procedures/update_status.sql b/testdata/include/procedures/update_status.sql index a9d23ec1..f63137ed 100644 --- a/testdata/include/procedures/update_status.sql +++ b/testdata/include/procedures/update_status.sql @@ -3,8 +3,8 @@ -- CREATE OR REPLACE PROCEDURE update_status( - user_id_param integer, - new_status text + IN user_id_param integer, + IN new_status text ) LANGUAGE sql AS $$