Skip to content

Commit 71c6295

Browse files
authored
Support text column creation (#77)
1 parent ce2d04c commit 71c6295

File tree

9 files changed

+47
-5
lines changed

9 files changed

+47
-5
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ cargo run
1717
```
1818
test command
1919
```sql
20-
create table t1 (a int, b int);
20+
create table t1 (a int primary key, b int);
2121

2222
insert into t1 (a, b) values (1, 1), (5, 3), (6, 2);
2323

src/catalog/column.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ pub struct ColumnCatalog {
1616
pub nullable: bool,
1717
pub desc: ColumnDesc,
1818
pub ref_expr: Option<ScalarExpression>,
19+
// absoulte file path, used to store text content
20+
pub text_files: Vec<String>,
21+
pub deleted_text_files: Vec<String>,
1922
}
2023

2124
impl ColumnCatalog {
@@ -32,6 +35,8 @@ impl ColumnCatalog {
3235
nullable,
3336
desc: column_desc,
3437
ref_expr,
38+
text_files: Vec::new(),
39+
deleted_text_files: Vec::new(),
3540
}
3641
}
3742

@@ -43,6 +48,8 @@ impl ColumnCatalog {
4348
nullable: false,
4449
desc: ColumnDesc::new(LogicalType::Varchar(None), false, false),
4550
ref_expr: None,
51+
text_files: Vec::new(),
52+
deleted_text_files: Vec::new(),
4653
}
4754
}
4855

src/expression/evaluator.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use lazy_static::lazy_static;
88
use std::sync::Arc;
99

1010
lazy_static! {
11-
static ref NULL_VALUE: ValueRef = { Arc::new(DataValue::Null) };
11+
static ref NULL_VALUE: ValueRef = Arc::new(DataValue::Null);
1212
}
1313

1414
impl ScalarExpression {

src/expression/simplify.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -728,6 +728,8 @@ mod test {
728728
is_unique: false,
729729
},
730730
ref_expr: None,
731+
text_files: Vec::new(),
732+
deleted_text_files: Vec::new(),
731733
});
732734
let val_1 = Arc::new(DataValue::Int32(Some(1)));
733735

src/optimizer/rule/simplification.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,8 @@ mod test {
147147
is_unique: false,
148148
},
149149
ref_expr: None,
150+
text_files: Vec::new(),
151+
deleted_text_files: Vec::new(),
150152
};
151153
let c2_col = ColumnCatalog {
152154
id: Some(1),
@@ -159,6 +161,8 @@ mod test {
159161
is_unique: true,
160162
},
161163
ref_expr: None,
164+
text_files: Vec::new(),
165+
deleted_text_files: Vec::new(),
162166
};
163167

164168
// -(c1 + 1) > c2 => c1 < -c2 - 1

src/storage/table_codec.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use lazy_static::lazy_static;
88
const BOUND_MIN_TAG: u8 = 0;
99
const BOUND_MAX_TAG: u8 = 1;
1010
lazy_static! {
11-
static ref ROOT_BYTES: Vec<u8> = { b"Root".to_vec() };
11+
static ref ROOT_BYTES: Vec<u8> = b"Root".to_vec();
1212
}
1313

1414
#[derive(Clone)]

