Skip to content

Commit 4a5bb69

Browse files
authored
feat: impl show index and show columns (#3577)
* feat: impl show index and show columns * fix: show index from database * fix: canonicalize table name * refactor: show parsers
1 parent 18d6768 commit 4a5bb69

File tree

18 files changed

+841
-66
lines changed

18 files changed

+841
-66
lines changed

src/catalog/src/information_schema.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15-
mod columns;
16-
mod key_column_usage;
15+
pub mod columns;
16+
pub mod key_column_usage;
1717
mod memory_table;
1818
mod partitions;
1919
mod predicate;

src/catalog/src/information_schema/columns.rs

+9-9
Original file line numberDiff line numberDiff line change
@@ -48,16 +48,16 @@ pub(super) struct InformationSchemaColumns {
4848
catalog_manager: Weak<dyn CatalogManager>,
4949
}
5050

51-
const TABLE_CATALOG: &str = "table_catalog";
52-
const TABLE_SCHEMA: &str = "table_schema";
53-
const TABLE_NAME: &str = "table_name";
54-
const COLUMN_NAME: &str = "column_name";
55-
const DATA_TYPE: &str = "data_type";
56-
const SEMANTIC_TYPE: &str = "semantic_type";
57-
const COLUMN_DEFAULT: &str = "column_default";
58-
const IS_NULLABLE: &str = "is_nullable";
51+
pub const TABLE_CATALOG: &str = "table_catalog";
52+
pub const TABLE_SCHEMA: &str = "table_schema";
53+
pub const TABLE_NAME: &str = "table_name";
54+
pub const COLUMN_NAME: &str = "column_name";
55+
pub const DATA_TYPE: &str = "data_type";
56+
pub const SEMANTIC_TYPE: &str = "semantic_type";
57+
pub const COLUMN_DEFAULT: &str = "column_default";
58+
pub const IS_NULLABLE: &str = "is_nullable";
5959
const COLUMN_TYPE: &str = "column_type";
60-
const COLUMN_COMMENT: &str = "column_comment";
60+
pub const COLUMN_COMMENT: &str = "column_comment";
6161
const INIT_CAPACITY: usize = 42;
6262

6363
impl InformationSchemaColumns {

src/catalog/src/information_schema/key_column_usage.rs

+25-8
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,16 @@ use crate::error::{
3737
use crate::information_schema::{InformationTable, Predicates};
3838
use crate::CatalogManager;
3939

40-
const CONSTRAINT_SCHEMA: &str = "constraint_schema";
41-
const CONSTRAINT_NAME: &str = "constraint_name";
42-
const TABLE_CATALOG: &str = "table_catalog";
43-
const TABLE_SCHEMA: &str = "table_schema";
44-
const TABLE_NAME: &str = "table_name";
45-
const COLUMN_NAME: &str = "column_name";
46-
const ORDINAL_POSITION: &str = "ordinal_position";
40+
pub const CONSTRAINT_SCHEMA: &str = "constraint_schema";
41+
pub const CONSTRAINT_NAME: &str = "constraint_name";
42+
// It's always `def` in MySQL
43+
pub const TABLE_CATALOG: &str = "table_catalog";
44+
// The real catalog name for this key column.
45+
pub const REAL_TABLE_CATALOG: &str = "real_table_catalog";
46+
pub const TABLE_SCHEMA: &str = "table_schema";
47+
pub const TABLE_NAME: &str = "table_name";
48+
pub const COLUMN_NAME: &str = "column_name";
49+
pub const ORDINAL_POSITION: &str = "ordinal_position";
4750
const INIT_CAPACITY: usize = 42;
4851

4952
/// The virtual table implementation for `information_schema.KEY_COLUMN_USAGE`.
@@ -76,6 +79,11 @@ impl InformationSchemaKeyColumnUsage {
7679
),
7780
ColumnSchema::new(CONSTRAINT_NAME, ConcreteDataType::string_datatype(), false),
7881
ColumnSchema::new(TABLE_CATALOG, ConcreteDataType::string_datatype(), false),
82+
ColumnSchema::new(
83+
REAL_TABLE_CATALOG,
84+
ConcreteDataType::string_datatype(),
85+
false,
86+
),
7987
ColumnSchema::new(TABLE_SCHEMA, ConcreteDataType::string_datatype(), false),
8088
ColumnSchema::new(TABLE_NAME, ConcreteDataType::string_datatype(), false),
8189
ColumnSchema::new(COLUMN_NAME, ConcreteDataType::string_datatype(), false),
@@ -158,6 +166,7 @@ struct InformationSchemaKeyColumnUsageBuilder {
158166
constraint_schema: StringVectorBuilder,
159167
constraint_name: StringVectorBuilder,
160168
table_catalog: StringVectorBuilder,
169+
real_table_catalog: StringVectorBuilder,
161170
table_schema: StringVectorBuilder,
162171
table_name: StringVectorBuilder,
163172
column_name: StringVectorBuilder,
@@ -179,6 +188,7 @@ impl InformationSchemaKeyColumnUsageBuilder {
179188
constraint_schema: StringVectorBuilder::with_capacity(INIT_CAPACITY),
180189
constraint_name: StringVectorBuilder::with_capacity(INIT_CAPACITY),
181190
table_catalog: StringVectorBuilder::with_capacity(INIT_CAPACITY),
191+
real_table_catalog: StringVectorBuilder::with_capacity(INIT_CAPACITY),
182192
table_schema: StringVectorBuilder::with_capacity(INIT_CAPACITY),
183193
table_name: StringVectorBuilder::with_capacity(INIT_CAPACITY),
184194
column_name: StringVectorBuilder::with_capacity(INIT_CAPACITY),
@@ -223,6 +233,7 @@ impl InformationSchemaKeyColumnUsageBuilder {
223233
&predicates,
224234
&schema_name,
225235
"TIME INDEX",
236+
&catalog_name,
226237
&schema_name,
227238
&table_name,
228239
&column.name,
@@ -231,6 +242,7 @@ impl InformationSchemaKeyColumnUsageBuilder {
231242
}
232243
if keys.contains(&idx) {
233244
primary_constraints.push((
245+
catalog_name.clone(),
234246
schema_name.clone(),
235247
table_name.clone(),
236248
column.name.clone(),
@@ -244,13 +256,14 @@ impl InformationSchemaKeyColumnUsageBuilder {
244256
}
245257
}
246258

247-
for (i, (schema_name, table_name, column_name)) in
259+
for (i, (catalog_name, schema_name, table_name, column_name)) in
248260
primary_constraints.into_iter().enumerate()
249261
{
250262
self.add_key_column_usage(
251263
&predicates,
252264
&schema_name,
253265
"PRIMARY",
266+
&catalog_name,
254267
&schema_name,
255268
&table_name,
256269
&column_name,
@@ -269,6 +282,7 @@ impl InformationSchemaKeyColumnUsageBuilder {
269282
predicates: &Predicates,
270283
constraint_schema: &str,
271284
constraint_name: &str,
285+
table_catalog: &str,
272286
table_schema: &str,
273287
table_name: &str,
274288
column_name: &str,
@@ -277,6 +291,7 @@ impl InformationSchemaKeyColumnUsageBuilder {
277291
let row = [
278292
(CONSTRAINT_SCHEMA, &Value::from(constraint_schema)),
279293
(CONSTRAINT_NAME, &Value::from(constraint_name)),
294+
(REAL_TABLE_CATALOG, &Value::from(table_catalog)),
280295
(TABLE_SCHEMA, &Value::from(table_schema)),
281296
(TABLE_NAME, &Value::from(table_name)),
282297
(COLUMN_NAME, &Value::from(column_name)),
@@ -291,6 +306,7 @@ impl InformationSchemaKeyColumnUsageBuilder {
291306
self.constraint_schema.push(Some(constraint_schema));
292307
self.constraint_name.push(Some(constraint_name));
293308
self.table_catalog.push(Some("def"));
309+
self.real_table_catalog.push(Some(table_catalog));
294310
self.table_schema.push(Some(table_schema));
295311
self.table_name.push(Some(table_name));
296312
self.column_name.push(Some(column_name));
@@ -310,6 +326,7 @@ impl InformationSchemaKeyColumnUsageBuilder {
310326
Arc::new(self.constraint_schema.finish()),
311327
Arc::new(self.constraint_name.finish()),
312328
Arc::new(self.table_catalog.finish()),
329+
Arc::new(self.real_table_catalog.finish()),
313330
Arc::new(self.table_schema.finish()),
314331
Arc::new(self.table_name.finish()),
315332
Arc::new(self.column_name.finish()),

src/frontend/src/instance.rs

+18-5
Original file line numberDiff line numberDiff line change
@@ -455,6 +455,17 @@ impl PrometheusHandler for Instance {
455455
}
456456
}
457457

458+
/// Validate `stmt.database` permission if it's presented.
459+
macro_rules! validate_db_permission {
460+
($stmt: expr, $query_ctx: expr) => {
461+
if let Some(database) = &$stmt.database {
462+
validate_catalog_and_schema($query_ctx.current_catalog(), database, $query_ctx)
463+
.map_err(BoxedError::new)
464+
.context(SqlExecInterceptedSnafu)?;
465+
}
466+
};
467+
}
468+
458469
pub fn check_permission(
459470
plugins: Plugins,
460471
stmt: &Statement,
@@ -495,11 +506,13 @@ pub fn check_permission(
495506
validate_param(drop_stmt.table_name(), query_ctx)?;
496507
}
497508
Statement::ShowTables(stmt) => {
498-
if let Some(database) = &stmt.database {
499-
validate_catalog_and_schema(query_ctx.current_catalog(), database, query_ctx)
500-
.map_err(BoxedError::new)
501-
.context(SqlExecInterceptedSnafu)?;
502-
}
509+
validate_db_permission!(stmt, query_ctx);
510+
}
511+
Statement::ShowColumns(stmt) => {
512+
validate_db_permission!(stmt, query_ctx);
513+
}
514+
Statement::ShowIndex(stmt) => {
515+
validate_db_permission!(stmt, query_ctx);
503516
}
504517
Statement::DescribeTable(stmt) => {
505518
validate_param(stmt.name(), query_ctx)?;

src/operator/src/statement.rs

+4
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,10 @@ impl StatementExecutor {
239239
Ok(Output::new_with_affected_rows(0))
240240
}
241241
Statement::ShowVariables(show_variable) => self.show_variable(show_variable, query_ctx),
242+
Statement::ShowColumns(show_columns) => {
243+
self.show_columns(show_columns, query_ctx).await
244+
}
245+
Statement::ShowIndex(show_index) => self.show_index(show_index, query_ctx).await,
242246
}
243247
}
244248

src/operator/src/statement/show.rs

+23-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ use session::context::QueryContextRef;
2121
use snafu::ResultExt;
2222
use sql::ast::Ident;
2323
use sql::statements::create::Partitions;
24-
use sql::statements::show::{ShowDatabases, ShowTables, ShowVariables};
24+
use sql::statements::show::{ShowColumns, ShowDatabases, ShowIndex, ShowTables, ShowVariables};
2525
use table::TableRef;
2626

2727
use crate::error::{self, ExecuteStatementSnafu, Result};
@@ -50,6 +50,28 @@ impl StatementExecutor {
5050
.context(ExecuteStatementSnafu)
5151
}
5252

53+
#[tracing::instrument(skip_all)]
54+
pub(super) async fn show_columns(
55+
&self,
56+
stmt: ShowColumns,
57+
query_ctx: QueryContextRef,
58+
) -> Result<Output> {
59+
query::sql::show_columns(stmt, &self.query_engine, &self.catalog_manager, query_ctx)
60+
.await
61+
.context(ExecuteStatementSnafu)
62+
}
63+
64+
#[tracing::instrument(skip_all)]
65+
pub(super) async fn show_index(
66+
&self,
67+
stmt: ShowIndex,
68+
query_ctx: QueryContextRef,
69+
) -> Result<Output> {
70+
query::sql::show_index(stmt, &self.query_engine, &self.catalog_manager, query_ctx)
71+
.await
72+
.context(ExecuteStatementSnafu)
73+
}
74+
5375
#[tracing::instrument(skip_all)]
5476
pub async fn show_create_table(
5577
&self,

0 commit comments

Comments
 (0)