Repository navigation
Escape generated SQL identifiers - #17
Merged
Merged
Conversation
aarongable
reviewed
Jun 11, 2026
aarongable
left a comment
There was a problem hiding this comment.
Generally LGTM, with test nits. I'm not a database expert, and these quoting/escaping styles were surprising to me, but the changes here align with each database's documented escaping rules as far as I can tell.
jsha
approved these changes
Jun 11, 2026
aarongable
approved these changes
Jun 11, 2026
beautifulentropy
pushed a commit
that referenced
this pull request
Oct 2, 2026
Fix a schema-creation regression introduced by #17. That change quoted schema names in table references but left `CREATE SCHEMA` unquoted. For a schema named `MixedCase`, PostgreSQL creates the schema as `mixedcase`, then fails when the quoted table reference looks for `MixedCase`. Apply `Dialect.QuoteField` to the schema name in `TableMap.SqlForCreate` so `CREATE SCHEMA` and the following `CREATE TABLE` use the same identifier semantics. This also escapes embedded identifier delimiters in `CREATE SCHEMA`, addressing a remaining gap related to #16. Add regression cases for PostgreSQL double-quote escaping and MySQL backtick escaping. The regression fails before the fix and passes afterward. Validation passed with Go 1.27.1: `go test ./...`, `go test -race ./...`, `go vet ./...`, `go build ./...`, and `git diff --check`. Database integration suites also passed against PostgreSQL 17, MariaDB 10.5, and SQLite on the same source tree. Additional review checks covered `IF NOT EXISTS`, repeated creation, and PostgreSQL `LowercaseFields`.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Fixes #16.
This change escapes dialect-specific quote characters inside generated SQL
identifiers. SQLite and PostgreSQL identifiers now double embedded
"characters, and MySQL identifiers now double embedded backticks. Qualified table
names also quote schema components before concatenating them with table names.
The same quoting helpers are used for index DDL names. The regression coverage
checks DML generated from table metadata and DDL generated from index, schema,
and table metadata.
Verification
go test ./... -run '^(TestSqliteDialectEscapesIdentifierQuotes|TestQuotedTableNameCannotRewriteUpdateTarget|TestCreateIndexQuotesIdentifierMetadata|TestDropIndexQuotesIdentifierMetadata|TestMySQLDialect|TestPostgresDialect)$' -count=1 -vgo test ./... -count=1go build ./...git diff --cached --check