syntax = "proto3";
package mongreldb.v1;
import "common.proto";
service QueryService {
rpc Prepare(PrepareRequest) returns (PrepareResponse);
rpc Execute(ExecuteRequest) returns (ExecuteResponse);
rpc ExecuteStream(ExecuteRequest) returns (stream ArrowFrame);
rpc CancelQuery(CancelQueryRequest) returns (CancelQueryResponse);
rpc GetQueryStatus(GetQueryStatusRequest) returns (QueryStatusResponse);
}
message PrepareRequest {
RequestContext context = 1;
bytes session_id = 2;
string sql = 3;
}
message PrepareResponse {
uint64 statement_id = 1;
uint64 schema_version = 2;
}
message ExecuteRequest {
RequestContext context = 1;
bytes session_id = 2;
bytes query_id = 3;
oneof command {
string sql = 4;
uint64 prepared_statement_id = 5;
bytes admin_command = 6;
}
repeated bytes parameters = 7;
}
// P0.6: durable write outcome for safe lost-response recovery.
message DurableOutcome {
bool committed = 1;
uint64 committed_statements = 2;
// 16-byte big-endian HLC, or empty when no commit timestamp is available.
bytes last_commit_hlc = 3;
optional uint64 first_commit_statement_index = 4;
optional uint64 last_commit_statement_index = 5;
uint64 completed_statements = 6;
uint64 current_statement_index = 7;
string terminal_state = 8;
string serialization_state = 9;
// Optional legacy epoch; absence means "no epoch" (never use 0 as missing).
optional uint64 last_commit_epoch = 10;
}
enum CancelOutcome {
CANCEL_OUTCOME_UNSPECIFIED = 0;
ACCEPTED = 1;
ALREADY_CANCELLING = 2;
TOO_LATE = 3;
ALREADY_FINISHED = 4;
NOT_FOUND = 5;
PRE_CANCELLED = 6;
}
message ExecuteResponse {
bytes query_id = 1;
uint64 rows_affected = 2;
repeated ArrowFrame frames = 3;
bool idempotency_replayed = 4;
bool committed = 5;
uint64 commit_epoch = 6;
bytes original_query_id = 7;
DurableOutcome durable = 8;
}
message CancelQueryRequest {
RequestContext context = 1;
bytes query_id = 2;
bytes session_id = 3;
}
message CancelQueryResponse {
CancelOutcome outcome = 1;
DurableOutcome durable = 2;
}
message GetQueryStatusRequest {
RequestContext context = 1;
bytes query_id = 2;
bytes session_id = 3;
}
enum QueryPhase {
QUERY_PHASE_UNSPECIFIED = 0;
QUERY_PHASE_QUEUED = 1;
QUERY_PHASE_PLANNING = 2;
QUERY_PHASE_EXECUTING = 3;
QUERY_PHASE_SERIALIZING = 4;
QUERY_PHASE_COMPLETED = 5;
QUERY_PHASE_FAILED = 6;
QUERY_PHASE_CANCELLED = 7;
}
message QueryStatusResponse {
bytes query_id = 1;
QueryPhase phase = 2;
ErrorDetail error = 3;
DurableOutcome durable = 4;
}