Skip to content

Commit

Permalink
feat!: new partition grammar - parser part (#3347)
Browse files Browse the repository at this point in the history
* parser part

Signed-off-by: Ruihang Xia <[email protected]>

* fix test in sql

Signed-off-by: Ruihang Xia <[email protected]>

* comment out and ignore some logic

Signed-off-by: Ruihang Xia <[email protected]>

* update sqlness cases

Signed-off-by: Ruihang Xia <[email protected]>

* update region migration test

Signed-off-by: Ruihang Xia <[email protected]>

* temporary disable region migration test

Signed-off-by: Ruihang Xia <[email protected]>

* allow dead code

Signed-off-by: Ruihang Xia <[email protected]>

* update integration test

Signed-off-by: Ruihang Xia <[email protected]>

---------

Signed-off-by: Ruihang Xia <[email protected]>
  • Loading branch information
waynexia authored Feb 27, 2024
1 parent 492a009 commit 3544c93
Show file tree
Hide file tree
Showing 17 changed files with 260 additions and 512 deletions.
33 changes: 8 additions & 25 deletions src/operator/src/statement/ddl.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,8 @@ use partition::partition::{PartitionBound, PartitionDef};
use regex::Regex;
use session::context::QueryContextRef;
use snafu::{ensure, IntoError, OptionExt, ResultExt};
use sql::ast::Value as SqlValue;
use sql::statements::alter::AlterTable;
use sql::statements::create::{CreateExternalTable, CreateTable, Partitions};
use sql::statements::sql_value_to_value;
use sql::MAXVALUE;
use table::dist_table::DistTable;
use table::metadata::{self, RawTableInfo, RawTableMeta, TableId, TableInfo, TableType};
use table::requests::{AlterKind, AlterTableRequest, TableOptions};
Expand All @@ -52,8 +49,8 @@ use crate::error::{
self, AlterExprToRequestSnafu, CatalogSnafu, ColumnDataTypeSnafu, ColumnNotFoundSnafu,
CreateLogicalTablesSnafu, CreateTableInfoSnafu, CreateTableWithMultiCatalogsSnafu,
CreateTableWithMultiSchemasSnafu, DeserializePartitionSnafu, EmptyCreateTableExprSnafu,
InvalidPartitionColumnsSnafu, InvalidTableNameSnafu, ParseSqlSnafu, Result,
SchemaNotFoundSnafu, TableAlreadyExistsSnafu, TableMetadataManagerSnafu, TableNotFoundSnafu,
InvalidPartitionColumnsSnafu, InvalidTableNameSnafu, Result, SchemaNotFoundSnafu,
TableAlreadyExistsSnafu, TableMetadataManagerSnafu, TableNotFoundSnafu,
UnrecognizedTableOptionSnafu,
};
use crate::expr_factory;
Expand Down Expand Up @@ -564,6 +561,7 @@ fn validate_partition_columns(
Ok(())
}

/// Parse partition statement [Partitions] into [MetaPartition] and partition columns.
fn parse_partitions(
create_table: &CreateTableExpr,
partitions: Option<Partitions>,
Expand Down Expand Up @@ -690,9 +688,9 @@ fn find_partition_entries(
create_table: &CreateTableExpr,
partitions: &Option<Partitions>,
partition_columns: &[String],
query_ctx: &QueryContextRef,
_query_ctx: &QueryContextRef,
) -> Result<Vec<Vec<PartitionBound>>> {
let entries = if let Some(partitions) = partitions {
let entries = if let Some(_partitions) = partitions {
let column_defs = partition_columns
.iter()
.map(|pc| {
Expand All @@ -714,24 +712,8 @@ fn find_partition_entries(
column_name_and_type.push((column_name, data_type));
}

let mut entries = Vec::with_capacity(partitions.entries.len());
for e in partitions.entries.iter() {
let mut values = Vec::with_capacity(e.value_list.len());
for (i, v) in e.value_list.iter().enumerate() {
// indexing is safe here because we have checked that "value_list" and "column_list" are matched in size
let (column_name, data_type) = &column_name_and_type[i];
let v = match v {
SqlValue::Number(n, _) if n == MAXVALUE => PartitionBound::MaxValue,
_ => PartitionBound::Value(
sql_value_to_value(column_name, data_type, v, Some(&query_ctx.timezone()))
.context(ParseSqlSnafu)?,
),
};
values.push(v);
}
entries.push(values);
}
entries
// TODO(ruihang): implement the partition value parser.
vec![vec![PartitionBound::MaxValue]]
} else {
vec![vec![PartitionBound::MaxValue]]
};
Expand Down Expand Up @@ -786,6 +768,7 @@ mod test {
}

#[tokio::test]
#[ignore = "TODO(ruihang): WIP new partition rule"]
async fn test_parse_partitions() {
common_telemetry::init_default_ut_logging();
let cases = [
Expand Down
30 changes: 4 additions & 26 deletions src/operator/src/statement/show.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,11 @@ use common_meta::table_name::TableName;
use common_query::Output;
use common_telemetry::tracing;
use partition::manager::PartitionInfo;
use partition::partition::PartitionBound;
use session::context::QueryContextRef;
use snafu::ResultExt;
use sql::ast::{Ident, Value as SqlValue};
use sql::statements::create::{PartitionEntry, Partitions};
use sql::ast::Ident;
use sql::statements::create::Partitions;
use sql::statements::show::{ShowDatabases, ShowTables, ShowVariables};
use sql::{statements, MAXVALUE};
use table::TableRef;

use crate::error::{self, ExecuteStatementSnafu, Result};
Expand Down Expand Up @@ -90,30 +88,10 @@ fn create_partitions_stmt(partitions: Vec<PartitionInfo>) -> Result<Option<Parti
.map(|name| name[..].into())
.collect();

let entries = partitions
.into_iter()
.map(|info| {
// Generated the partition name from id
let name = &format!("r{}", info.id.region_number());
let bounds = info.partition.partition_bounds();
let value_list = bounds
.iter()
.map(|b| match b {
PartitionBound::Value(v) => statements::value_to_sql_value(v)
.with_context(|_| error::ConvertSqlValueSnafu { value: v.clone() }),
PartitionBound::MaxValue => Ok(SqlValue::Number(MAXVALUE.to_string(), false)),
})
.collect::<Result<Vec<_>>>()?;

Ok(PartitionEntry {
name: name[..].into(),
value_list,
})
})
.collect::<Result<Vec<_>>>()?;
// TODO(ruihang): convert partition info back to partition expr

Ok(Some(Partitions {
column_list,
entries,
exprs: vec![],
}))
}
Loading

0 comments on commit 3544c93

Please sign in to comment.