UNPKG

autosql

Version:

An auto-parser of JSON into SQL.

74 lines (73 loc) 3.74 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getUsingClause = getUsingClause; const groupings_1 = require("../../../config/groupings"); // Generates a `USING` clause for ALTER COLUMN to safely convert data types. function getUsingClause(columnName, oldType, newType) { if (oldType === newType) return `"${columnName}"`; // ✅ BOOLEAN → NUMERIC (1 for TRUE, 0 for FALSE) if ((0, groupings_1.isBoolean)(oldType) && (0, groupings_1.isNumeric)(newType)) { return `CASE WHEN "${columnName}" IS NULL THEN NULL WHEN "${columnName}" THEN 1 ELSE 0 END`; } // ✅ NUMERIC → BOOLEAN (1 = TRUE, everything else = FALSE) if ((0, groupings_1.isNumeric)(oldType) && (0, groupings_1.isBoolean)(newType)) { return `CASE WHEN "${columnName}" IS NULL THEN NULL WHEN "${columnName}" = 1 THEN TRUE ELSE FALSE END`; } // ✅ BOOLEAN → TEXT if ((0, groupings_1.isBoolean)(oldType) && (0, groupings_1.isText)(newType)) { return `CASE WHEN "${columnName}" IS NULL THEN NULL WHEN "${columnName}" THEN 'true' ELSE 'false' END`; } // ✅ TEXT → BOOLEAN (Handles common boolean text values) if ((0, groupings_1.isText)(oldType) && (0, groupings_1.isBoolean)(newType)) { return `CASE WHEN "${columnName}" IS NULL THEN NULL WHEN LOWER(TRIM("${columnName}")) IN ('true', 't', 'yes', 'y', '1', 'on') THEN TRUE WHEN LOWER(TRIM("${columnName}")) IN ('false', 'f', 'no', 'n', '0', 'off') THEN FALSE ELSE NULL END`; } // ✅ INTEGER → FLOATING POINT if ((0, groupings_1.isInteger)(oldType) && (0, groupings_1.isFloating)(newType)) { return `"${columnName}"::DECIMAL`; } // ✅ FLOATING POINT → INTEGER (ROUND to prevent precision loss) if ((0, groupings_1.isFloating)(oldType) && (0, groupings_1.isInteger)(newType)) { return `ROUND("${columnName}")::${newType}`; } // ✅ TEXT → NUMERIC (Handle empty strings safely) if ((0, groupings_1.isText)(oldType) && (0, groupings_1.isNumeric)(newType)) { return `NULLIF("${columnName}", '')::${newType}`; } // ✅ JSON → TEXT (Convert JSON to String) if (oldType === "json" && (0, groupings_1.isText)(newType)) { return `"${columnName}"::TEXT`; } // ✅ TEXT → JSON (Convert valid JSON strings) if ((0, groupings_1.isText)(oldType) && newType === "json") { return `"${columnName}"::JSONB`; } // ✅ TEXT → DATE/TIME (Use TO_TIMESTAMP for Datetime conversions) if ((0, groupings_1.isText)(oldType) && newType === "datetime") { return `TO_TIMESTAMP(NULLIF("${columnName}", ''), 'YYYY-MM-DD HH24:MI:SS')`; } if ((0, groupings_1.isText)(oldType) && newType === "datetimetz") { return `TO_TIMESTAMP(NULLIF("${columnName}", ''), 'YYYY-MM-DD HH24:MI:SS TZ')`; } if ((0, groupings_1.isText)(oldType) && newType === "date") { return `TO_DATE(NULLIF("${columnName}", ''), 'YYYY-MM-DD')`; } if ((0, groupings_1.isText)(oldType) && newType === "time") { return `TO_TIME(NULLIF("${columnName}", ''), 'HH24:MI:SS')`; } // ✅ DATE → TEXT (Format Date as String) if ((0, groupings_1.isDate)(oldType) && (0, groupings_1.isText)(newType)) { return `TO_CHAR("${columnName}", 'YYYY-MM-DD HH24:MI:SS')`; } // ✅ TIME → TEXT (Format Time as String) if ((0, groupings_1.isTime)(oldType) && (0, groupings_1.isText)(newType)) { return `TO_CHAR("${columnName}", 'HH24:MI:SS')`; } // ✅ Default: Simple Cast (with NULL handling) return `NULLIF("${columnName}", '')::${newType}`; }