(
db: sql.Database,
explain_stage: ExplainStage,
explainee: str,
explain_options: list[ExplainOption],
explain_format: ExplainFormat,
)
| 451 | |
| 452 | |
| 453 | def explain( |
| 454 | db: sql.Database, |
| 455 | explain_stage: ExplainStage, |
| 456 | explainee: str, |
| 457 | explain_options: list[ExplainOption], |
| 458 | explain_format: ExplainFormat, |
| 459 | ) -> str: |
| 460 | explain_query = "\n".join( |
| 461 | line |
| 462 | for line in [ |
| 463 | f"EXPLAIN {explain_stage}", |
| 464 | f"WITH({', '.join(map(str, explain_options))})" if explain_options else "", |
| 465 | f"AS {explain_format} FOR", |
| 466 | explainee, |
| 467 | ] |
| 468 | if line != "" |
| 469 | ) |
| 470 | if explain_stage == ExplainStage.OPTIMIZER_TRACE: |
| 471 | return json.dumps( |
| 472 | { |
| 473 | "explainee": {"query": explainee}, |
| 474 | "list": [ |
| 475 | {"id": id, **entry} |
| 476 | for (id, entry) in enumerate(db.query_all(explain_query)) |
| 477 | ], |
| 478 | }, |
| 479 | indent=4, |
| 480 | ) |
| 481 | else: |
| 482 | return next(iter(db.query_one(explain_query).values())) |
| 483 | |
| 484 | |
| 485 | def explain_item(item_type: ItemType, fqname: str, replan: bool) -> str | None: |
no test coverage detected