uptrace / bun

SQL-first Golang ORM
https://bun.uptrace.dev
BSD 2-Clause "Simplified" License
3.47k stars 210 forks source link

Create temp table from select query #949

Open erstam opened 5 months ago

erstam commented 5 months ago

Using bun 1.1.16 here.

I am trying to use (bun.IDB).NewCreateTable().Temp().IfNotExists().ModelTableExpr("my_temp_table_name AS (?)", selectQuery).Exec(ctx)

(whatever is selectQuery, it is just a query using SELECT ...)

I would expect this call to render this query: CREATE TEMP TABLE IF NOT EXISTS my_temp_table_name AS (selectQuery) which at least on Postgres is supported: https://www.postgresql.org/docs/current/sql-createtable.html

Instead of rendering the query, the code panics: invalid memory address or nil pointer dereference

panic({0x22657e0, 0x2140aa0})
        src/runtime/panic.go:890 +0x262
github.com/uptrace/bun.(*CreateTableQuery).beforeCreateTableHook(0xc000405040, {0x28e94d8, 0xc000718050})
        github.com/uptrace/bun@v1.1.16/query_table_create.go:351 +0x58
github.com/uptrace/bun.(*CreateTableQuery).Exec(0xc000405040, {0x28e94d8, 0xc000718050}, {0x0, 0x0, 0x0})
        github.com/uptrace/bun@v1.1.16/query_table_create.go:325 +0x85
func (q *CreateTableQuery) beforeCreateTableHook(ctx context.Context) error {
    if hook, ok := q.table.ZeroIface.(BeforeCreateTableHook); ok {    // panic on this line because ZeroIface is nil
        if err := hook.BeforeCreateTable(ctx, q); err != nil {
            return err
        }
    }
    return nil
}

It panic because, I think, I am not specifying a "model", by calling the Model() function. However, when I do this, giving a "dummy" struct with zero field as the model, I instead get the following query:

CREATE TEMP TABLE IF NOT EXISTS my_temp_table_name AS (selectQuery) ()

Notice the empty () at the end of the query. It causes a syntax error on SQL.

Any idea on how I could solve this ? (besides executing a raw query if possible)