From 7168abd4223e174a52562fc7905405e151556e44 Mon Sep 17 00:00:00 2001 From: Joel Helbling Date: Wed, 31 Dec 2025 21:30:51 -0500 Subject: [PATCH] Quote SQL table identifiers to support special characters in event names MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Event names containing hyphens (e.g., "pageview_docs_getting-started") caused SQL syntax errors because the hyphen was interpreted as subtraction. This wraps all dynamic table names in double quotes to treat them as identifiers. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- model/events.go | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/model/events.go b/model/events.go index 92c90eb..05e0f8e 100644 --- a/model/events.go +++ b/model/events.go @@ -36,7 +36,7 @@ func InitEventDefs() error { func InitDailyEvent(event string) error { query := fmt.Sprintf(` - CREATE TABLE IF NOT EXISTS daily_%s ( + CREATE TABLE IF NOT EXISTS "daily_%s" ( time INTEGER PRIMARY KEY, count INTEGER );`, event) @@ -51,7 +51,7 @@ func InitDailyEvent(event string) error { func InitHourlyEvent(event string) error { query := fmt.Sprintf(` - CREATE TABLE IF NOT EXISTS hourly_%s ( + CREATE TABLE IF NOT EXISTS "hourly_%s" ( time INTEGER PRIMARY KEY, count INTEGER );`, event) @@ -66,7 +66,7 @@ func InitHourlyEvent(event string) error { func InitMinutelyEvent(event string) error { query := fmt.Sprintf(` - CREATE TABLE IF NOT EXISTS minutely_%s ( + CREATE TABLE IF NOT EXISTS "minutely_%s" ( time INTEGER PRIMARY KEY, count INTEGER );`, event) @@ -155,14 +155,14 @@ func DeleteEvents() { for _, event := range events { // fmt.Printf("%d: %s\n", i+1, event) cutoffTime := time.Now().Unix() - 3600 - query := fmt.Sprintf("delete from minutely_%s where time < ?", event) + query := fmt.Sprintf(`delete from "minutely_%s" where time < ?`, event) _, err := db.Exec(query, cutoffTime) if err != nil { panic(err) } cutoffTimeH := time.Now().Unix() - 3600*60 - query = fmt.Sprintf("delete from hourly_%s where time < ?", event) + query = fmt.Sprintf(`delete from "hourly_%s" where time < ?`, event) _, err = db.Exec(query, cutoffTimeH) if err != nil { panic(err) @@ -178,18 +178,18 @@ func SubmitDailyEvent(event string) { dayStart := time.Date(currentTime.Year(), currentTime.Month(), currentTime.Day(), 0, 0, 0, 0, currentTime.Location()) time := dayStart.Unix() - query := fmt.Sprintf("select * from daily_%s where time = ?", event) + query := fmt.Sprintf(`select * from "daily_%s" where time = ?`, event) row := db.QueryRow(query, time) var eventRow EventRow err := row.Scan(&eventRow.Time, &eventRow.Count) if err != nil { - query = fmt.Sprintf("insert into daily_%s (time, count) values (?, ?)", event) + query = fmt.Sprintf(`insert into "daily_%s" (time, count) values (?, ?)`, event) db.Exec(query, time, 1) } else { nextCount := eventRow.Count + 1 - query = fmt.Sprintf("update daily_%s set count = ? where time = ?", event) + query = fmt.Sprintf(`update "daily_%s" set count = ? where time = ?`, event) db.Exec(query, nextCount, time) } } @@ -200,18 +200,18 @@ func SubmitHourlyEvent(event string) { hourStart := currentTime.Truncate(time.Hour) time := hourStart.Unix() - query := fmt.Sprintf("select * from hourly_%s where time = ?", event) + query := fmt.Sprintf(`select * from "hourly_%s" where time = ?`, event) row := db.QueryRow(query, time) var eventRow EventRow err := row.Scan(&eventRow.Time, &eventRow.Count) if err != nil { - query = fmt.Sprintf("insert into hourly_%s (time, count) values (?, ?)", event) + query = fmt.Sprintf(`insert into "hourly_%s" (time, count) values (?, ?)`, event) db.Exec(query, time, 1) } else { nextCount := eventRow.Count + 1 - query = fmt.Sprintf("update hourly_%s set count = ? where time = ?", event) + query = fmt.Sprintf(`update "hourly_%s" set count = ? where time = ?`, event) db.Exec(query, nextCount, time) } @@ -223,18 +223,18 @@ func SubmitMinuteEvent(event string) { minuteStart := currentTime.Truncate(time.Minute) time := minuteStart.Unix() - query := fmt.Sprintf("select * from minutely_%s where time = ?", event) + query := fmt.Sprintf(`select * from "minutely_%s" where time = ?`, event) row := db.QueryRow(query, time) var eventRow EventRow err := row.Scan(&eventRow.Time, &eventRow.Count) if err != nil { - query = fmt.Sprintf("insert into minutely_%s (time, count) values (?, ?)", event) + query = fmt.Sprintf(`insert into "minutely_%s" (time, count) values (?, ?)`, event) db.Exec(query, time, 1) } else { nextCount := eventRow.Count + 1 - query = fmt.Sprintf("update minutely_%s set count = ? where time = ?", event) + query = fmt.Sprintf(`update "minutely_%s" set count = ? where time = ?`, event) db.Exec(query, nextCount, time) } @@ -249,7 +249,7 @@ func GetDailyStat(event string) *[60]TimeStat { fromTime := dayStart.AddDate(0, 0, -60) fromTimestamp := time.Date(fromTime.Year(), fromTime.Month(), fromTime.Day(), 0, 0, 0, 0, fromTime.Location()).Unix() - query := fmt.Sprintf("select * from daily_%s where time between ? and ?", event) + query := fmt.Sprintf(`select * from "daily_%s" where time between ? and ?`, event) rows, err := db.Query(query, fromTimestamp, toTimestamp) if err != nil { @@ -299,7 +299,7 @@ func GetHourlyStat(event string) *[60]TimeStat { fromTime := hourStart.Add(-60 * time.Hour) fromTimestamp := fromTime.Unix() - query := fmt.Sprintf("select * from hourly_%s where time between ? and ?", event) + query := fmt.Sprintf(`select * from "hourly_%s" where time between ? and ?`, event) rows, err := db.Query(query, fromTimestamp, toTimestamp) if err != nil { @@ -348,7 +348,7 @@ func GetMinuteStat(event string) *[60]TimeStat { fromTime := minuteStart.Add(-60 * time.Minute) fromTimestamp := fromTime.Unix() - query := fmt.Sprintf("select * from minutely_%s where time between ? and ?", event) + query := fmt.Sprintf(`select * from "minutely_%s" where time between ? and ?`, event) rows, err := db.Query(query, fromTimestamp, toTimestamp) if err != nil { @@ -419,7 +419,7 @@ func GetEventData(event string, period string, length int64) ([]TimeStat, error) toTimestamp = startTime.Unix() fromTimestamp := time.Date(fromTime.Year(), fromTime.Month(), fromTime.Day(), 0, 0, 0, 0, fromTime.Location()).Unix() - query := fmt.Sprintf("select * from %s_%s where time between ? and ?", periodPrefix, event) + query := fmt.Sprintf(`select * from "%s_%s" where time between ? and ?`, periodPrefix, event) rows, err := db.Query(query, fromTimestamp, toTimestamp) if err != nil { return statsArray, err