Skip to content

Commit 7d88a89

Browse files
committed
refactor: stable kitesql
1 parent f3dfbef commit 7d88a89

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+1343
-1368
lines changed

Cargo.lock

Lines changed: 76 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
[package]
44
name = "kite_sql"
5-
version = "0.1.2"
5+
version = "0.1.3"
66
edition = "2021"
77
authors = ["Kould <kould2333@gmail.com>", "Xwg <loloxwg@gmail.com>"]
88
description = "SQL as a Function for Rust"
@@ -60,6 +60,8 @@ sqlparser = { version = "0.34", features = ["serde"] }
6060
thiserror = { version = "1" }
6161
typetag = { version = "0.2" }
6262
ulid = { version = "1", features = ["serde"] }
63+
genawaiter = { version = "0.99" }
64+
rand = { version = "0.8" }
6365

6466
# Feature: net
6567
async-trait = { version = "0.1", optional = true }

rust-toolchain

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
nightly-2024-10-10
1+
stable

src/db.rs

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,7 @@ use parking_lot::{RawRwLock, RwLock};
2828
use std::hash::RandomState;
2929
use std::marker::PhantomData;
3030
use std::mem;
31-
use std::ops::{Coroutine, CoroutineState};
3231
use std::path::PathBuf;
33-
use std::pin::Pin;
3432
use std::sync::atomic::AtomicUsize;
3533
use std::sync::Arc;
3634

@@ -434,32 +432,19 @@ impl<S: Storage> DBTransaction<'_, S> {
434432
pub struct TransactionIter<'a> {
435433
executor: Executor<'a>,
436434
schema: SchemaRef,
437-
is_over: bool,
438435
}
439436

440437
impl<'a> TransactionIter<'a> {
441438
fn new(schema: SchemaRef, executor: Executor<'a>) -> Self {
442-
Self {
443-
executor,
444-
schema,
445-
is_over: false,
446-
}
439+
Self { executor, schema }
447440
}
448441
}
449442

450443
impl Iterator for TransactionIter<'_> {
451444
type Item = Result<Tuple, DatabaseError>;
452445

453446
fn next(&mut self) -> Option<Self::Item> {
454-
if self.is_over {
455-
return None;
456-
}
457-
if let CoroutineState::Yielded(tuple) = Pin::new(&mut self.executor).resume(()) {
458-
Some(tuple)
459-
} else {
460-
self.is_over = true;
461-
None
462-
}
447+
self.executor.next()
463448
}
464449
}
465450

src/execution/ddl/add_column.rs

Lines changed: 64 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use crate::errors::DatabaseError;
2-
use crate::execution::{build_read, Executor, WriteExecutor};
2+
use crate::execution::{build_read, spawn_executor, Executor, WriteExecutor};
33
use crate::planner::LogicalPlan;
44
use crate::storage::{StatisticsMetaCache, TableCache, ViewCache};
55
use crate::types::index::{Index, IndexType};
@@ -9,9 +9,6 @@ use crate::types::value::DataValue;
99
use crate::{
1010
planner::operator::alter_table::add_column::AddColumnOperator, storage::Transaction, throw,
1111
};
12-
use std::ops::Coroutine;
13-
use std::ops::CoroutineState;
14-
use std::pin::Pin;
1512

