Skip to content

Commit c412f20

Browse files
authored
fix(query): Ensure visibility of all columns in subqueries (#17934)
* fix(query): Ensure visibility of all columns in subqueries * fix fmt * fix
1 parent d3bc3a6 commit c412f20

File tree

5 files changed

+151
-12
lines changed

5 files changed

+151
-12
lines changed

src/query/sql/src/planner/binder/bind_table_reference/bind_subquery.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,12 @@
1515
use databend_common_ast::ast::Query;
1616
use databend_common_ast::ast::TableAlias;
1717
use databend_common_exception::Result;
18+
use databend_common_expression::is_stream_column;
1819

1920
use crate::binder::Binder;
2021
use crate::optimizer::ir::SExpr;
2122
use crate::BindContext;
23+
use crate::Visibility;
2224

2325
impl Binder {
2426
/// Bind a subquery.
@@ -53,6 +55,15 @@ impl Binder {
5355
.change_derived_column_alias(column.index, column.column_name.clone());
5456
}
5557
}
58+
59+
// Set all columns as Visible, because the outer query may use `SELECT *` to get all columns.
60+
for column in result_bind_context.columns.iter_mut() {
61+
if is_stream_column(&column.column_name) {
62+
continue;
63+
}
64+
column.visibility = Visibility::Visible;
65+
}
66+
5667
Ok((result, result_bind_context))
5768
}
5869
}

