Escape the database path in the SQLite connection string (closes #518)
check / check (push) Canceled after 0s

SQLite reads a file: URI's path only up to the first ? or #, and
decodes %XX escapes in it. With a data directory such as
/srv/hooks#1, every database opened the one file /srv/hooks. The
connection string is now built with url.URL, which escapes the path,
and OmitHost keeps a relative path relative.

A test opens two databases in a directory whose name holds #, ? and %,
and checks through PRAGMA database_list that each opened its own file.

Model: opus-5-5
This commit is contained in:
2026-10-13 05:26:10 +00:00
parent c8efbd41d4
commit a2f6bc17f6
2 changed files with 62 additions and 1 deletions
+13 -1
View File
@@ -242,7 +242,19 @@ func SQLiteDSN(path, mode string) string {
)
q.Add("_pragma", "journal_mode(WAL)")
return "file:" + path + "?" + q.Encode()
// SQLite reads a file: URI's path only up to the first ? or #, and
// decodes %XX escapes in it, so url.URL escapes the path. OmitHost
// keeps a relative path as "file:data/x.db"; written
// "file://data/x.db", SQLite would reject "data" as the URI's
// authority.
dsn := url.URL{
Scheme: "file",
Path: path,
OmitHost: true,
RawQuery: q.Encode(),
}
return dsn.String()
}
// OpenSQLite opens the SQLite file at path with the service's