1613
pub struct AddColumn {
1714
op: AddColumnOperator,
@@ -30,73 +27,83 @@ impl<'a, T: Transaction + 'a> WriteExecutor<'a, T> for AddColumn {
3027
cache: (&'a TableCache, &'a ViewCache, &'a StatisticsMetaCache),
3128
transaction: *mut T,
3229
) -> Executor<'a> {
33-
Box::new(
34-
#[coroutine]
35-
move || {
36-
let AddColumnOperator {
37-
table_name,
38-
column,
39-
if_not_exists,
40-
} = &self.op;
30+
spawn_executor(move |co| async move {
31+
let AddColumnOperator {
32+
table_name,
33+
column,
34+
if_not_exists,
35+
} = &self.op;
4136

42-
let mut unique_values = column.desc().is_unique().then(Vec::new);
43-
let mut tuples = Vec::new();
44-
let schema = self.input.output_schema();
45-
let mut types = Vec::with_capacity(schema.len() + 1);
37+
let mut unique_values = column.desc().is_unique().then(Vec::new);
38+
let mut tuples = Vec::new();
39+
let schema = self.input.output_schema();
40+
let mut types = Vec::with_capacity(schema.len() + 1);
4641

47-
for column_ref in schema.iter() {
48-
types.push(column_ref.datatype().clone());
49-
}
50-
types.push(column.datatype().clone());
42+
for column_ref in schema.iter() {
43+
types.push(column_ref.datatype().clone());
44+
}
45+
types.push(column.datatype().clone());
5146

52-
let mut coroutine = build_read(self.input, cache, transaction);
47+
let mut coroutine = build_read(self.input, cache, transaction);
5348

54-
while let CoroutineState::Yielded(tuple) = Pin::new(&mut coroutine).resume(()) {
55-
let mut tuple: Tuple = throw!(tuple);
49+
while let Some(tuple) = coroutine.next() {
50+
let mut tuple: Tuple = throw!(co, tuple);
5651

57-
if let Some(value) = throw!(column.default_value()) {
58-
if let Some(unique_values) = &mut unique_values {
59-
unique_values.push((
60-
throw!(tuple.pk.clone().ok_or(DatabaseError::PrimaryKeyNotFound)),
61-
value.clone(),
62-
));
63-
}
64-
tuple.values.push(value);
65-
} else {
66-
tuple.values.push(DataValue::Null);
52+
if let Some(value) = throw!(co, column.default_value()) {
53+
if let Some(unique_values) = &mut unique_values {
54+
unique_values.push((
55+
throw!(
56+
co,
57+
tuple.pk.clone().ok_or(DatabaseError::PrimaryKeyNotFound)
58+
),
59+
value.clone(),
60+
));
6761
}
68-
tuples.push(tuple);
62+
tuple.values.push(value);
63+
} else {
64+
tuple.values.push(DataValue::Null);
6965
}
70-
drop(coroutine);
66+
tuples.push(tuple);
67+
}
68+
drop(coroutine);
7169

72-
for tuple in tuples {
73-
throw!(unsafe { &mut (*transaction) }
74-
.append_tuple(table_name, tuple, &types, true));
75-
}
76-
let col_id = throw!(unsafe { &mut (*transaction) }.add_column(
70+
for tuple in tuples {
71+
throw!(
72+
co,
73+
unsafe { &mut (*transaction) }.append_tuple(table_name, tuple, &types, true)
74+
);
75+
}
76+
let col_id = throw!(
77+
co,
78+
unsafe { &mut (*transaction) }.add_column(
7779
cache.0,
7880
table_name,
7981
column,
8082
*if_not_exists
81-
));
83+
)
84+
);
8285

83-
// Unique Index
84-
if let (Some(unique_values), Some(unique_meta)) = (
85-
unique_values,
86-
throw!(unsafe { &mut (*transaction) }.table(cache.0, table_name.clone()))
87-
.and_then(|table| table.get_unique_index(&col_id))
88-
.cloned(),
89-
) {
90-
for (tuple_id, value) in unique_values {
91-
let index = Index::new(unique_meta.id, &value, IndexType::Unique);
92-
throw!(
93-
unsafe { &mut (*transaction) }.add_index(table_name, index, &tuple_id)
94-
);
95-
}
86+
// Unique Index
87+
if let (Some(unique_values), Some(unique_meta)) = (
88+
unique_values,
89+
throw!(
90+
co,
91+
unsafe { &mut (*transaction) }.table(cache.0, table_name.clone())
92+
)
93+
.and_then(|table| table.get_unique_index(&col_id))
94+
.cloned(),
95+
) {
96+
for (tuple_id, value) in unique_values {
97+
let index = Index::new(unique_meta.id, &value, IndexType::Unique);
98+
throw!(
99+
co,
100+
unsafe { &mut (*transaction) }.add_index(table_name, index, &tuple_id)
101+
);
96102
}
103+
}
97104

98-
yield Ok(TupleBuilder::build_result("1".to_string()));
99-
},
100-
)
105+
co.yield_(Ok(TupleBuilder::build_result("1".to_string())))
106+
.await;
107+
})
101108
}
102109
}

0 commit comments

Comments
 (0)