(ctx *sql.Context, n sql.Node, conn *stdsql.Conn)
| 181 | func (b *DuckBuilder) executeExpressioner(ctx *sql.Context, n sql.Expressioner, conn *stdsql.Conn) (sql.RowIter, error) { |
| 182 | node := n.(sql.Node) |
| 183 | switch n.(type) { |
| 184 | case *plan.InsertInto: |
| 185 | return b.executeDML(ctx, node, conn) |
| 186 | case *plan.Update: |
| 187 | return b.executeDML(ctx, node, conn) |
| 188 | default: |
| 189 | return b.executeQuery(ctx, node, conn) |
| 190 | } |
| 191 | } |
| 192 | |
| 193 | func (b *DuckBuilder) executeQuery(ctx *sql.Context, n sql.Node, conn *stdsql.Conn) (sql.RowIter, error) { |
| 194 | ctx.GetLogger().Trace("Executing Query...") |
| 195 | |
| 196 | var ( |
| 197 | duckSQL string |
| 198 | err error |
| 199 | ) |
| 200 | |
| 201 | // Translate the MySQL query to a DuckDB query |
| 202 | switch n := n.(type) { |
| 203 | case *plan.ShowTables: |
| 204 | duckSQL = ctx.Query() |
| 205 | case *plan.ResolvedTable: |
| 206 | // SQLGlot cannot translate MySQL's `TABLE t` into DuckDB's `FROM t` - it produces `"table" AS t` instead. |
| 207 | duckSQL = `FROM ` + catalog.ConnectIdentifiersANSI(n.Database().Name(), n.Name()) |
| 208 | default: |
| 209 | duckSQL, err = transpiler.TranslateWithSQLGlot(queryForTranslation(ctx)) |
| 210 | } |
| 211 | if err != nil { |
| 212 | return nil, catalog.ErrTranspiler.New(err) |
| 213 | } |
| 214 | duckSQL = QueryForJSONScan(duckSQL, n.Schema()) |
| 215 | |
| 216 | if log := ctx.GetLogger(); log.Logger.IsLevelEnabled(logrus.TraceLevel) { |
| 217 | log.WithFields(logrus.Fields{ |
| 218 | "Query": ctx.Query(), |
| 219 | "DuckSQL": duckSQL, |
| 220 | }).Trace("Executing Query...") |
| 221 | } |
| 222 |
no test coverage detected