From 58b729d92eb851e8350c5184a8e17f1f191f08cc Mon Sep 17 00:00:00 2001 From: jovan sakovic Date: Sat, 14 Mar 2026 12:30:31 +0000 Subject: [PATCH] fix: query log not persisting to DuckLake - Pin QueryLogger's :memory: DuckDB to single connection (SetMaxOpenConns(1)) so ATTACH/CREATE TABLE state is shared with INSERT calls - Remove DEFAULT clauses from CREATE TABLE (unsupported by DuckLake) - Change normalized_query_hash from UBIGINT to BIGINT and cast to int64 (DuckDB Go driver rejects uint64 with high bit set as query params) - Fix set_option parameter name: schema_name -> schema --- server/querylog.go | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/server/querylog.go b/server/querylog.go index 15f7221..cf8eedd 100644 --- a/server/querylog.go +++ b/server/querylog.go @@ -63,6 +63,8 @@ func NewQueryLogger(cfg Config) (*QueryLogger, error) { if err != nil { return nil, fmt.Errorf("querylog: open duckdb: %w", err) } + // Pin to a single connection so ATTACH/CREATE TABLE state is shared with INSERT calls. + db.SetMaxOpenConns(1) // Set extension directory under DataDir so DuckDB doesn't rely on $HOME/.duckdb extDir := filepath.Join(cfg.DataDir, "extensions") @@ -123,9 +125,9 @@ func NewQueryLogger(cfg Config) (*QueryLogger, error) { query VARCHAR NOT NULL, transpiled_query VARCHAR, query_kind VARCHAR, - normalized_query_hash UBIGINT, - result_rows BIGINT DEFAULT 0, - written_rows BIGINT DEFAULT 0, + normalized_query_hash BIGINT, + result_rows BIGINT, + written_rows BIGINT, exception_code VARCHAR, exception VARCHAR, user_name VARCHAR NOT NULL, @@ -134,9 +136,9 @@ func NewQueryLogger(cfg Config) (*QueryLogger, error) { client_port INTEGER, application_name VARCHAR, pid INTEGER, - worker_id INTEGER DEFAULT -1, - is_transpiled BOOLEAN DEFAULT FALSE, - protocol VARCHAR DEFAULT 'simple' + worker_id INTEGER, + is_transpiled BOOLEAN, + protocol VARCHAR )` if _, err := db.Exec(createTable); err != nil { _ = db.Close() @@ -145,7 +147,7 @@ func NewQueryLogger(cfg Config) (*QueryLogger, error) { // Configure data inlining inlineStmt := fmt.Sprintf( - "CALL ducklake.set_option('data_inlining_row_limit', %d, schema_name => 'system', table_name => 'query_log')", + "CALL ducklake.set_option('data_inlining_row_limit', %d, schema => 'system', table_name => 'query_log')", cfg.QueryLog.DataInliningRowLimit) if _, err := db.Exec(inlineStmt); err != nil { slog.Warn("querylog: failed to set data_inlining_row_limit, continuing without it.", "error", err) @@ -257,7 +259,7 @@ func (ql *QueryLogger) flushBatch(batch []QueryLogEntry) { truncateQuery(e.Query), truncateNullableQuery(e.TranspiledQuery), e.QueryKind, - e.NormalizedHash, + int64(e.NormalizedHash), e.ResultRows, e.WrittenRows, e.ExceptionCode,