autosql
Version:
An auto-parser of JSON into SQL.
74 lines (73 loc) • 3.74 kB
JavaScript
"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}`;
}