pub struct SqlEngine<P>{ /* private fields */ }Expand description
SQL execution engine built on top of the LLKV runtime.
§Examples
use std::sync::Arc;
use arrow::array::StringArray;
use llkv_sql::{RuntimeStatementResult, SqlEngine};
use llkv_storage::pager::MemPager;
let engine = SqlEngine::new(Arc::new(MemPager::default()));
let setup = r#"
CREATE TABLE users (id INT PRIMARY KEY, name TEXT);
INSERT INTO users (id, name) VALUES (1, 'Ada');
"#;
let results = engine.execute(setup).unwrap();
assert_eq!(results.len(), 2);
assert!(matches!(
results[0],
RuntimeStatementResult::CreateTable { ref table_name } if table_name == "users"
));
assert!(matches!(
results[1],
RuntimeStatementResult::Insert { rows_inserted, .. } if rows_inserted == 1
));
let batches = engine.sql("SELECT id, name FROM users ORDER BY id;").unwrap();
assert_eq!(batches.len(), 1);
let batch = &batches[0];
assert_eq!(batch.num_rows(), 1);
assert_eq!(batch.schema().field(1).name(), "name");
let names = batch
.column(1)
.as_any()
.downcast_ref::<StringArray>()
.unwrap();
assert_eq!(names.value(0), "Ada");Implementations§
Source§impl<P> SqlEngine<P>
impl<P> SqlEngine<P>
pub fn new(pager: Arc<P>) -> Self
pub fn with_context( context: Arc<RuntimeContext<P>>, default_nulls_first: bool, ) -> Self
Sourcepub fn session(&self) -> &RuntimeSession<P>
pub fn session(&self) -> &RuntimeSession<P>
Get a reference to the underlying session (for advanced use like error handling in test harnesses).
Sourcepub fn execute(&self, sql: &str) -> SqlResult<Vec<RuntimeStatementResult<P>>>
pub fn execute(&self, sql: &str) -> SqlResult<Vec<RuntimeStatementResult<P>>>
Execute one or more SQL statements and return their raw RuntimeStatementResults.
This method is the general-purpose entry point for running SQL against the engine when
you need to mix statement types (e.g. CREATE TABLE, INSERT, UPDATE, SELECT) or
when you care about per-statement status information. Statements are executed in the order
they appear in the input string, and the results vector mirrors that ordering.
For ad-hoc read queries where you only care about the resulting Arrow RecordBatches,
prefer SqlEngine::sql, which enforces a single SELECT statement and collects its
output for you. execute remains the right tool for schema migrations, transactional
scripts, or workflows that need to inspect the specific runtime response for each
statement.
Sourcepub fn sql(&self, sql: &str) -> SqlResult<Vec<RecordBatch>>
pub fn sql(&self, sql: &str) -> SqlResult<Vec<RecordBatch>>
Execute a single SELECT statement and return its results as Arrow RecordBatches.
The SQL passed to this method must contain exactly one statement, and that statement must
be a SELECT. Statements that modify data (e.g. INSERT) should be executed up front
using SqlEngine::execute before calling this helper.
§Examples
use std::sync::Arc;
use arrow::array::StringArray;
use llkv_sql::SqlEngine;
use llkv_storage::pager::MemPager;
let engine = SqlEngine::new(Arc::new(MemPager::default()));
let _ = engine
.execute(
"CREATE TABLE users (id INT PRIMARY KEY, name TEXT);\n \
INSERT INTO users (id, name) VALUES (1, 'Ada');",
)
.unwrap();
let batches = engine.sql("SELECT id, name FROM users ORDER BY id;").unwrap();
assert_eq!(batches.len(), 1);
let batch = &batches[0];
assert_eq!(batch.num_rows(), 1);
let names = batch
.column(1)
.as_any()
.downcast_ref::<StringArray>()
.unwrap();
assert_eq!(names.value(0), "Ada");Trait Implementations§
Auto Trait Implementations§
impl<P> !Freeze for SqlEngine<P>
impl<P> RefUnwindSafe for SqlEngine<P>where
P: RefUnwindSafe,
impl<P> Send for SqlEngine<P>
impl<P> Sync for SqlEngine<P>
impl<P> Unpin for SqlEngine<P>
impl<P> UnwindSafe for SqlEngine<P>where
P: RefUnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more