Skip to content

Commit 9dc2366

Browse files
committed
Merge branch 'main' into chore-hnsw-quantization-simd
2 parents 3aba99a + ac1fee9 commit 9dc2366

File tree

3 files changed

+91
-20
lines changed

3 files changed

+91
-20
lines changed

src/query/sql/src/planner/binder/default_expr.rs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,11 @@ impl DefaultExprBinder {
168168
Ok(ast)
169169
}
170170

171-
pub fn bind(&mut self, ast: &AExpr) -> Result<(ScalarExpr, DataType)> {
171+
fn bind_impl(
172+
&mut self,
173+
ast: &AExpr,
174+
skip_sequence_check: bool,
175+
) -> Result<(ScalarExpr, DataType)> {
172176
let mut type_checker = TypeChecker::try_create(
173177
&mut self.bind_context,
174178
self.ctx.clone(),
@@ -177,10 +181,17 @@ impl DefaultExprBinder {
177181
&[],
178182
true,
179183
)?;
184+
if skip_sequence_check {
185+
type_checker.set_skip_sequence_check(true);
186+
}
180187
let (scalar_expr, data_type) = *type_checker.resolve(ast)?;
181188
Ok((scalar_expr, data_type))
182189
}
183190

191+
pub fn bind(&mut self, ast: &AExpr) -> Result<(ScalarExpr, DataType)> {
192+
self.bind_impl(ast, false)
193+
}
194+
184195
pub fn parse_and_bind(&mut self, field: &DataField) -> Result<ScalarExpr> {
185196
if let Some(default_expr) = field.default_expr() {
186197
let ast = self.parse(default_expr).map_err(|e| {
@@ -192,7 +203,7 @@ impl DefaultExprBinder {
192203
e
193204
)
194205
})?;
195-
let (scalar_expr, data_type) = self.bind(&ast)?;
206+
let (scalar_expr, data_type) = self.bind_impl(&ast, true)?;
196207
let dest_type = field.data_type();
197208
if data_type != *dest_type {
198209
Ok(wrap_cast(&scalar_expr, dest_type))

src/query/sql/src/planner/semantic/type_check.rs

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,9 @@ pub struct TypeChecker<'a> {
238238
// true if currently resolving a masking policy expression.
239239
// This prevents infinite recursion when a masking policy references the masked column itself.
240240
in_masking_policy: bool,
241+
242+
// Skip sequence existence checks when resolving `nextval`.
243+
skip_sequence_check: bool,
241244
}
242245

243246
impl<'a> TypeChecker<'a> {
@@ -263,9 +266,14 @@ impl<'a> TypeChecker<'a> {
263266
in_window_function: false,
264267
forbid_udf,
265268
in_masking_policy: false,
269+
skip_sequence_check: false,
266270
})
267271
}
268272

273+
pub fn set_skip_sequence_check(&mut self, skip: bool) {
274+
self.skip_sequence_check = skip;
275+
}
276+
269277
#[recursive::recursive]
270278
pub fn resolve(&mut self, expr: &Expr) -> Result<Box<(ScalarExpr, DataType)>> {
271279
let box (scalar, data_type): Box<(ScalarExpr, DataType)> = match expr {
@@ -5728,25 +5736,29 @@ impl<'a> TypeChecker<'a> {
57285736
.set_span(span));
57295737
};
57305738

5731-
let catalog = self.ctx.get_default_catalog()?;
5732-
let req = GetSequenceReq {
5733-
ident: SequenceIdent::new(self.ctx.get_tenant(), sequence_name.clone()),
5734-
};
5739+
if !self.skip_sequence_check {
5740+
let catalog = self.ctx.get_default_catalog()?;
5741+
let req = GetSequenceReq {
5742+
ident: SequenceIdent::new(self.ctx.get_tenant(), sequence_name.clone()),
5743+
};
57355744

5736-
let visibility_checker = if self
5737-
.ctx
5738-
.get_settings()
5739-
.get_enable_experimental_sequence_privilege_check()?
5740-
{
5741-
Some(databend_common_base::runtime::block_on(async move {
5742-
self.ctx
5743-
.get_visibility_checker(false, Object::Sequence)
5744-
.await
5745-
})?)
5746-
} else {
5747-
None
5748-
};
5749-
databend_common_base::runtime::block_on(catalog.get_sequence(req, &visibility_checker))?;
5745+
let visibility_checker = if self
5746+
.ctx
5747+
.get_settings()
5748+
.get_enable_experimental_sequence_privilege_check()?
5749+
{
5750+
Some(databend_common_base::runtime::block_on(async move {
5751+
self.ctx
5752+
.get_visibility_checker(false, Object::Sequence)
5753+
.await
5754+
})?)
5755+
} else {
5756+
None
5757+
};
5758+
databend_common_base::runtime::block_on(
5759+
catalog.get_sequence(req, &visibility_checker),
5760+
)?;
5761+
}
57505762

57515763
let return_type = DataType::Number(NumberDataType::UInt64);
57525764
let func_arg = AsyncFunctionArgument::SequenceFunction(sequence_name);

tests/sqllogictests/suites/stage/sequence_as_default.test

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,51 @@ select * from tmp order by seq;
2626
3 0 5
2727
4 1 6
2828
5 2 7
29+
30+
statement ok
31+
create or replace sequence seq90;
32+
33+
statement ok
34+
create or replace table sequence_demo (i integer default nextval(seq90), dummy smallint);
35+
36+
statement ok
37+
drop table sequence_demo;
38+
39+
statement ok
40+
drop sequence seq90;
41+
42+
statement ok
43+
undrop table sequence_demo;
44+
45+
query II
46+
select * from sequence_demo;
47+
----
48+
49+
statement error 3101
50+
insert into sequence_demo(dummy) values(1);
51+
52+
statement ok
53+
insert into sequence_demo values(100, 100);
54+
55+
query II
56+
select * from sequence_demo order by dummy;
57+
----
58+
100 100
59+
60+
statement ok
61+
alter table sequence_demo modify column i integer default 0;
62+
63+
statement ok
64+
insert into sequence_demo(dummy) values(2);
65+
66+
query II
67+
select * from sequence_demo order by dummy;
68+
----
69+
0 2
70+
100 100
71+
72+
statement ok
73+
drop table if exists sequence_demo;
74+
75+
statement ok
76+
drop sequence if exists seq90;

0 commit comments

Comments
 (0)