This commit is contained in:
@@ -513,7 +513,13 @@ func RefineCreationDeletionFromUnion(ctx context.Context, dbConn *sqlx.DB, summa
|
||||
if _, err := SafeTableName(summaryTable); err != nil {
|
||||
return err
|
||||
}
|
||||
sql := fmt.Sprintf(`
|
||||
|
||||
driver := strings.ToLower(dbConn.DriverName())
|
||||
var sql string
|
||||
|
||||
switch driver {
|
||||
case "pgx", "postgres":
|
||||
sql = fmt.Sprintf(`
|
||||
WITH snapshots AS (
|
||||
%s
|
||||
), timeline AS (
|
||||
@@ -560,6 +566,84 @@ WHERE dst."Vcenter" = t."Vcenter"
|
||||
OR (dst."Name" IS NOT DISTINCT FROM t."Name")
|
||||
);
|
||||
`, unionQuery, summaryTable)
|
||||
default:
|
||||
// SQLite variant (no FROM in UPDATE, no IS NOT DISTINCT FROM). Uses positional args to avoid placeholder count issues.
|
||||
sql = fmt.Sprintf(`
|
||||
WITH snapshots AS (
|
||||
%[1]s
|
||||
), timeline AS (
|
||||
SELECT
|
||||
s."VmId",
|
||||
s."VmUuid",
|
||||
s."Name",
|
||||
s."Vcenter",
|
||||
MIN(NULLIF(s."CreationTime", 0)) AS any_creation,
|
||||
MIN(s."SnapshotTime") AS first_seen,
|
||||
MAX(s."SnapshotTime") AS last_seen
|
||||
FROM snapshots s
|
||||
GROUP BY s."VmId", s."VmUuid", s."Name", s."Vcenter"
|
||||
), enriched AS (
|
||||
SELECT
|
||||
tl.*,
|
||||
(
|
||||
SELECT MIN(s2."SnapshotTime")
|
||||
FROM snapshots s2
|
||||
WHERE s2."Vcenter" = tl."Vcenter"
|
||||
AND COALESCE(s2."VmId", '') = COALESCE(tl."VmId", '')
|
||||
AND s2."SnapshotTime" > tl.last_seen
|
||||
) AS first_after
|
||||
FROM timeline tl
|
||||
)
|
||||
UPDATE %[2]s
|
||||
SET
|
||||
"CreationTime" = COALESCE(
|
||||
(
|
||||
SELECT CASE
|
||||
WHEN t.any_creation IS NOT NULL AND t.any_creation > 0 AND COALESCE(NULLIF(%[2]s."CreationTime", 0), t.any_creation) > t.any_creation THEN t.any_creation
|
||||
WHEN t.any_creation IS NULL AND t.first_seen IS NOT NULL AND COALESCE(NULLIF(%[2]s."CreationTime", 0), t.first_seen) > t.first_seen THEN t.first_seen
|
||||
ELSE NULL
|
||||
END
|
||||
FROM enriched t
|
||||
WHERE %[2]s."Vcenter" = t."Vcenter" AND (
|
||||
(%[2]s."VmId" IS NOT NULL AND t."VmId" IS NOT NULL AND %[2]s."VmId" = t."VmId") OR
|
||||
(%[2]s."VmId" IS NULL AND t."VmId" IS NULL) OR
|
||||
(%[2]s."VmUuid" IS NOT NULL AND t."VmUuid" IS NOT NULL AND %[2]s."VmUuid" = t."VmUuid") OR
|
||||
(%[2]s."VmUuid" IS NULL AND t."VmUuid" IS NULL) OR
|
||||
(%[2]s."Name" IS NOT NULL AND t."Name" IS NOT NULL AND %[2]s."Name" = t."Name")
|
||||
)
|
||||
LIMIT 1
|
||||
),
|
||||
"CreationTime"
|
||||
),
|
||||
"DeletionTime" = COALESCE(
|
||||
(
|
||||
SELECT t.first_after
|
||||
FROM enriched t
|
||||
WHERE %[2]s."Vcenter" = t."Vcenter" AND (
|
||||
(%[2]s."VmId" IS NOT NULL AND t."VmId" IS NOT NULL AND %[2]s."VmId" = t."VmId") OR
|
||||
(%[2]s."VmId" IS NULL AND t."VmId" IS NULL) OR
|
||||
(%[2]s."VmUuid" IS NOT NULL AND t."VmUuid" IS NOT NULL AND %[2]s."VmUuid" = t."VmUuid") OR
|
||||
(%[2]s."VmUuid" IS NULL AND t."VmUuid" IS NULL) OR
|
||||
(%[2]s."Name" IS NOT NULL AND t."Name" IS NOT NULL AND %[2]s."Name" = t."Name")
|
||||
)
|
||||
AND t.first_after IS NOT NULL
|
||||
AND ("DeletionTime" IS NULL OR "DeletionTime" = 0 OR t.first_after < "DeletionTime")
|
||||
LIMIT 1
|
||||
),
|
||||
"DeletionTime"
|
||||
)
|
||||
WHERE EXISTS (
|
||||
SELECT 1 FROM enriched t
|
||||
WHERE %[2]s."Vcenter" = t."Vcenter" AND (
|
||||
(%[2]s."VmId" IS NOT NULL AND t."VmId" IS NOT NULL AND %[2]s."VmId" = t."VmId") OR
|
||||
(%[2]s."VmId" IS NULL AND t."VmId" IS NULL) OR
|
||||
(%[2]s."VmUuid" IS NOT NULL AND t."VmUuid" IS NOT NULL AND %[2]s."VmUuid" = t."VmUuid") OR
|
||||
(%[2]s."VmUuid" IS NULL AND t."VmUuid" IS NULL) OR
|
||||
(%[2]s."Name" IS NOT NULL AND t."Name" IS NOT NULL AND %[2]s."Name" = t."Name")
|
||||
)
|
||||
);
|
||||
`, unionQuery, summaryTable)
|
||||
}
|
||||
|
||||
_, err := dbConn.ExecContext(ctx, sql)
|
||||
return err
|
||||
|
||||
Reference in New Issue
Block a user