14
// RewriteSchemaStatements makes SQLite schemas catch values that would
15
// fail against SQL databases that enforce VARCHAR(n), such as Postgres and MySQL.
16
>
func (mdb *db) RewriteSchemaStatements(statements []string) []string {
schema_rewriter.go
17
>
rewritten := make([]string, len(statements))
18
>
for i, stmt := range statements {
19
>
rewritten[i] = addSchemaVarcharLengthChecks(stmt)
20
>
}
21
>
return rewritten
22
}
23
25
>
// Only CREATE TABLE statements can accept generated table constraints.
26
>
if !testSchemaCreateTablePattern.MatchString(stmt) {
27
return stmt
28
}
29
30
>
varcharColumns := testSchemaVarcharColumnPattern.FindAllStringSubmatch(stmt, -1)
schema_rewriter.go
31
>
if len(varcharColumns) == 0 {
32
return stmt
33
}
34
35
// Append table-level CHECK constraints instead of editing column definitions.
37
>
trimmedStmt = strings.TrimSuffix(trimmedStmt, ";")
38
>
trimmedStmt = strings.TrimSpace(trimmedStmt)
39
>
tableConstraintOffset := strings.LastIndex(trimmedStmt, ")")
40
>
if tableConstraintOffset < 0 {
41
return stmt
42
}
43
45
>
for _, column := range varcharColumns {
46
>
fmt.Fprintf(&constraints, ",\n\tCHECK(length(%s) <= %s)", column[1], column[2])
47
>
}
48
49
>
return stmt[:tableConstraintOffset] + constraints.String() + stmt[tableConstraintOffset:]
schema_rewriter.go
50
}