Skip to content

Commit 6308c81

Browse files
authored
feat(query): support mul fro interval type with int types (#17684)
* feat(query): support mul fro interval type with int types * feat(query): support mul fro interval type with int types
1 parent f198d60 commit 6308c81

File tree

15 files changed

+157
-34
lines changed

15 files changed

+157
-34
lines changed

src/query/ast/src/ast/expr.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -832,6 +832,7 @@ impl Display for Weekday {
832832

833833
#[derive(Debug, Copy, Clone, PartialEq, Eq, Drive, DriveMut)]
834834
pub enum IntervalKind {
835+
ISOYear,
835836
Year,
836837
Quarter,
837838
Month,
@@ -849,6 +850,7 @@ pub enum IntervalKind {
849850
impl Display for IntervalKind {
850851
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
851852
f.write_str(match self {
853+
IntervalKind::ISOYear => "ISOYEAR",
852854
IntervalKind::Year => "YEAR",
853855
IntervalKind::Quarter => "QUARTER",
854856
IntervalKind::Month => "MONTH",

src/query/ast/src/parser/expr.rs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1670,7 +1670,7 @@ pub fn type_name(i: Input) -> IResult<TypeName> {
16701670
TypeName::Int64,
16711671
rule! { ( INT64 | SIGNED | BIGINT ) ~ ( "(" ~ ^#literal_u64 ~ ^")" )? },
16721672
);
1673-
let ty_float32 = value(TypeName::Float32, rule! { FLOAT32 | FLOAT });
1673+
let ty_float32 = value(TypeName::Float32, rule! { FLOAT32 | FLOAT | REAL });
16741674
let ty_float64 = value(
16751675
TypeName::Float64,
16761676
rule! { (FLOAT64 | DOUBLE) ~ PRECISION? },
@@ -1692,6 +1692,14 @@ pub fn type_name(i: Input) -> IResult<TypeName> {
16921692
})
16931693
},
16941694
);
1695+
let ty_numeric = value(
1696+
TypeName::Decimal {
1697+
precision: 18,
1698+
scale: 3,
1699+
},
1700+
rule! { NUMERIC },
1701+
);
1702+
16951703
let ty_array = map(
16961704
rule! { ARRAY ~ "(" ~ #type_name ~ ")" },
16971705
|(_, _, item_type, _)| TypeName::Array(Box::new(item_type)),
@@ -1769,6 +1777,7 @@ pub fn type_name(i: Input) -> IResult<TypeName> {
17691777
( #ty_date
17701778
| #ty_datetime
17711779
| #ty_interval
1780+
| #ty_numeric
17721781
| #ty_binary
17731782
| #ty_string
17741783
| #ty_variant
@@ -1834,6 +1843,7 @@ pub fn weekday(i: Input) -> IResult<Weekday> {
18341843
}
18351844

18361845
pub fn interval_kind(i: Input) -> IResult<IntervalKind> {
1846+
let iso_year = value(IntervalKind::ISOYear, rule! { ISOYEAR });
18371847
let year = value(IntervalKind::Year, rule! { YEAR });
18381848
let quarter = value(IntervalKind::Quarter, rule! { QUARTER });
18391849
let month = value(IntervalKind::Month, rule! { MONTH });
@@ -1846,6 +1856,11 @@ pub fn interval_kind(i: Input) -> IResult<IntervalKind> {
18461856
let week = value(IntervalKind::Week, rule! { WEEK });
18471857
let epoch = value(IntervalKind::Epoch, rule! { EPOCH });
18481858
let microsecond = value(IntervalKind::MicroSecond, rule! { MICROSECOND });
1859+
1860+
let iso_year_str = value(
1861+
IntervalKind::ISOYear,
1862+
rule! { #literal_string_eq_ignore_case("ISOYEAR") },
1863+
);
18491864
let year_str = value(
18501865
IntervalKind::Year,
18511866
rule! { #literal_string_eq_ignore_case("YEAR") },
@@ -1897,6 +1912,7 @@ pub fn interval_kind(i: Input) -> IResult<IntervalKind> {
18971912
alt((
18981913
rule!(
18991914
#year
1915+
| #iso_year
19001916
| #quarter
19011917
| #month
19021918
| #day
@@ -1911,6 +1927,7 @@ pub fn interval_kind(i: Input) -> IResult<IntervalKind> {
19111927
),
19121928
rule!(
19131929
#year_str
1930+
| #iso_year_str
19141931
| #quarter_str
19151932
| #month_str
19161933
| #day_str

src/query/ast/src/parser/token.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -856,6 +856,8 @@ pub enum TokenKind {
856856
NULL,
857857
#[token("NULLABLE", ignore(ascii_case))]
858858
NULLABLE,
859+
#[token("NUMERIC", ignore(ascii_case))]
860+
NUMERIC,
859861
#[token("OBJECT", ignore(ascii_case))]
860862
OBJECT,
861863
#[token("OF", ignore(ascii_case))]
@@ -990,6 +992,8 @@ pub enum TokenKind {
990992
ROW_TAG,
991993
#[token("GRANT", ignore(ascii_case))]
992994
GRANT,
995+
#[token("REAL", ignore(ascii_case))]
996+
REAL,
993997
#[token("REPEAT", ignore(ascii_case))]
994998
REPEAT,
995999
#[token("ROLE", ignore(ascii_case))]

src/query/ast/tests/it/testdata/expr-error.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ error:
2929
--> SQL:1:14
3030
|
3131
1 | CAST(col1 AS foo)
32-
| ---- ^^^ unexpected `foo`, expecting `BOOL`, `FLOAT`, `BOOLEAN`, `FLOAT32`, `FLOAT64`, `BLOB`, `JSON`, `DOUBLE`, `LONGBLOB`, `GEOMETRY`, `GEOGRAPHY`, `UINT8`, `TINYINT`, `UINT16`, `SMALLINT`, `UINT32`, `INT`, `INTEGER`, `UINT64`, `UNSIGNED`, `BIGINT`, `INT8`, `INT16`, `INT32`, `INT64`, `SIGNED`, `DECIMAL`, `ARRAY`, `MAP`, `BITMAP`, `TUPLE`, `DATE`, `DATETIME`, `TIMESTAMP`, `INTERVAL`, `BINARY`, `VARBINARY`, `MEDIUMBLOB`, `TINYBLOB`, `STRING`, `VARCHAR`, `CHAR`, `CHARACTER`, `TEXT`, `VARIANT`, or `NULLABLE`
32+
| ---- ^^^ unexpected `foo`, expecting `BOOL`, `FLOAT`, `BOOLEAN`, `FLOAT32`, `FLOAT64`, `BLOB`, `JSON`, `DOUBLE`, `LONGBLOB`, `GEOMETRY`, `GEOGRAPHY`, `UINT8`, `TINYINT`, `UINT16`, `SMALLINT`, `UINT32`, `INT`, `INTEGER`, `UINT64`, `UNSIGNED`, `BIGINT`, `INT8`, `INT16`, `INT32`, `INT64`, `SIGNED`, `REAL`, `DECIMAL`, `ARRAY`, `MAP`, `BITMAP`, `TUPLE`, `DATE`, `DATETIME`, `TIMESTAMP`, `INTERVAL`, `NUMERIC`, `BINARY`, `VARBINARY`, `MEDIUMBLOB`, `TINYBLOB`, `STRING`, `VARCHAR`, `CHAR`, `CHARACTER`, `TEXT`, `VARIANT`, or `NULLABLE`
3333
| |
3434
| while parsing `CAST(... AS ...)`
3535
| while parsing expression

src/query/ast/tests/it/testdata/stmt-error.txt

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ error:
2929
--> SQL:1:19
3030
|
3131
1 | create table a (c varch)
32-
| ------ - ^^^^^ unexpected `varch`, expecting `VARCHAR`, `CHAR`, `VARIANT`, `CHARACTER`, `VARBINARY`, `ARRAY`, `BINARY`, `GEOGRAPHY`, `MAP`, `DATE`, `STRING`, `FLOAT32`, `FLOAT64`, `DECIMAL`, `SMALLINT`, `DATETIME`, `INTERVAL`, `NULLABLE`, `BOOLEAN`, `BOOL`, `UINT8`, `TINYINT`, `UINT16`, `UINT32`, `INT`, `INTEGER`, `UINT64`, `UNSIGNED`, `BIGINT`, `INT8`, `INT16`, `INT32`, `INT64`, `SIGNED`, `FLOAT`, `DOUBLE`, `BITMAP`, `TUPLE`, `TIMESTAMP`, `LONGBLOB`, `MEDIUMBLOB`, `TINYBLOB`, `BLOB`, `TEXT`, `JSON`, or `GEOMETRY`
32+
| ------ - ^^^^^ unexpected `varch`, expecting `VARCHAR`, `CHAR`, `VARIANT`, `CHARACTER`, `VARBINARY`, `ARRAY`, `BINARY`, `GEOGRAPHY`, `MAP`, `DATE`, `STRING`, `FLOAT32`, `FLOAT64`, `DECIMAL`, `NUMERIC`, `SMALLINT`, `DATETIME`, `INTERVAL`, `NULLABLE`, `REAL`, `BOOLEAN`, `BOOL`, `UINT8`, `TINYINT`, `UINT16`, `UINT32`, `INT`, `INTEGER`, `UINT64`, `UNSIGNED`, `BIGINT`, `INT8`, `INT16`, `INT32`, `INT64`, `SIGNED`, `FLOAT`, `DOUBLE`, `BITMAP`, `TUPLE`, `TIMESTAMP`, `LONGBLOB`, `MEDIUMBLOB`, `TINYBLOB`, `BLOB`, `TEXT`, `JSON`, or `GEOMETRY`
3333
| | |
3434
| | while parsing `<column name> <type> [DEFAULT <expr>] [AS (<expr>) VIRTUAL] [AS (<expr>) STORED] [COMMENT '<comment>']`
3535
| while parsing `CREATE [OR REPLACE] TABLE [IF NOT EXISTS] [<database>.]<table> [<source>] [<table_options>]`
@@ -42,7 +42,7 @@ error:
4242
--> SQL:1:25
4343
|
4444
1 | create table a (c tuple())
45-
| ------ - ----- ^ unexpected `)`, expecting `BOOLEAN`, `BOOL`, `UINT8`, `TINYINT`, `UINT16`, `SMALLINT`, `UINT32`, `INT`, `INTEGER`, `UINT64`, `UNSIGNED`, `BIGINT`, `INT8`, `INT16`, `INT32`, `INT64`, `SIGNED`, `FLOAT32`, `FLOAT`, `FLOAT64`, `DOUBLE`, `DECIMAL`, `ARRAY`, `MAP`, `BITMAP`, `TUPLE`, `DATE`, `DATETIME`, `TIMESTAMP`, `INTERVAL`, `BINARY`, `VARBINARY`, `LONGBLOB`, `MEDIUMBLOB`, `TINYBLOB`, `BLOB`, `STRING`, `VARCHAR`, `CHAR`, `CHARACTER`, `TEXT`, `VARIANT`, `JSON`, `GEOMETRY`, `GEOGRAPHY`, `NULLABLE`, <Ident>, <LiteralString>, or `IDENTIFIER`
45+
| ------ - ----- ^ unexpected `)`, expecting `BOOLEAN`, `BOOL`, `UINT8`, `TINYINT`, `UINT16`, `SMALLINT`, `UINT32`, `INT`, `INTEGER`, `UINT64`, `UNSIGNED`, `BIGINT`, `INT8`, `INT16`, `INT32`, `INT64`, `SIGNED`, `FLOAT32`, `FLOAT`, `REAL`, `FLOAT64`, `DOUBLE`, `DECIMAL`, `ARRAY`, `MAP`, `BITMAP`, `TUPLE`, `DATE`, `DATETIME`, `TIMESTAMP`, `INTERVAL`, `NUMERIC`, `BINARY`, `VARBINARY`, `LONGBLOB`, `MEDIUMBLOB`, `TINYBLOB`, `BLOB`, `STRING`, `VARCHAR`, `CHAR`, `CHARACTER`, `TEXT`, `VARIANT`, `JSON`, `GEOMETRY`, `GEOGRAPHY`, `NULLABLE`, <Ident>, <LiteralString>, or `IDENTIFIER`
4646
| | | |
4747
| | | while parsing type name
4848
| | while parsing `<column name> <type> [DEFAULT <expr>] [AS (<expr>) VIRTUAL] [AS (<expr>) STORED] [COMMENT '<comment>']`
@@ -70,7 +70,7 @@ error:
7070
--> SQL:1:38
7171
|
7272
1 | create table a (b tuple(c int, uint64));
73-
| ------ - ----- ^ unexpected `)`, expecting `BOOLEAN`, `BOOL`, `UINT8`, `TINYINT`, `UINT16`, `SMALLINT`, `UINT32`, `INT`, `INTEGER`, `UINT64`, `UNSIGNED`, `BIGINT`, `INT8`, `INT16`, `INT32`, `INT64`, `SIGNED`, `FLOAT32`, `FLOAT`, `FLOAT64`, `DOUBLE`, `DECIMAL`, `ARRAY`, `MAP`, `BITMAP`, `TUPLE`, `DATE`, `DATETIME`, `TIMESTAMP`, `INTERVAL`, `BINARY`, `VARBINARY`, `LONGBLOB`, `MEDIUMBLOB`, `TINYBLOB`, `BLOB`, `STRING`, `VARCHAR`, `CHAR`, `CHARACTER`, `TEXT`, `VARIANT`, `JSON`, `GEOMETRY`, `GEOGRAPHY`, or `NULLABLE`
73+
| ------ - ----- ^ unexpected `)`, expecting `BOOLEAN`, `BOOL`, `UINT8`, `TINYINT`, `UINT16`, `SMALLINT`, `UINT32`, `INT`, `INTEGER`, `UINT64`, `UNSIGNED`, `BIGINT`, `INT8`, `INT16`, `INT32`, `INT64`, `SIGNED`, `FLOAT32`, `FLOAT`, `REAL`, `FLOAT64`, `DOUBLE`, `DECIMAL`, `ARRAY`, `MAP`, `BITMAP`, `TUPLE`, `DATE`, `DATETIME`, `TIMESTAMP`, `INTERVAL`, `NUMERIC`, `BINARY`, `VARBINARY`, `LONGBLOB`, `MEDIUMBLOB`, `TINYBLOB`, `BLOB`, `STRING`, `VARCHAR`, `CHAR`, `CHARACTER`, `TEXT`, `VARIANT`, `JSON`, `GEOMETRY`, `GEOGRAPHY`, or `NULLABLE`
7474
| | | |
7575
| | | while parsing TUPLE(<name> <type>, ...)
7676
| | | while parsing type name
@@ -963,7 +963,7 @@ error:
963963
--> SQL:1:40
964964
|
965965
1 | CREATE FUNCTION my_agg (INT) STATE { s STRIN } RETURNS BOOLEAN LANGUAGE javascript ADDRESS = 'http://0.0.0.0:8815';
966-
| ------ - ^^^^^ unexpected `STRIN`, expecting `STRING`, `SIGNED`, `INTERVAL`, `TINYINT`, `VARIANT`, `SMALLINT`, `TINYBLOB`, `VARBINARY`, `INT8`, `JSON`, `INT16`, `INT32`, `INT64`, `UINT8`, `BIGINT`, `UINT16`, `UINT32`, `UINT64`, `BINARY`, `INTEGER`, `DATETIME`, `TIMESTAMP`, `UNSIGNED`, `DATE`, `CHAR`, `TEXT`, `ARRAY`, `TUPLE`, `BOOLEAN`, `DECIMAL`, `VARCHAR`, `LONGBLOB`, `NULLABLE`, `CHARACTER`, `GEOGRAPHY`, `MEDIUMBLOB`, `BITMAP`, `}`, `BOOL`, `INT`, `FLOAT32`, `FLOAT`, `FLOAT64`, `DOUBLE`, `MAP`, `BLOB`, or `GEOMETRY`
966+
| ------ - ^^^^^ unexpected `STRIN`, expecting `STRING`, `SIGNED`, `INTERVAL`, `TINYINT`, `VARIANT`, `SMALLINT`, `TINYBLOB`, `VARBINARY`, `INT8`, `JSON`, `INT16`, `INT32`, `INT64`, `UINT8`, `BIGINT`, `UINT16`, `UINT32`, `UINT64`, `BINARY`, `INTEGER`, `DATETIME`, `NUMERIC`, `TIMESTAMP`, `UNSIGNED`, `REAL`, `DATE`, `CHAR`, `TEXT`, `ARRAY`, `TUPLE`, `BOOLEAN`, `DECIMAL`, `VARCHAR`, `LONGBLOB`, `NULLABLE`, `CHARACTER`, `GEOGRAPHY`, `MEDIUMBLOB`, `BITMAP`, `}`, `BOOL`, `INT`, `FLOAT32`, `FLOAT`, `FLOAT64`, `DOUBLE`, `MAP`, `BLOB`, or `GEOMETRY`
967967
| | |
968968
| | while parsing (<arg_type>, ...) STATE {<state_field>, ...} RETURNS <return_type> LANGUAGE <language> { ADDRESS=<udf_server_address> | AS <language_codes> }
969969
| while parsing `CREATE [OR REPLACE] FUNCTION [IF NOT EXISTS] <udf_name> <udf_definition> [DESC = <description>]`
@@ -1051,7 +1051,7 @@ error:
10511051
| ------ while parsing `CREATE [OR REPLACE] DICTIONARY [IF NOT EXISTS] <dictionary_name> [(<column>, ...)] PRIMARY KEY [<primary_key>, ...] SOURCE (<source_name> ([<source_options>])) [COMMENT <comment>] `
10521052
2 | (
10531053
3 | user_name tuple(),
1054-
| --------- ----- ^ unexpected `)`, expecting `BOOLEAN`, `BOOL`, `UINT8`, `TINYINT`, `UINT16`, `SMALLINT`, `UINT32`, `INT`, `INTEGER`, `UINT64`, `UNSIGNED`, `BIGINT`, `INT8`, `INT16`, `INT32`, `INT64`, `SIGNED`, `FLOAT32`, `FLOAT`, `FLOAT64`, `DOUBLE`, `DECIMAL`, `ARRAY`, `MAP`, `BITMAP`, `TUPLE`, `DATE`, `DATETIME`, `TIMESTAMP`, `INTERVAL`, `BINARY`, `VARBINARY`, `LONGBLOB`, `MEDIUMBLOB`, `TINYBLOB`, `BLOB`, `STRING`, `VARCHAR`, `CHAR`, `CHARACTER`, `TEXT`, `VARIANT`, `JSON`, `GEOMETRY`, `GEOGRAPHY`, `NULLABLE`, <Ident>, <LiteralString>, or `IDENTIFIER`
1054+
| --------- ----- ^ unexpected `)`, expecting `BOOLEAN`, `BOOL`, `UINT8`, `TINYINT`, `UINT16`, `SMALLINT`, `UINT32`, `INT`, `INTEGER`, `UINT64`, `UNSIGNED`, `BIGINT`, `INT8`, `INT16`, `INT32`, `INT64`, `SIGNED`, `FLOAT32`, `FLOAT`, `REAL`, `FLOAT64`, `DOUBLE`, `DECIMAL`, `ARRAY`, `MAP`, `BITMAP`, `TUPLE`, `DATE`, `DATETIME`, `TIMESTAMP`, `INTERVAL`, `NUMERIC`, `BINARY`, `VARBINARY`, `LONGBLOB`, `MEDIUMBLOB`, `TINYBLOB`, `BLOB`, `STRING`, `VARCHAR`, `CHAR`, `CHARACTER`, `TEXT`, `VARIANT`, `JSON`, `GEOMETRY`, `GEOGRAPHY`, `NULLABLE`, <Ident>, <LiteralString>, or `IDENTIFIER`
10551055
| | |
10561056
| | while parsing type name
10571057
| while parsing `<column name> <type> [DEFAULT <expr>] [AS (<expr>) VIRTUAL] [AS (<expr>) STORED] [COMMENT '<comment>']`
@@ -1102,7 +1102,7 @@ error:
11021102
--> SQL:1:19
11031103
|
11041104
1 | drop procedure p1(a int)
1105-
| ---- ^ unexpected `a`, expecting `DATE`, `ARRAY`, `VARCHAR`, `VARIANT`, `SMALLINT`, `DATETIME`, `VARBINARY`, `CHARACTER`, `)`, `BOOLEAN`, `BOOL`, `UINT8`, `TINYINT`, `UINT16`, `UINT32`, `INT`, `INTEGER`, `UINT64`, `UNSIGNED`, `BIGINT`, `INT8`, `INT16`, `INT32`, `INT64`, `SIGNED`, `FLOAT32`, `FLOAT`, `FLOAT64`, `DOUBLE`, `DECIMAL`, `MAP`, `BITMAP`, `TUPLE`, `TIMESTAMP`, `INTERVAL`, `BINARY`, `LONGBLOB`, `MEDIUMBLOB`, `TINYBLOB`, `BLOB`, `STRING`, `CHAR`, `TEXT`, `JSON`, `GEOMETRY`, `GEOGRAPHY`, or `NULLABLE`
1105+
| ---- ^ unexpected `a`, expecting `DATE`, `ARRAY`, `VARCHAR`, `VARIANT`, `SMALLINT`, `DATETIME`, `VARBINARY`, `CHARACTER`, `)`, `BOOLEAN`, `BOOL`, `UINT8`, `TINYINT`, `UINT16`, `UINT32`, `INT`, `INTEGER`, `UINT64`, `UNSIGNED`, `BIGINT`, `INT8`, `INT16`, `INT32`, `INT64`, `SIGNED`, `FLOAT32`, `FLOAT`, `REAL`, `FLOAT64`, `DOUBLE`, `DECIMAL`, `MAP`, `BITMAP`, `TUPLE`, `TIMESTAMP`, `INTERVAL`, `NUMERIC`, `BINARY`, `LONGBLOB`, `MEDIUMBLOB`, `TINYBLOB`, `BLOB`, `STRING`, `CHAR`, `TEXT`, `JSON`, `GEOMETRY`, `GEOGRAPHY`, or `NULLABLE`
11061106
| |
11071107
| while parsing `DROP PROCEDURE <procedure_name>()`
11081108

@@ -1134,7 +1134,7 @@ error:
11341134
--> SQL:1:44
11351135
|
11361136
1 | create PROCEDURE p1() returns table(string not null, int null) language sql comment = 'test' as $$
1137-
| ------ ----- ^^^ unexpected `not`, expecting `INT8`, `INT16`, `INT32`, `INT64`, `UINT16`, `UINT32`, `UINT64`, `INTEGER`, `FLOAT32`, `FLOAT64`, `INTERVAL`, `GEOMETRY`, `INT`, `BOOL`, `DATE`, `BLOB`, `TEXT`, `JSON`, `UINT8`, `FLOAT`, `TUPLE`, `DOUBLE`, `BITMAP`, `BINARY`, `STRING`, `BOOLEAN`, `UNSIGNED`, `DATETIME`, `NULLABLE`, `TIMESTAMP`, `GEOGRAPHY`, `TINYINT`, `LONGBLOB`, `TINYBLOB`, `SMALLINT`, `BIGINT`, `SIGNED`, `DECIMAL`, `ARRAY`, `MAP`, `VARBINARY`, `MEDIUMBLOB`, `VARCHAR`, `CHAR`, `CHARACTER`, or `VARIANT`
1137+
| ------ ----- ^^^ unexpected `not`, expecting `INT8`, `INT16`, `INT32`, `INT64`, `UINT16`, `UINT32`, `UINT64`, `INTEGER`, `FLOAT32`, `FLOAT64`, `INTERVAL`, `GEOMETRY`, `INT`, `BOOL`, `DATE`, `BLOB`, `TEXT`, `JSON`, `UINT8`, `FLOAT`, `TUPLE`, `DOUBLE`, `BITMAP`, `BINARY`, `STRING`, `BOOLEAN`, `NUMERIC`, `UNSIGNED`, `DATETIME`, `NULLABLE`, `TIMESTAMP`, `GEOGRAPHY`, `TINYINT`, `LONGBLOB`, `TINYBLOB`, `SMALLINT`, `BIGINT`, `SIGNED`, `REAL`, `DECIMAL`, `ARRAY`, `MAP`, `VARBINARY`, `MEDIUMBLOB`, `VARCHAR`, `CHAR`, `CHARACTER`, or `VARIANT`
11381138
| | |
11391139
| | while parsing TABLE(<var_name> <type_name>, ...)
11401140
| while parsing `CREATE [ OR REPLACE ] PROCEDURE <procedure_name>() RETURNS { <result_data_type> [ NOT NULL ] | TABLE(<var_name> <data_type>, ...)} LANGUAGE SQL [ COMMENT = '<string_literal>' ] AS <procedure_definition>`
@@ -1155,7 +1155,7 @@ error:
11551155
--> SQL:1:24
11561156
|
11571157
1 | create PROCEDURE p1(int, string) returns table(string not null, int null) language sql comment = 'test' as $$
1158-
| ------ - ^ unexpected `,`, expecting `BOOLEAN`, `BOOL`, `UINT8`, `TINYINT`, `UINT16`, `SMALLINT`, `UINT32`, `INT`, `INTEGER`, `UINT64`, `UNSIGNED`, `BIGINT`, `INT8`, `INT16`, `INT32`, `INT64`, `SIGNED`, `FLOAT32`, `FLOAT`, `FLOAT64`, `DOUBLE`, `DECIMAL`, `ARRAY`, `MAP`, `BITMAP`, `TUPLE`, `DATE`, `DATETIME`, `TIMESTAMP`, `INTERVAL`, `BINARY`, `VARBINARY`, `LONGBLOB`, `MEDIUMBLOB`, `TINYBLOB`, `BLOB`, `STRING`, `VARCHAR`, `CHAR`, `CHARACTER`, `TEXT`, `VARIANT`, `JSON`, `GEOMETRY`, `GEOGRAPHY`, or `NULLABLE`
1158+
| ------ - ^ unexpected `,`, expecting `BOOLEAN`, `BOOL`, `UINT8`, `TINYINT`, `UINT16`, `SMALLINT`, `UINT32`, `INT`, `INTEGER`, `UINT64`, `UNSIGNED`, `BIGINT`, `INT8`, `INT16`, `INT32`, `INT64`, `SIGNED`, `FLOAT32`, `FLOAT`, `REAL`, `FLOAT64`, `DOUBLE`, `DECIMAL`, `ARRAY`, `MAP`, `BITMAP`, `TUPLE`, `DATE`, `DATETIME`, `TIMESTAMP`, `INTERVAL`, `NUMERIC`, `BINARY`, `VARBINARY`, `LONGBLOB`, `MEDIUMBLOB`, `TINYBLOB`, `BLOB`, `STRING`, `VARCHAR`, `CHAR`, `CHARACTER`, `TEXT`, `VARIANT`, `JSON`, `GEOMETRY`, `GEOGRAPHY`, or `NULLABLE`
11591159
| | |
11601160
| | while parsing (<var_name> <type_name>, ...)
11611161
| while parsing `CREATE [ OR REPLACE ] PROCEDURE <procedure_name>() RETURNS { <result_data_type> [ NOT NULL ] | TABLE(<var_name> <data_type>, ...)} LANGUAGE SQL [ COMMENT = '<string_literal>' ] AS <procedure_definition>`

src/query/expression/src/utils/date_helper.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,7 @@ pub struct ToYYYYMMDD;
355355
pub struct ToYYYYMMDDHH;
356356
pub struct ToYYYYMMDDHHMMSS;
357357
pub struct ToYear;
358+
pub struct ToISOYear;
358359
pub struct ToQuarter;
359360
pub struct ToMonth;
360361
pub struct ToDayOfYear;
@@ -411,6 +412,12 @@ impl ToNumber<u16> for ToYear {
411412
}
412413
}
413414

415+
impl ToNumber<u16> for ToISOYear {
416+
fn to_number(dt: &Zoned) -> u16 {
417+
dt.date().iso_week_date().year() as _
418+
}
419+
}
420+
414421
impl ToNumber<u8> for ToQuarter {
415422
fn to_number(dt: &Zoned) -> u8 {
416423
// begin with 0
@@ -582,10 +589,11 @@ pub struct ToStartOfMonth;
582589
pub struct ToStartOfQuarter;
583590
pub struct ToStartOfYear;
584591
pub struct ToStartOfISOYear;
592+
593+
pub struct ToLastOfYear;
585594
pub struct ToLastOfWeek;
586595
pub struct ToLastOfMonth;
587596
pub struct ToLastOfQuarter;
588-
pub struct ToLastOfYear;
589597
pub struct ToPreviousMonday;
590598
pub struct ToPreviousTuesday;
591599
pub struct ToPreviousWednesday;

src/query/functions/src/scalars/other.rs

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -495,18 +495,6 @@ pub fn compute_grouping(cols: &[usize], grouping_id: u32) -> u32 {
495495
}
496496
// this implementation comes from https://github.com/joshuaclayton/jaro_winkler
497497
pub(crate) mod jaro_winkler {
498-
#![deny(missing_docs)]
499-
500-
//! `jaro_winkler` is a crate for calculating Jaro-Winkler distance of two strings.
501-
//!
502-
//! # Examples
503-
//!
504-
//! ```
505-
//! assert_eq!(jaro_winkler("martha", "marhta"), 0.9611111111111111);
506-
//! assert_eq!(jaro_winkler("", "words"), 0.0);
507-
//! assert_eq!(jaro_winkler("same", "same"), 1.0);
508-
//! ```
509-
510498
enum DataWrapper {
511499
Vec(Vec<bool>),
512500
Bitwise(u128),

src/query/functions/src/scalars/timestamp/src/datetime.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1451,6 +1451,21 @@ fn register_to_number_functions(registry: &mut FunctionRegistry) {
14511451
}
14521452
}),
14531453
);
1454+
1455+
registry.register_passthrough_nullable_1_arg::<DateType, UInt16Type, _, _>(
1456+
"to_iso_year",
1457+
|_, _| FunctionDomain::Full,
1458+
vectorize_with_builder_1_arg::<DateType, UInt16Type>(|val, output, ctx| {
1459+
match ToNumberImpl::eval_date::<ToISOYear, _>(val, ctx.func_ctx.tz.clone()) {
1460+
Ok(t) => output.push(t),
1461+
Err(e) => {
1462+
ctx.set_error(output.len(), format!("cannot parse to type `Date`. {}", e));
1463+
output.push(0);
1464+
}
1465+
}
1466+
}),
1467+
);
1468+
14541469
registry.register_passthrough_nullable_1_arg::<DateType, UInt8Type, _, _>(
14551470
"to_quarter",
14561471
|_, _| FunctionDomain::Full,
@@ -1565,6 +1580,13 @@ fn register_to_number_functions(registry: &mut FunctionRegistry) {
15651580
ToNumberImpl::eval_timestamp::<ToYear, _>(val, ctx.func_ctx.tz.clone())
15661581
}),
15671582
);
1583+
registry.register_passthrough_nullable_1_arg::<TimestampType, UInt16Type, _, _>(
1584+
"to_iso_year",
1585+
|_, _| FunctionDomain::Full,
1586+
vectorize_1_arg::<TimestampType, UInt16Type>(|val, ctx| {
1587+
ToNumberImpl::eval_timestamp::<ToISOYear, _>(val, ctx.func_ctx.tz.clone())
1588+
}),
1589+
);
15681590
registry.register_passthrough_nullable_1_arg::<TimestampType, UInt8Type, _, _>(
15691591
"to_quarter",
15701592
|_, _| FunctionDomain::Full,

0 commit comments

Comments
 (0)