From 4520b9ee8856c8d79c658c86ab8b10bc0046da38 Mon Sep 17 00:00:00 2001 From: tinkle-community Date: Thu, 1 Jan 2026 23:01:17 +0800 Subject: [PATCH] fix: convert INTEGER columns to BOOLEAN for PostgreSQL compatibility Fix type mismatch where Go bool fields couldn't be encoded into PostgreSQL int4 columns. Affects: reduce_only, close_position, price_protect (trader_orders), is_maker (trader_fills) --- store/order.go | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/store/order.go b/store/order.go index 4ae6ef7a..313f1f18 100644 --- a/store/order.go +++ b/store/order.go @@ -91,7 +91,21 @@ func (s *OrderStore) InitTables() error { s.db.Raw(`SELECT COUNT(*) FROM information_schema.tables WHERE table_name = 'trader_fills'`).Scan(&fillsExist) if ordersExist > 0 && fillsExist > 0 { - // Tables exist - just ensure indexes exist, skip AutoMigrate + // Tables exist - fix INTEGER columns to BOOLEAN (from earlier migrations) + // Need to: drop default -> change type -> set new default + boolColumns := []struct{ table, col string }{ + {"trader_orders", "reduce_only"}, + {"trader_orders", "close_position"}, + {"trader_orders", "price_protect"}, + {"trader_fills", "is_maker"}, + } + for _, c := range boolColumns { + s.db.Exec(fmt.Sprintf("ALTER TABLE %s ALTER COLUMN %s DROP DEFAULT", c.table, c.col)) + s.db.Exec(fmt.Sprintf("ALTER TABLE %s ALTER COLUMN %s TYPE BOOLEAN USING %s::int::boolean", c.table, c.col, c.col)) + s.db.Exec(fmt.Sprintf("ALTER TABLE %s ALTER COLUMN %s SET DEFAULT false", c.table, c.col)) + } + + // Ensure indexes exist s.db.Exec(`CREATE UNIQUE INDEX IF NOT EXISTS idx_orders_exchange_unique ON trader_orders(exchange_id, exchange_order_id)`) s.db.Exec(`CREATE UNIQUE INDEX IF NOT EXISTS idx_fills_exchange_unique ON trader_fills(exchange_id, exchange_trade_id)`) s.db.Exec(`CREATE INDEX IF NOT EXISTS idx_orders_trader_id ON trader_orders(trader_id)`)