(ctx context.Context, c *mysql.Conn, query string, parsed tree.Statement, stmt *duckdb.Stmt, vars []any, resultFormatCodes []int16, mode QueryMode, queryExec QueryExecutor, callback func(*Result) error)
| 312 | } |
| 313 | var tag string |
| 314 | err = conn.Raw(func(driverConn any) error { |
| 315 | c := driverConn.(*duckdb.Conn) |
| 316 | s, err := c.PrepareContext(sqlCtx, query) |
| 317 | if err != nil { |
| 318 | return err |
| 319 | } |
| 320 | defer s.Close() |
| 321 | stmt := s.(*duckdb.Stmt) |
| 322 | tag = GetStatementTag(stmt) |
| 323 | return nil |
| 324 | }) |
| 325 | return tag, err |
| 326 | } |
| 327 | |
| 328 | var queryLoggingRegex = regexp.MustCompile(`[\r\n\t ]+`) |
| 329 | |
| 330 | func (h *DuckHandler) doQuery(ctx context.Context, c *mysql.Conn, query string, auditQuery string, parsed tree.Statement, stmt *duckdb.Stmt, vars []any, resultFormatCodes []int16, mode QueryMode, queryExec QueryExecutor, callback func(*Result) error) (returnErr error) { |
| 331 | if auditQuery != "" { |
| 332 | audit := backend.NewQueryAudit(c, "postgres", auditQuery) |
| 333 | originalCallback := callback |
| 334 | callback = func(res *Result) error { |
| 335 | if err := originalCallback(res); err != nil { |
| 336 | return err |
| 337 | } |
| 338 | audit.AddRows(len(res.Rows)) |
| 339 | return nil |
| 340 | } |
| 341 | defer func() { |
| 342 | audit.Complete(returnErr) |
| 343 | }() |
| 344 | } |
| 345 | |
| 346 | sqlCtx, err := h.sm.NewContextWithQuery(ctx, c, query) |
| 347 | if err != nil { |
| 348 | return err |
| 349 | } |
| 350 | sqlCtx.GetLogger().WithFields(logrus.Fields{ |
| 351 | "query": query, |
| 352 | "protocol": "postgres", |
| 353 | }).Trace("doQuery") |
| 354 | |
| 355 | start := time.Now() |
| 356 | var queryStrToLog string |
| 357 | if h.encodeLoggedQuery { |
| 358 | queryStrToLog = base64.StdEncoding.EncodeToString([]byte(query)) |
| 359 | } else if logrus.IsLevelEnabled(logrus.DebugLevel) { |
| 360 | // this is expensive, so skip this unless we're logging at DEBUG level |
| 361 | queryStrToLog = string(queryLoggingRegex.ReplaceAll([]byte(query), []byte(" "))) |
| 362 | } |
| 363 | |
| 364 | if queryStrToLog != "" { |
| 365 | sqlCtx.SetLogger(sqlCtx.GetLogger().WithField("query", queryStrToLog)) |
| 366 | } |
| 367 | sqlCtx.GetLogger().Debugf("Starting query") |
| 368 | sqlCtx.GetLogger().Tracef("beginning execution") |
| 369 | |
| 370 | oCtx := ctx |
| 371 |
no test coverage detected