Skip to content

Commit

Permalink
chore: add current_timestamp function (databendlabs#13751)
Browse files Browse the repository at this point in the history
* add current_timestamp function

* chore: add current_timestamp function

* chore: add current_timestamp function

* fix test fail

* fix test fail

* fix test fail

* fix clickhouse test fail
  • Loading branch information
lichuang authored Nov 25, 2023
1 parent 08160c3 commit adf6e1a
Show file tree
Hide file tree
Showing 15 changed files with 40 additions and 36 deletions.
2 changes: 1 addition & 1 deletion src/query/ast/src/parser/token.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1192,7 +1192,7 @@ impl TokenKind {
// | TokenKind::CURRENT_DATE
// | TokenKind::CURRENT_ROLE
// | TokenKind::CURRENT_TIME
| TokenKind::CURRENT_TIMESTAMP
// | TokenKind::CURRENT_TIMESTAMP
// | TokenKind::CURRENT_USER
// | TokenKind::DEC
// | TokenKind::DECIMAL
Expand Down
2 changes: 2 additions & 0 deletions src/query/functions/src/scalars/datetime.rs
Original file line number Diff line number Diff line change
Expand Up @@ -829,6 +829,8 @@ impl_register_arith_functions!(register_add_functions, "add", unsigned_ident);
impl_register_arith_functions!(register_sub_functions, "subtract", signed_ident);

fn register_real_time_functions(registry: &mut FunctionRegistry) {
registry.register_aliases("now", &["current_timestamp"]);

registry.properties.insert(
"now".to_string(),
FunctionProperty::default().non_deterministic(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ bitmap_and_not -> bitmap_not
bitmap_cardinality -> bitmap_count
ceiling -> ceil
character_length -> char_length
current_timestamp -> now
date_format -> to_string
intdiv -> div
ipv4_num_to_string -> inet_ntoa
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -354,15 +354,15 @@ impl MergeIntoInterpreter {
let mut type_checker = {
let allow_pushdown = false;
let forbid_udf = true;
TypeChecker::new(
TypeChecker::try_create(
&mut bind_context,
ctx.clone(),
&name_resolution_ctx,
metadata.clone(),
&[],
allow_pushdown,
forbid_udf,
)
)?
};

let (scalar_expr, _) = *type_checker.resolve(ast_expr).await?;
Expand Down
4 changes: 2 additions & 2 deletions src/query/sql/src/executor/table_read_plan.rs
Original file line number Diff line number Diff line change
Expand Up @@ -232,15 +232,15 @@ impl ToReadDataSourcePlan for dyn Table {
let name_resolution_ctx =
NameResolutionContext::try_from(settings.as_ref())?;
let metadata = Arc::new(RwLock::new(Metadata::default()));
let mut type_checker = TypeChecker::new(
let mut type_checker = TypeChecker::try_create(
&mut bind_context,
ctx.clone(),
&name_resolution_ctx,
metadata,
&aliases,
false,
false,
);
)?;

ctx.set_status_info(
&format!("build physical plan - checking data mask policies - resolving mask expression, time used {:?}",
Expand Down
4 changes: 2 additions & 2 deletions src/query/sql/src/planner/binder/binder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -136,15 +136,15 @@ impl<'a> Binder {
bind_context: &mut BindContext,
hints: &Hint,
) -> Result<()> {
let mut type_checker = TypeChecker::new(
let mut type_checker = TypeChecker::try_create(
bind_context,
self.ctx.clone(),
&self.name_resolution_ctx,
self.metadata.clone(),
&[],
false,
false,
);
)?;
let mut hint_settings: HashMap<String, String> = HashMap::new();
for hint in &hints.hints_list {
let variable = &hint.name.name;
Expand Down
4 changes: 2 additions & 2 deletions src/query/sql/src/planner/binder/scalar.rs
Original file line number Diff line number Diff line change
Expand Up @@ -83,15 +83,15 @@ impl<'a> ScalarBinder<'a> {

#[async_backtrace::framed]
pub async fn bind(&mut self, expr: &Expr) -> Result<(ScalarExpr, DataType)> {
let mut type_checker = TypeChecker::new(
let mut type_checker = TypeChecker::try_create(
self.bind_context,
self.ctx.clone(),
self.name_resolution_ctx,
self.metadata.clone(),
self.aliases,
self.allow_pushdown,
self.forbid_udf,
);
)?;
type_checker.set_m_cte_bound_ctx(self.m_cte_bound_ctx.clone());
type_checker.set_ctes_map(self.ctes_map.clone());
Ok(*type_checker.resolve(expr).await?)
Expand Down
4 changes: 2 additions & 2 deletions src/query/sql/src/planner/binder/setting.rs
Original file line number Diff line number Diff line change
Expand Up @@ -40,15 +40,15 @@ impl Binder {
variable: &Identifier,
value: &Expr,
) -> Result<Plan> {
let mut type_checker = TypeChecker::new(
let mut type_checker = TypeChecker::try_create(
bind_context,
self.ctx.clone(),
&self.name_resolution_ctx,
self.metadata.clone(),
&[],
false,
false,
);
)?;
let variable = variable.name.clone();

let (scalar, _) = *type_checker.resolve(value).await?;
Expand Down
4 changes: 2 additions & 2 deletions src/query/sql/src/planner/binder/table.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1293,15 +1293,15 @@ impl Binder {
match travel_point {
TimeTravelPoint::Snapshot(s) => Ok(NavigationPoint::SnapshotID(s.to_owned())),
TimeTravelPoint::Timestamp(expr) => {
let mut type_checker = TypeChecker::new(
let mut type_checker = TypeChecker::try_create(
bind_context,
self.ctx.clone(),
&self.name_resolution_ctx,
self.metadata.clone(),
&[],
false,
false,
);
)?;
let box (scalar, _) = type_checker.resolve(expr).await?;
let scalar_expr = scalar.as_expr()?;

Expand Down
20 changes: 10 additions & 10 deletions src/query/sql/src/planner/expression_parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -118,15 +118,15 @@ pub fn parse_exprs(
let (mut bind_context, metadata) = bind_one_table(table_meta)?;
let settings = Settings::create("".to_string());
let name_resolution_ctx = NameResolutionContext::try_from(settings.as_ref())?;
let mut type_checker = TypeChecker::new(
let mut type_checker = TypeChecker::try_create(
&mut bind_context,
ctx,
&name_resolution_ctx,
metadata,
&[],
false,
false,
);
)?;

let sql_dialect = Dialect::MySQL;
let tokens = tokenize_sql(sql)?;
Expand Down Expand Up @@ -213,15 +213,15 @@ pub fn parse_computed_expr(
}

let name_resolution_ctx = NameResolutionContext::try_from(settings.as_ref())?;
let mut type_checker = TypeChecker::new(
let mut type_checker = TypeChecker::try_create(
&mut bind_context,
ctx,
&name_resolution_ctx,
Arc::new(RwLock::new(metadata)),
&[],
false,
false,
);
)?;

let sql_dialect = Dialect::PostgreSQL;
let tokens = tokenize_sql(sql)?;
Expand Down Expand Up @@ -249,15 +249,15 @@ pub fn parse_default_expr_to_string(
let metadata = Metadata::default();

let name_resolution_ctx = NameResolutionContext::try_from(settings.as_ref())?;
let mut type_checker = TypeChecker::new(
let mut type_checker = TypeChecker::try_create(
&mut bind_context,
ctx.clone(),
&name_resolution_ctx,
Arc::new(RwLock::new(metadata)),
&[],
false,
false,
);
)?;

let (mut scalar, data_type) =
*block_in_place(|| Handle::current().block_on(type_checker.resolve(ast)))?;
Expand Down Expand Up @@ -322,15 +322,15 @@ pub fn parse_computed_expr_to_string(
}

let name_resolution_ctx = NameResolutionContext::try_from(settings.as_ref())?;
let mut type_checker = TypeChecker::new(
let mut type_checker = TypeChecker::try_create(
&mut bind_context,
ctx,
&name_resolution_ctx,
Arc::new(RwLock::new(metadata)),
&[],
false,
false,
);
)?;

let (scalar, data_type) =
*block_in_place(|| Handle::current().block_on(type_checker.resolve(ast)))?;
Expand Down Expand Up @@ -392,15 +392,15 @@ pub fn parse_lambda_expr(
);

let name_resolution_ctx = NameResolutionContext::try_from(settings.as_ref())?;
let mut type_checker = TypeChecker::new(
let mut type_checker = TypeChecker::try_create(
&mut bind_context,
ctx.clone(),
&name_resolution_ctx,
Arc::new(RwLock::new(metadata)),
&[],
false,
false,
);
)?;

block_in_place(|| Handle::current().block_on(type_checker.resolve(ast)))
}
Expand Down
15 changes: 7 additions & 8 deletions src/query/sql/src/planner/semantic/type_check.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ use std::collections::VecDeque;
use std::sync::Arc;
use std::vec;

use chrono::Local;
use common_ast::ast::BinaryOperator;
use common_ast::ast::ColumnID;
use common_ast::ast::Expr;
Expand Down Expand Up @@ -152,17 +153,17 @@ pub struct TypeChecker<'a> {
}

impl<'a> TypeChecker<'a> {
pub fn new(
pub fn try_create(
bind_context: &'a mut BindContext,
ctx: Arc<dyn TableContext>,
name_resolution_ctx: &'a NameResolutionContext,
metadata: MetadataRef,
aliases: &'a [(String, ScalarExpr)],
allow_pushdown: bool,
forbid_udf: bool,
) -> Self {
let func_ctx = ctx.get_function_context().unwrap();
Self {
) -> Result<Self> {
let func_ctx = ctx.get_function_context()?;
Ok(Self {
bind_context,
ctx,
func_ctx,
Expand All @@ -175,7 +176,7 @@ impl<'a> TypeChecker<'a> {
in_window_function: false,
allow_pushdown,
forbid_udf,
}
})
}

pub fn set_m_cte_bound_ctx(&mut self, m_cte_bound_ctx: HashMap<IndexType, BindContext>) {
Expand Down Expand Up @@ -2651,9 +2652,7 @@ impl<'a> TypeChecker<'a> {
Literal::String(string) => Scalar::String(string.as_bytes().to_vec()),
Literal::Boolean(boolean) => Scalar::Boolean(*boolean),
Literal::Null => Scalar::Null,
Literal::CurrentTimestamp => Err(ErrorCode::SemanticError(format!(
"Unsupported literal value: {literal}"
)))?,
Literal::CurrentTimestamp => Scalar::Timestamp(Local::now().timestamp_micros()),
};
let value = shrink_scalar(value);
let data_type = value.as_ref().infer_data_type();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -140,9 +140,8 @@ CREATE TABLE db2.test5(a Varchar null, y Varchar null) ENGINE=fuse AS SELECT b F
statement error 1006
CREATE TABLE db2.test5(a Varchar null, y Varchar null) ENGINE=fuse AS SELECT a, b, a FROM db1.test1


statement error 1065
create table db2.test6(id Int8, created timestamp DEFAULT CURRENT_TIMESTAMP)
statement ok
create table db2.test55(id Int8, created timestamp DEFAULT CURRENT_TIMESTAMP)

statement error 1065
create table db2.test6(id Int8, created timestamp DEFAULT today() + a)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -281,3 +281,6 @@ set timezone='UTC'

statement ok
drop database db1

statement error 1078
set timezone = 'Asia/Test'
2 changes: 1 addition & 1 deletion tests/sqllogictests/suites/debug/select_0.test
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ select a,b,c,d from t4
statement ok
drop table t4

statement error 1065
statement ok
create table db2.test6(id Int8, created timestamp DEFAULT CURRENT_TIMESTAMP)

query III
Expand Down
2 changes: 1 addition & 1 deletion tests/sqllogictests/suites/debug/select_1.test
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ select a,b,c,d from t4
statement ok
drop table t4

statement error 1065
statement ok
create table db2.test6(id Int8, created timestamp DEFAULT CURRENT_TIMESTAMP)

query III
Expand Down

0 comments on commit adf6e1a

Please sign in to comment.