Skip to content

Commit b32ab7c

Browse files
authored
feat(query): support show sequences and desc sequence (#17968)
1 parent 52c5bc7 commit b32ab7c

File tree

40 files changed

+646
-11
lines changed

40 files changed

+646
-11
lines changed

src/meta/api/src/schema_api_test_suite.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5786,6 +5786,23 @@ impl SchemaApiTestSuite {
57865786
assert_eq!(resp.current, 1);
57875787
}
57885788

5789+
info!("--- list sequence");
5790+
{
5791+
let req = CreateSequenceReq {
5792+
create_option: CreateOption::Create,
5793+
ident: SequenceIdent::new(&tenant, "seq1"),
5794+
create_on,
5795+
comment: Some("seq1".to_string()),
5796+
};
5797+
5798+
let seqs = ["seq", "seq1"];
5799+
let _resp = mt.create_sequence(req).await?;
5800+
let values = mt.list_sequences(&tenant).await?;
5801+
for (i, (name, _)) in values.iter().enumerate() {
5802+
assert_eq!(name, seqs[i]);
5803+
}
5804+
}
5805+
57895806
info!("--- get sequence nextval");
57905807
{
57915808
let req = GetSequenceNextValueReq {

src/meta/api/src/sequence_api.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ use databend_common_meta_app::schema::GetSequenceNextValueReply;
2020
use databend_common_meta_app::schema::GetSequenceNextValueReq;
2121
use databend_common_meta_app::schema::SequenceIdent;
2222
use databend_common_meta_app::schema::SequenceMeta;
23+
use databend_common_meta_app::tenant::Tenant;
2324
use databend_common_meta_types::MetaError;
2425
use databend_common_meta_types::SeqV;
2526

@@ -37,6 +38,11 @@ pub trait SequenceApi: Send + Sync {
3738
req: &SequenceIdent,
3839
) -> Result<Option<SeqV<SequenceMeta>>, MetaError>;
3940

41+
async fn list_sequences(
42+
&self,
43+
tenant: &Tenant,
44+
) -> Result<Vec<(String, SequenceMeta)>, MetaError>;
45+
4046
async fn get_sequence_next_value(
4147
&self,
4248
req: GetSequenceNextValueReq,

src/meta/api/src/sequence_api_impl.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,15 @@ use databend_common_meta_app::schema::GetSequenceNextValueReply;
2626
use databend_common_meta_app::schema::GetSequenceNextValueReq;
2727
use databend_common_meta_app::schema::SequenceIdent;
2828
use databend_common_meta_app::schema::SequenceMeta;
29+
use databend_common_meta_app::tenant::Tenant;
2930
use databend_common_meta_kvapi::kvapi;
31+
use databend_common_meta_kvapi::kvapi::DirName;
3032
use databend_common_meta_types::MatchSeq;
3133
use databend_common_meta_types::MetaError;
3234
use databend_common_meta_types::SeqV;
3335
use databend_common_meta_types::TxnRequest;
3436
use fastrace::func_name;
37+
use futures::TryStreamExt;
3538
use log::debug;
3639

3740
use crate::databend_common_meta_types::With;
@@ -92,6 +95,20 @@ impl<KV: kvapi::KVApi<Error = MetaError> + ?Sized> SequenceApi for KV {
9295
Ok(seq_meta)
9396
}
9497

98+
#[logcall::logcall]
99+
#[fastrace::trace]
100+
async fn list_sequences(
101+
&self,
102+
tenant: &Tenant,
103+
) -> Result<Vec<(String, SequenceMeta)>, MetaError> {
104+
let dir_name = DirName::new(SequenceIdent::new(tenant, "dummy"));
105+
self.list_pb(&dir_name)
106+
.await?
107+
.map_ok(|itm| (itm.key.name().to_string(), itm.seqv.data))
108+
.try_collect::<Vec<_>>()
109+
.await
110+
}
111+
95112
async fn get_sequence_next_value(
96113
&self,
97114
req: GetSequenceNextValueReq,

src/meta/app/src/schema/sequence.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ use chrono::Utc;
1717
pub use kvapi_impl::SequenceRsc;
1818

1919
use super::CreateOption;
20+
use crate::tenant::Tenant;
2021
use crate::tenant_key::ident::TIdent;
2122

2223
/// Defines the meta-service key for sequence.
@@ -80,6 +81,16 @@ pub struct GetSequenceReply {
8081
pub meta: SequenceMeta,
8182
}
8283

84+
#[derive(Clone, Debug, PartialEq, Eq)]
85+
pub struct ListSequencesReq {
86+
pub tenant: Tenant,
87+
}
88+
89+
#[derive(Clone, Debug, PartialEq, Eq)]
90+
pub struct ListSequencesReply {
91+
pub info: Vec<(String, SequenceMeta)>,
92+
}
93+
8394
#[derive(Clone, Debug, PartialEq, Eq)]
8495
pub struct DropSequenceReq {
8596
pub if_exists: bool,

src/query/ast/src/ast/statements/sequence.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ impl Display for CreateSequenceStmt {
3939
if let CreateOption::CreateIfNotExists = self.create_option {
4040
write!(f, "IF NOT EXISTS ")?;
4141
}
42-
write!(f, " {}", self.sequence)?;
42+
write!(f, "{}", self.sequence)?;
4343
if let Some(comment) = &self.comment {
4444
write!(f, " COMMENT = {}", QuotedString(comment, '\''))?;
4545
}
@@ -59,7 +59,7 @@ impl Display for DropSequenceStmt {
5959
if self.if_exists {
6060
write!(f, "IF EXISTS ")?;
6161
}
62-
write!(f, " {}", self.sequence)?;
62+
write!(f, "{}", self.sequence)?;
6363
Ok(())
6464
}
6565
}

src/query/ast/src/ast/statements/statement.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,12 @@ pub enum Statement {
368368
// Sequence
369369
CreateSequence(CreateSequenceStmt),
370370
DropSequence(DropSequenceStmt),
371+
ShowSequences {
372+
show_options: Option<ShowOptions>,
373+
},
374+
DescSequence {
375+
name: Identifier,
376+
},
371377

372378
// Set priority for query
373379
SetPriority {
@@ -504,6 +510,8 @@ impl Statement {
504510
| Statement::DescribeNotification(..)
505511
| Statement::ExecuteImmediate(..)
506512
| Statement::ShowProcedures { .. }
513+
| Statement::ShowSequences { .. }
514+
| Statement::DescSequence { .. }
507515
| Statement::DescProcedure(..)
508516
| Statement::CallProcedure(..)
509517
| Statement::ShowWarehouses(..)
@@ -1006,6 +1014,15 @@ impl Display for Statement {
10061014
}
10071015
Statement::CreateSequence(stmt) => write!(f, "{stmt}")?,
10081016
Statement::DropSequence(stmt) => write!(f, "{stmt}")?,
1017+
Statement::ShowSequences { show_options } => {
1018+
write!(f, "SHOW SEQUENCES")?;
1019+
if let Some(show_options) = show_options {
1020+
write!(f, " {show_options}")?;
1021+
}
1022+
}
1023+
Statement::DescSequence { name } => {
1024+
write!(f, "DESC SEQUENCE {name}")?;
1025+
}
10091026
Statement::CreateDynamicTable(stmt) => write!(f, "{stmt}")?,
10101027
Statement::SetPriority {
10111028
priority,

src/query/ast/src/parser/sequence.rs

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,15 @@ use crate::parser::common::map_res;
2424
use crate::parser::common::IResult;
2525
use crate::parser::common::*;
2626
use crate::parser::input::Input;
27+
use crate::parser::statement::show_options;
2728
use crate::parser::token::*;
2829

2930
pub fn sequence(i: Input) -> IResult<Statement> {
3031
rule!(
31-
#create_sequence: "`CREATE [OR REPLACE] SEQUENCE [IF NOT EXISTS] <sequence> [COMMENT = '<string_literal>']`"
32-
| #drop_sequence: "`DROP [IF EXISTS] <sequence>`"
32+
#create_sequence: "`CREATE [OR REPLACE] SEQUENCE [IF NOT EXISTS] <sequence_name> [COMMENT = '<string_literal>']`"
33+
| #drop_sequence: "`DROP [IF EXISTS] <sequence_name>`"
34+
| #show_sequences: "`SHOW SEQUENCES [<show_limit>]`"
35+
| #desc_sequence: "`DESCRIBE SEQUENCE <sequence_name>`"
3336
)(i)
3437
}
3538

@@ -65,3 +68,21 @@ fn drop_sequence(i: Input) -> IResult<Statement> {
6568
},
6669
)(i)
6770
}
71+
72+
fn show_sequences(i: Input) -> IResult<Statement> {
73+
map_res(
74+
rule! {
75+
SHOW ~ SEQUENCES ~ #show_options?
76+
},
77+
|(_, _, show_options)| Ok(Statement::ShowSequences { show_options }),
78+
)(i)
79+
}
80+
81+
fn desc_sequence(i: Input) -> IResult<Statement> {
82+
map_res(
83+
rule! {
84+
( DESC | DESCRIBE ) ~ SEQUENCE ~ #ident
85+
},
86+
|(_, _, name)| Ok(Statement::DescSequence { name }),
87+
)(i)
88+
}

src/query/ast/src/parser/statement.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2500,7 +2500,6 @@ pub fn statement_body(i: Input) -> IResult<Statement> {
25002500
( DESC | DESCRIBE ) ~ PROCEDURE ~ #ident ~ #procedure_type_name
25012501
},
25022502
|(_, _, name, args)| {
2503-
// TODO: modify to ProcedureIdentify
25042503
Statement::DescProcedure(DescProcedureStmt {
25052504
name: ProcedureIdentity {
25062505
name: name.to_string(),

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1130,6 +1130,8 @@ pub enum TokenKind {
11301130
UPLOAD,
11311131
#[token("SEQUENCE", ignore(ascii_case))]
11321132
SEQUENCE,
1133+
#[token("SEQUENCES", ignore(ascii_case))]
1134+
SEQUENCES,
11331135
#[token("SHARE", ignore(ascii_case))]
11341136
SHARE,
11351137
#[token("SHARES", ignore(ascii_case))]
@@ -1686,6 +1688,7 @@ impl TokenKind {
16861688
| TokenKind::ANY
16871689
| TokenKind::FUNCTION
16881690
| TokenKind::PROCEDURE
1691+
| TokenKind::SEQUENCE
16891692
| TokenKind::ASC
16901693
| TokenKind::ANTI
16911694
// | TokenKind::ASYMMETRIC

src/query/ast/tests/it/parser.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -920,6 +920,10 @@ SELECT * from s;"#,
920920
RETURN sum;
921921
END;
922922
$$;"#,
923+
r#"DROP SEQUENCE IF EXISTS seq"#,
924+
r#"CREATE SEQUENCE seq comment='test'"#,
925+
r#"DESCRIBE SEQUENCE seq"#,
926+
r#"SHOW SEQUENCES LIKE '%seq%'"#,
923927
];
924928

925929
for case in cases {

0 commit comments

Comments
 (0)