src/query/storages/fuse/src/io/write/virtual_column_builder.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -80,15 +80,13 @@ impl VirtualColumnBuilder {
8080
.get_settings()
8181
.get_enable_experimental_virtual_column()
8282
.unwrap_or_default()
83+
|| LicenseManagerSwitch::instance()
84+
.check_enterprise_enabled(ctx.get_license_key(), Feature::VirtualColumn)
85+
.is_err()
8386
{
8487
return None;
8588
}
86-
if LicenseManagerSwitch::instance()
87-
.check_enterprise_enabled(ctx.get_license_key(), Feature::VirtualColumn)
88-
.is_err()
89-
{
90-
return None;
91-
}
89+
9290
// ignore persistent system tables {
9391
if let Ok(database_name) = table_info.database_name() {
9492
if database_name == "persistent_system" {

src/query/storages/fuse/src/statistics/accumulator.rs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -82,12 +82,9 @@ impl VirtualColumnAccumulator {
8282
.get_settings()
8383
.get_enable_experimental_virtual_column()
8484
.unwrap_or_default()
85-
{
86-
return None;
87-
}
88-
if LicenseManagerSwitch::instance()
89-
.check_enterprise_enabled(ctx.get_license_key(), Feature::VirtualColumn)
90-
.is_err()
85+
|| LicenseManagerSwitch::instance()
86+
.check_enterprise_enabled(ctx.get_license_key(), Feature::VirtualColumn)
87+
.is_err()
9188
{
9289
return None;
9390
}

tests/sqllogictests/suites/base/03_common/03_0026_insert_into_tuple.test

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,12 @@ select t.1, t.2, t.3, t.4, t.5, t.6 from t1
2525
1 100 12.34 abc 2020-01-01 2020-01-01 00:00:00.000000
2626
0 200 -25.73 xyz 2022-06-01 2022-06-01 12:00:00.000000
2727

28+
query IBIF
29+
select * from (select id, t.1 as a, t.2 as b, t.3 as c from t1);
30+
----
31+
1 1 100 12.34
32+
2 0 200 -25.73
33+
2834
statement error 1065
2935
select t[1.1] from t1
3036

@@ -128,3 +134,4 @@ select t:a:m, t:a:n, t:a, t:b:w, t:b:x, t:b:y, t:b:z, t:b from v5
128134

129135
statement ok
130136
DROP DATABASE db1
137+

tests/sqllogictests/suites/ee/01_ee_system/01_0002_virtual_column.test

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -426,6 +426,132 @@ select id, data['id'], data['create'], data['text'], data['user']['id'], data['r
426426
12 12 "3/19" "vv" 16 10 {"lat":4.0} 4.0 NULL NULL
427427
13 13 "4/18" "u" 13 6 {"lat":3.0} 3.0 NULL NULL
428428

429+
statement ok
430+
CREATE OR REPLACE TABLE STUDENT_GRADES (
431+
SCHOOL_ID VARCHAR,
432+
STUDENT_ID VARCHAR,
433+
GRADE_CODE VARCHAR,
434+
GRADE_DESCRIPTION VARCHAR,
435+
HONOR_ROLL VARCHAR(1)
436+
);
437+
438+
statement ok
439+
CREATE OR REPLACE TABLE SCHOOL (
440+
SCHOOL_ID VARCHAR,
441+
SCHOOL_CODE VARCHAR
442+
);
443+
444+
statement ok
445+
CREATE OR REPLACE TABLE Student_Current (
446+
id VARCHAR,
447+
school_code VARCHAR,
448+
update_date TIMESTAMP
449+
);
450+
451+
statement ok
452+
CREATE OR REPLACE TABLE Academic_Record (
453+
student_id VARCHAR,
454+
school_code VARCHAR,
455+
record_data VARIANT
456+
);
457+
458+
statement ok
459+
INSERT INTO SCHOOL VALUES
460+
('S001', 'HIGH_SCHOOL'),
461+
('S002', 'MIDDLE_SCHOOL'),
462+
('S003', 'DISTRICT');
463+
464+
statement ok
465+
INSERT INTO Student_Current VALUES
466+
('ST001', 'HIGH_SCHOOL', '2023-05-12T10:00:00.000000'),
467+
('ST002', 'MIDDLE_SCHOOL', '2023-05-12T11:00:00.000000'),
468+
('ST003', 'DISTRICT', '2023-05-12T12:00:00.000000');
469+
470+
statement ok
471+
INSERT INTO Academic_Record VALUES
472+
('ST001', 'HIGH_SCHOOL', '{
473+
"academic": {
474+
"performance": {
475+
"grade_code": "A",
476+
"grade_desc": "Excellent",
477+
"extra_credits": 2
478+
}
479+
},
480+
"eligible_schools": ["HIGH_SCHOOL", "DISTRICT"]
481+
}'),
482+
('ST002', 'MIDDLE_SCHOOL', '{
483+
"academic": {
484+
"performance": {
485+
"grade_code": "B",
486+
"grade_desc": "Good",
487+
"extra_credits": 1
488+
}
489+
},
490+
"eligible_schools": ["MIDDLE_SCHOOL"]
491+
}'),
492+
('ST003', 'DISTRICT', '{
493+
"academic": {
494+
"performance": {
495+
"grade_code": "C",
496+
"grade_desc": "Average",
497+
"extra_credits": 0
498+
}
499+
},
500+
"eligible_schools": ["HIGH_SCHOOL", "ELEMENTARY"]
501+
}');
502+
503+
query T
504+
MERGE INTO STUDENT_GRADES tgt USING
505+
(
506+
SELECT *
507+
FROM
508+
(
509+
SELECT
510+
s.school_id,
511+
sc.id AS student_id,
512+
ar.record_data:academic.performance.grade_code AS grade_code,
513+
ar.record_data:academic.performance.grade_desc AS grade_description,
514+
CASE WHEN ar.record_data:academic.performance.extra_credits::INT > 0 THEN 'Y'
515+
ELSE 'N' END AS honor_roll,
516+
ROW_NUMBER() OVER (PARTITION BY s.school_id, sc.id ORDER BY NULL) row_number
517+
FROM Student_Current sc
518+
JOIN Academic_Record ar ON sc.id = ar.student_id
519+
JOIN SCHOOL s ON s.SCHOOL_CODE = sc.school_code OR
520+
(ar.school_code = 'DISTRICT' AND s.school_code IN (ar.record_data:eligible_schools))
521+
WHERE sc.update_date >= '2023-05-01T00:00:00.000000'
522+
)
523+
WHERE row_number = 1
524+
) src ON src.school_id = tgt.school_id
525+
AND src.student_id = tgt.student_id
526+
WHEN MATCHED THEN
527+
UPDATE SET
528+
tgt.GRADE_CODE = src.GRADE_CODE,
529+
tgt.GRADE_DESCRIPTION = src.GRADE_DESCRIPTION,
530+
tgt.HONOR_ROLL = src.HONOR_ROLL
531+
WHEN NOT MATCHED THEN
532+
INSERT (
533+
SCHOOL_ID,
534+
STUDENT_ID,
535+
GRADE_CODE,
536+
GRADE_DESCRIPTION,
537+
HONOR_ROLL
538+
) VALUES (
539+
src.SCHOOL_ID,
540+
src.STUDENT_ID,
541+
src.GRADE_CODE,
542+
src.GRADE_DESCRIPTION,
543+
src.HONOR_ROLL
544+
);
545+
----
546+
3 0
547+
548+
query TTTTT
549+
SELECT * FROM STUDENT_GRADES ORDER BY school_id;
550+
----
551+
S001 ST001 A Excellent Y
552+
S002 ST002 B Good Y
553+
S003 ST003 C Average N
554+
429555
statement ok
430556
set enable_experimental_virtual_column = 0;
431557

0 commit comments

Comments
 (0)