src/types/mod.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ pub enum LogicalType {
3636
Float,
3737
Double,
3838
Varchar(Option<u32>),
39+
Text,
3940
Date,
4041
DateTime,
4142
// decimal (precision, scale)
@@ -96,6 +97,7 @@ impl LogicalType {
9697
LogicalType::Double => Some(8),
9798
/// Note: The non-fixed length type's raw_len is None e.g. Varchar
9899
LogicalType::Varchar(_) => None,
100+
LogicalType::Text => None,
99101
LogicalType::Decimal(_, _) => Some(16),
100102
LogicalType::Date => Some(4),
101103
LogicalType::DateTime => Some(8),
@@ -294,6 +296,7 @@ impl LogicalType {
294296
LogicalType::Float => matches!(to, LogicalType::Double),
295297
LogicalType::Double => false,
296298
LogicalType::Varchar(_) => false,
299+
LogicalType::Text => false,
297300
LogicalType::Date => matches!(to, LogicalType::DateTime | LogicalType::Varchar(_)),
298301
LogicalType::DateTime => matches!(to, LogicalType::Date | LogicalType::Varchar(_)),
299302
LogicalType::Decimal(_, _) => false,
@@ -310,6 +313,7 @@ impl TryFrom<sqlparser::ast::DataType> for LogicalType {
310313
sqlparser::ast::DataType::Char(len) | sqlparser::ast::DataType::Varchar(len) => {
311314
Ok(LogicalType::Varchar(len.map(|len| len.length as u32)))
312315
}
316+
sqlparser::ast::DataType::Text => Ok(LogicalType::Text),
313317
sqlparser::ast::DataType::Float(_) => Ok(LogicalType::Float),
314318
sqlparser::ast::DataType::Double => Ok(LogicalType::Double),
315319
sqlparser::ast::DataType::TinyInt(_) => Ok(LogicalType::Tinyint),

src/types/value.rs

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use serde::{Deserialize, Serialize};
1818
use super::LogicalType;
1919

2020
lazy_static! {
21-
static ref UNIX_DATETIME: NaiveDateTime = { NaiveDateTime::from_timestamp_opt(0, 0).unwrap() };
21+
static ref UNIX_DATETIME: NaiveDateTime = NaiveDateTime::from_timestamp_opt(0, 0).unwrap();
2222
}
2323

2424
pub const DATE_FMT: &str = "%Y-%m-%d";
@@ -329,6 +329,7 @@ impl DataValue {
329329
LogicalType::Float => DataValue::Float32(None),
330330
LogicalType::Double => DataValue::Float64(None),
331331
LogicalType::Varchar(_) => DataValue::Utf8(None),
332+
LogicalType::Text => DataValue::Utf8(None),
332333
LogicalType::Date => DataValue::Date32(None),
333334
LogicalType::DateTime => DataValue::Date64(None),
334335
LogicalType::Decimal(_, _) => DataValue::Decimal(None),
@@ -351,6 +352,7 @@ impl DataValue {
351352
LogicalType::Float => DataValue::Float32(Some(0.0)),
352353
LogicalType::Double => DataValue::Float64(Some(0.0)),
353354
LogicalType::Varchar(_) => DataValue::Utf8(Some("".to_string())),
355+
LogicalType::Text => DataValue::Utf8(Some("".to_string())),
354356
LogicalType::Date => DataValue::Date32(Some(UNIX_DATETIME.num_days_from_ce())),
355357
LogicalType::DateTime => DataValue::Date64(Some(UNIX_DATETIME.timestamp())),
356358
LogicalType::Decimal(_, _) => DataValue::Decimal(Some(Decimal::new(0, 0))),
@@ -421,6 +423,9 @@ impl DataValue {
421423
LogicalType::Varchar(_) => DataValue::Utf8(
422424
(!bytes.is_empty()).then(|| String::from_utf8(bytes.to_owned()).unwrap()),
423425
),
426+
LogicalType::Text => DataValue::Utf8(
427+
(!bytes.is_empty()).then(|| String::from_utf8(bytes.to_owned()).unwrap()),
428+
),
424429
LogicalType::Date => {
425430
DataValue::Date32((!bytes.is_empty()).then(|| i32::decode_fixed(bytes)))
426431
}
@@ -594,6 +599,7 @@ impl DataValue {
594599
LogicalType::Float => Ok(DataValue::Float32(None)),
595600
LogicalType::Double => Ok(DataValue::Float64(None)),
596601
LogicalType::Varchar(_) => Ok(DataValue::Utf8(None)),
602+
LogicalType::Text => Ok(DataValue::Utf8(None)),
597603
LogicalType::Date => Ok(DataValue::Date32(None)),
598604
LogicalType::DateTime => Ok(DataValue::Date64(None)),
599605
LogicalType::Decimal(_, _) => Ok(DataValue::Decimal(None)),
@@ -612,13 +618,15 @@ impl DataValue {
612618
LogicalType::Float => Ok(DataValue::Float32(value.map(|v| v.into()))),
613619
LogicalType::Double => Ok(DataValue::Float64(value.map(|v| v.into()))),
614620
LogicalType::Varchar(len) => varchar_cast!(value, len),
621+
LogicalType::Text => Ok(DataValue::Utf8(value.map(|v| format!("{v}")))),
615622
_ => Err(TypeError::CastFail),
616623
},
617624
DataValue::Float32(value) => match to {
618625
LogicalType::SqlNull => Ok(DataValue::Null),
619626
LogicalType::Float => Ok(DataValue::Float32(value)),
620627
LogicalType::Double => Ok(DataValue::Float64(value.map(|v| v.into()))),
621628
LogicalType::Varchar(len) => varchar_cast!(value, len),
629+
LogicalType::Text => Ok(DataValue::Utf8(value.map(|v| format!("{v}")))),
622630
LogicalType::Decimal(_, option) => Ok(DataValue::Decimal(
623631
value
624632
.map(|v| {
@@ -635,6 +643,7 @@ impl DataValue {
635643
LogicalType::SqlNull => Ok(DataValue::Null),
636644
LogicalType::Double => Ok(DataValue::Float64(value)),
637645
LogicalType::Varchar(len) => varchar_cast!(value, len),
646+
LogicalType::Text => Ok(DataValue::Utf8(value.map(|v| format!("{v}")))),
638647
LogicalType::Decimal(_, option) => Ok(DataValue::Decimal(
639648
value
640649
.map(|v| {
@@ -668,6 +677,7 @@ impl DataValue {
668677
LogicalType::Float => Ok(DataValue::Float32(value.map(|v| v.into()))),
669678
LogicalType::Double => Ok(DataValue::Float64(value.map(|v| v.into()))),
670679
LogicalType::Varchar(len) => varchar_cast!(value, len),
680+
LogicalType::Text => Ok(DataValue::Utf8(value.map(|v| format!("{v}")))),
671681
LogicalType::Decimal(_, option) => Ok(DataValue::Decimal(value.map(|v| {
672682
let mut decimal = Decimal::from(v);
673683
Self::decimal_round_i(option, &mut decimal);
@@ -696,6 +706,7 @@ impl DataValue {
696706
LogicalType::Float => Ok(DataValue::Float32(value.map(|v| v.into()))),
697707
LogicalType::Double => Ok(DataValue::Float64(value.map(|v| v.into()))),
698708
LogicalType::Varchar(len) => varchar_cast!(value, len),
709+
LogicalType::Text => Ok(DataValue::Utf8(value.map(|v| format!("{v}")))),
699710
LogicalType::Decimal(_, option) => Ok(DataValue::Decimal(value.map(|v| {
700711
let mut decimal = Decimal::from(v);
701712
Self::decimal_round_i(option, &mut decimal);
@@ -722,6 +733,7 @@ impl DataValue {
722733
LogicalType::Bigint => Ok(DataValue::Int64(value.map(|v| v.into()))),
723734
LogicalType::Double => Ok(DataValue::Float64(value.map(|v| v.into()))),
724735
LogicalType::Varchar(len) => varchar_cast!(value, len),
736+
LogicalType::Text => Ok(DataValue::Utf8(value.map(|v| format!("{v}")))),
725737
LogicalType::Decimal(_, option) => Ok(DataValue::Decimal(value.map(|v| {
726738
let mut decimal = Decimal::from(v);
727739
Self::decimal_round_i(option, &mut decimal);
@@ -746,6 +758,7 @@ impl DataValue {
746758
)),
747759
LogicalType::Bigint => Ok(DataValue::Int64(value.map(|v| v.into()))),
748760
LogicalType::Varchar(len) => varchar_cast!(value, len),
761+
LogicalType::Text => Ok(DataValue::Utf8(value.map(|v| format!("{v}")))),
749762
LogicalType::Decimal(_, option) => Ok(DataValue::Decimal(value.map(|v| {
750763
let mut decimal = Decimal::from(v);
751764
Self::decimal_round_i(option, &mut decimal);
@@ -766,6 +779,7 @@ impl DataValue {
766779
LogicalType::Float => Ok(DataValue::Float32(value.map(|v| v.into()))),
767780
LogicalType::Double => Ok(DataValue::Float64(value.map(|v| v.into()))),
768781
LogicalType::Varchar(len) => varchar_cast!(value, len),
782+
LogicalType::Text => Ok(DataValue::Utf8(value.map(|v| format!("{v}")))),
769783
LogicalType::Decimal(_, option) => Ok(DataValue::Decimal(value.map(|v| {
770784
let mut decimal = Decimal::from(v);
771785
Self::decimal_round_i(option, &mut decimal);
@@ -784,6 +798,7 @@ impl DataValue {
784798
LogicalType::Float => Ok(DataValue::Float32(value.map(|v| v.into()))),
785799
LogicalType::Double => Ok(DataValue::Float64(value.map(|v| v.into()))),
786800
LogicalType::Varchar(len) => varchar_cast!(value, len),
801+
LogicalType::Text => Ok(DataValue::Utf8(value.map(|v| format!("{v}")))),
787802
LogicalType::Decimal(_, option) => Ok(DataValue::Decimal(value.map(|v| {
788803
let mut decimal = Decimal::from(v);
789804
Self::decimal_round_i(option, &mut decimal);
@@ -799,6 +814,7 @@ impl DataValue {
799814
LogicalType::UBigint => Ok(DataValue::UInt64(value.map(|v| v.into()))),
800815
LogicalType::Double => Ok(DataValue::Float64(value.map(|v| v.into()))),
801816
LogicalType::Varchar(len) => varchar_cast!(value, len),
817+
LogicalType::Text => Ok(DataValue::Utf8(value.map(|v| format!("{v}")))),
802818
LogicalType::Decimal(_, option) => Ok(DataValue::Decimal(value.map(|v| {
803819
let mut decimal = Decimal::from(v);
804820
Self::decimal_round_i(option, &mut decimal);
@@ -811,6 +827,7 @@ impl DataValue {
811827
LogicalType::SqlNull => Ok(DataValue::Null),
812828
LogicalType::UBigint => Ok(DataValue::UInt64(value.map(|v| v.into()))),
813829
LogicalType::Varchar(len) => varchar_cast!(value, len),
830+
LogicalType::Text => Ok(DataValue::Utf8(value.map(|v| format!("{v}")))),
814831
LogicalType::Decimal(_, option) => Ok(DataValue::Decimal(value.map(|v| {
815832
let mut decimal = Decimal::from(v);
816833
Self::decimal_round_i(option, &mut decimal);
@@ -856,6 +873,7 @@ impl DataValue {
856873
value.map(|v| f64::from_str(&v)).transpose()?,
857874
)),
858875
LogicalType::Varchar(len) => varchar_cast!(value, len),
876+
LogicalType::Text => Ok(DataValue::Utf8(value.map(|v| format!("{v}")))),
859877
LogicalType::Date => {
860878
let option = value
861879
.map(|v| {
@@ -887,6 +905,9 @@ impl DataValue {
887905
DataValue::Date32(value) => match to {
888906
LogicalType::SqlNull => Ok(DataValue::Null),
889907
LogicalType::Varchar(len) => varchar_cast!(Self::format_date(value), len),
908+
LogicalType::Text => Ok(DataValue::Utf8(
909+
Self::format_date(value).map(|v| format!("{v}")),
910+
)),
890911
LogicalType::Date => Ok(DataValue::Date32(value)),
891912
LogicalType::DateTime => {
892913
let option = value.and_then(|v| {
@@ -902,6 +923,9 @@ impl DataValue {
902923
DataValue::Date64(value) => match to {
903924
LogicalType::SqlNull => Ok(DataValue::Null),
904925
LogicalType::Varchar(len) => varchar_cast!(Self::format_datetime(value), len),
926+
LogicalType::Text => Ok(DataValue::Utf8(
927+
Self::format_datetime(value).map(|v| format!("{v}")),
928+
)),
905929
LogicalType::Date => {
906930
let option = value.and_then(|v| {
907931
NaiveDateTime::from_timestamp_opt(v, 0)
@@ -917,6 +941,7 @@ impl DataValue {
917941
LogicalType::SqlNull => Ok(DataValue::Null),
918942
LogicalType::Decimal(_, _) => Ok(DataValue::Decimal(value)),
919943
LogicalType::Varchar(len) => varchar_cast!(value, len),
944+
LogicalType::Text => Ok(DataValue::Utf8(value.map(|v| format!("{v}")))),
920945
_ => Err(TypeError::CastFail),
921946
},
922947
}

tests/slt/create.slt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
statement ok
2-
create table t(id int primary key, v1 int, v2 int, v3 int)
2+
create table t(id int primary key, v1 int, v2 int, v3 text)

0 commit comments

Comments
 (0)