| 455 | } |
| 456 | |
| 457 | std::vector<std::shared_ptr<Statement>> ClientContext::parseQuery(std::string_view query) { |
| 458 | if (query.empty()) { |
| 459 | throw ConnectionException("Query is empty."); |
| 460 | } |
| 461 | std::vector<std::shared_ptr<Statement>> statements; |
| 462 | auto parserTimer = TimeMetric(true /*enable*/); |
| 463 | parserTimer.start(); |
| 464 | auto parsedStatements = Parser::parseQuery(query, localDatabase->getTransformerExtensions()); |
| 465 | parserTimer.stop(); |
| 466 | const auto avgParsingTime = parserTimer.getElapsedTimeMS() / parsedStatements.size() / 1.0; |
| 467 | StandaloneCallRewriter standaloneCallAnalyzer{this, parsedStatements.size() == 1}; |
| 468 | for (auto i = 0u; i < parsedStatements.size(); i++) { |
| 469 | auto rewriteQuery = standaloneCallAnalyzer.getRewriteQuery(*parsedStatements[i]); |
| 470 | if (rewriteQuery.empty()) { |
| 471 | parsedStatements[i]->setParsingTime(avgParsingTime); |
| 472 | statements.push_back(std::move(parsedStatements[i])); |
| 473 | } else { |
| 474 | parserTimer.start(); |
| 475 | auto rewrittenStatements = |
| 476 | Parser::parseQuery(rewriteQuery, localDatabase->getTransformerExtensions()); |
| 477 | parserTimer.stop(); |
| 478 | const auto avgRewriteParsingTime = |
| 479 | parserTimer.getElapsedTimeMS() / rewrittenStatements.size() / 1.0; |
| 480 | DASSERT(rewrittenStatements.size() >= 1); |
| 481 | for (auto j = 0u; j < rewrittenStatements.size() - 1; j++) { |
| 482 | rewrittenStatements[j]->setParsingTime(avgParsingTime + avgRewriteParsingTime); |
| 483 | rewrittenStatements[j]->setToInternal(); |
| 484 | statements.push_back(std::move(rewrittenStatements[j])); |
| 485 | } |
| 486 | auto lastRewrittenStatement = rewrittenStatements.back(); |
| 487 | lastRewrittenStatement->setParsingTime(avgParsingTime + avgRewriteParsingTime); |
| 488 | statements.push_back(std::move(lastRewrittenStatement)); |
| 489 | } |
| 490 | } |
| 491 | return statements; |
| 492 | } |
| 493 | |
| 494 | void ClientContext::validateTransaction(bool readOnly, bool requireTransaction) const { |
| 495 | if (!canExecuteWriteQuery() && !readOnly) { |
nothing calls this directly
no test coverage detected