| 1583 | } |
| 1584 | |
| 1585 | void TabletImpl::ProcessQuery(RpcController* ctrl, |
| 1586 | const fedb::api::QueryRequest* request, |
| 1587 | ::fedb::api::QueryResponse* response, |
| 1588 | butil::IOBuf* buf) { |
| 1589 | ::hybridse::base::Status status; |
| 1590 | if (request->is_batch()) { |
| 1591 | ::hybridse::vm::BatchRunSession session; |
| 1592 | if (request->is_debug()) { |
| 1593 | session.EnableDebug(); |
| 1594 | } |
| 1595 | { |
| 1596 | bool ok = |
| 1597 | engine_->Get(request->sql(), request->db(), session, status); |
| 1598 | if (!ok) { |
| 1599 | response->set_msg(status.msg); |
| 1600 | response->set_code(::fedb::base::kSQLCompileError); |
| 1601 | DLOG(WARNING) << "fail to compile sql " << request->sql(); |
| 1602 | return; |
| 1603 | } |
| 1604 | } |
| 1605 | |
| 1606 | auto table = session.Run(); |
| 1607 | if (!table) { |
| 1608 | DLOG(WARNING) << "fail to run sql " << request->sql(); |
| 1609 | response->set_code(::fedb::base::kSQLRunError); |
| 1610 | response->set_msg("fail to run sql"); |
| 1611 | return; |
| 1612 | } |
| 1613 | auto iter = table->GetIterator(); |
| 1614 | if (!iter) { |
| 1615 | response->set_schema(session.GetEncodedSchema()); |
| 1616 | response->set_byte_size(0); |
| 1617 | response->set_count(0); |
| 1618 | response->set_code(::fedb::base::kOk); |
| 1619 | return; |
| 1620 | } |
| 1621 | iter->SeekToFirst(); |
| 1622 | uint32_t byte_size = 0; |
| 1623 | uint32_t count = 0; |
| 1624 | while (iter->Valid()) { |
| 1625 | const ::hybridse::codec::Row& row = iter->GetValue(); |
| 1626 | if (byte_size > FLAGS_scan_max_bytes_size) { |
| 1627 | LOG(WARNING) << "reach the max byte size truncate result"; |
| 1628 | response->set_schema(session.GetEncodedSchema()); |
| 1629 | response->set_byte_size(byte_size); |
| 1630 | response->set_count(count); |
| 1631 | response->set_code(::fedb::base::kOk); |
| 1632 | return; |
| 1633 | } |
| 1634 | byte_size += row.size(); |
| 1635 | iter->Next(); |
| 1636 | buf->append(reinterpret_cast<void*>(row.buf()), row.size()); |
| 1637 | count += 1; |
| 1638 | } |
| 1639 | response->set_schema(session.GetEncodedSchema()); |
| 1640 | response->set_byte_size(byte_size); |
| 1641 | response->set_count(count); |
| 1642 | response->set_code(::fedb::base::kOk); |
nothing calls this directly
no test coverage detected