1use std::sync::Arc;
16
17use common_catalog::consts::{METRIC_ENGINE, MITO_ENGINE};
18use datatypes::data_type::ConcreteDataType;
19use datatypes::schema::{ColumnSchema, Schema, SchemaRef};
20use datatypes::vectors::{Int64Vector, StringVector, VectorRef};
21
22use crate::system_schema::information_schema::table_names::*;
23use crate::system_schema::utils::tables::{
24 bigint_column, string_column, string_columns, timestamp_micro_column,
25};
26
27const NO_VALUE: &str = "NO";
28
29pub(super) fn get_schema_columns(table_name: &str) -> (SchemaRef, Vec<VectorRef>) {
32 let (column_schemas, columns): (_, Vec<VectorRef>) = match table_name {
33 COLUMN_PRIVILEGES => (
34 string_columns(&[
35 "GRANTEE",
36 "TABLE_CATALOG",
37 "TABLE_SCHEMA",
38 "TABLE_NAME",
39 "COLUMN_NAME",
40 "PRIVILEGE_TYPE",
41 "IS_GRANTABLE",
42 ]),
43 vec![],
44 ),
45
46 COLUMN_STATISTICS => (
47 string_columns(&[
48 "SCHEMA_NAME",
49 "TABLE_NAME",
50 "COLUMN_NAME",
51 "HISTOGRAM",
53 ]),
54 vec![],
55 ),
56
57 ENGINES => (
58 string_columns(&[
59 "ENGINE",
60 "SUPPORT",
61 "COMMENT",
62 "TRANSACTIONS",
63 "XA",
64 "SAVEPOINTS",
65 ]),
66 vec![
67 Arc::new(StringVector::from(vec![MITO_ENGINE, METRIC_ENGINE])),
68 Arc::new(StringVector::from(vec!["DEFAULT", "YES"])),
69 Arc::new(StringVector::from(vec![
70 "Storage engine for time-series data",
71 "Storage engine for observability scenarios, which is adept at handling a large number of small tables, making it particularly suitable for cloud-native monitoring",
72 ])),
73 Arc::new(StringVector::from(vec![NO_VALUE, NO_VALUE])),
74 Arc::new(StringVector::from(vec![NO_VALUE, NO_VALUE])),
75 Arc::new(StringVector::from(vec![NO_VALUE, NO_VALUE])),
76 ],
77 ),
78
79 BUILD_INFO => {
80 let build_info = common_version::build_info();
81 (
82 string_columns(&[
83 "GIT_BRANCH",
84 "GIT_COMMIT",
85 "GIT_COMMIT_SHORT",
86 "GIT_CLEAN",
87 "PKG_VERSION",
88 ]),
89 vec![
90 Arc::new(StringVector::from(vec![build_info.branch.to_string()])),
91 Arc::new(StringVector::from(vec![build_info.commit.to_string()])),
92 Arc::new(StringVector::from(vec![build_info
93 .commit_short
94 .to_string()])),
95 Arc::new(StringVector::from(vec![build_info.clean.to_string()])),
96 Arc::new(StringVector::from(vec![build_info.version.to_string()])),
97 ],
98 )
99 }
100
101 CHARACTER_SETS => (
102 vec![
103 string_column("CHARACTER_SET_NAME"),
104 string_column("DEFAULT_COLLATE_NAME"),
105 string_column("DESCRIPTION"),
106 bigint_column("MAXLEN"),
107 ],
108 vec![
109 Arc::new(StringVector::from(vec!["utf8"])),
110 Arc::new(StringVector::from(vec!["utf8_bin"])),
111 Arc::new(StringVector::from(vec!["UTF-8 Unicode"])),
112 Arc::new(Int64Vector::from_slice([4])),
113 ],
114 ),
115
116 COLLATIONS => (
117 vec![
118 string_column("COLLATION_NAME"),
119 string_column("CHARACTER_SET_NAME"),
120 bigint_column("ID"),
121 string_column("IS_DEFAULT"),
122 string_column("IS_COMPILED"),
123 bigint_column("SORTLEN"),
124 ],
125 vec![
126 Arc::new(StringVector::from(vec!["utf8_bin"])),
127 Arc::new(StringVector::from(vec!["utf8"])),
128 Arc::new(Int64Vector::from_slice([1])),
129 Arc::new(StringVector::from(vec!["Yes"])),
130 Arc::new(StringVector::from(vec!["Yes"])),
131 Arc::new(Int64Vector::from_slice([1])),
132 ],
133 ),
134
135 COLLATION_CHARACTER_SET_APPLICABILITY => (
136 vec![
137 string_column("COLLATION_NAME"),
138 string_column("CHARACTER_SET_NAME"),
139 ],
140 vec![
141 Arc::new(StringVector::from(vec!["utf8_bin"])),
142 Arc::new(StringVector::from(vec!["utf8"])),
143 ],
144 ),
145
146 CHECK_CONSTRAINTS => (
147 string_columns(&[
148 "CONSTRAINT_CATALOG",
149 "CONSTRAINT_SCHEMA",
150 "CONSTRAINT_NAME",
151 "CHECK_CLAUSE",
152 ]),
153 vec![],
155 ),
156
157 EVENTS => (
158 vec![
159 string_column("EVENT_CATALOG"),
160 string_column("EVENT_SCHEMA"),
161 string_column("EVENT_NAME"),
162 string_column("DEFINER"),
163 string_column("TIME_ZONE"),
164 string_column("EVENT_BODY"),
165 string_column("EVENT_DEFINITION"),
166 string_column("EVENT_TYPE"),
167 timestamp_micro_column("EXECUTE_AT"),
168 bigint_column("INTERVAL_VALUE"),
169 string_column("INTERVAL_FIELD"),
170 string_column("SQL_MODE"),
171 timestamp_micro_column("STARTS"),
172 timestamp_micro_column("ENDS"),
173 string_column("STATUS"),
174 string_column("ON_COMPLETION"),
175 timestamp_micro_column("CREATED"),
176 timestamp_micro_column("LAST_ALTERED"),
177 timestamp_micro_column("LAST_EXECUTED"),
178 string_column("EVENT_COMMENT"),
179 bigint_column("ORIGINATOR"),
180 string_column("CHARACTER_SET_CLIENT"),
181 string_column("COLLATION_CONNECTION"),
182 string_column("DATABASE_COLLATION"),
183 ],
184 vec![],
185 ),
186
187 FILES => (
188 vec![
189 bigint_column("FILE_ID"),
190 string_column("FILE_NAME"),
191 string_column("FILE_TYPE"),
192 string_column("TABLESPACE_NAME"),
193 string_column("TABLE_CATALOG"),
194 string_column("TABLE_SCHEMA"),
195 string_column("TABLE_NAME"),
196 string_column("LOGFILE_GROUP_NAME"),
197 bigint_column("LOGFILE_GROUP_NUMBER"),
198 string_column("ENGINE"),
199 string_column("FULLTEXT_KEYS"),
200 bigint_column("DELETED_ROWS"),
201 bigint_column("UPDATE_COUNT"),
202 bigint_column("FREE_EXTENTS"),
203 bigint_column("TOTAL_EXTENTS"),
204 bigint_column("EXTENT_SIZE"),
205 bigint_column("INITIAL_SIZE"),
206 bigint_column("MAXIMUM_SIZE"),
207 bigint_column("AUTOEXTEND_SIZE"),
208 timestamp_micro_column("CREATION_TIME"),
209 timestamp_micro_column("LAST_UPDATE_TIME"),
210 timestamp_micro_column("LAST_ACCESS_TIME"),
211 timestamp_micro_column("RECOVER_TIME"),
212 bigint_column("TRANSACTION_COUNTER"),
213 string_column("VERSION"),
214 string_column("ROW_FORMAT"),
215 bigint_column("TABLE_ROWS"),
216 bigint_column("AVG_ROW_LENGTH"),
217 bigint_column("DATA_LENGTH"),
218 bigint_column("MAX_DATA_LENGTH"),
219 bigint_column("INDEX_LENGTH"),
220 bigint_column("DATA_FREE"),
221 timestamp_micro_column("CREATE_TIME"),
222 timestamp_micro_column("UPDATE_TIME"),
223 timestamp_micro_column("CHECK_TIME"),
224 string_column("CHECKSUM"),
225 string_column("STATUS"),
226 string_column("EXTRA"),
227 ],
228 vec![],
229 ),
230
231 OPTIMIZER_TRACE => (
232 vec![
233 string_column("QUERY"),
234 string_column("TRACE"),
235 bigint_column("MISSING_BYTES_BEYOND_MAX_MEM_SIZE"),
236 bigint_column("INSUFFICIENT_PRIVILEGES"),
237 ],
238 vec![],
239 ),
240
241 PARAMETERS => (
246 vec![
247 string_column("SPECIFIC_CATALOG"),
248 string_column("SPECIFIC_SCHEMA"),
249 string_column("SPECIFIC_NAME"),
250 bigint_column("ORDINAL_POSITION"),
251 string_column("PARAMETER_MODE"),
252 string_column("PARAMETER_NAME"),
253 string_column("DATA_TYPE"),
254 bigint_column("CHARACTER_MAXIMUM_LENGTH"),
255 bigint_column("CHARACTER_OCTET_LENGTH"),
256 bigint_column("NUMERIC_PRECISION"),
257 bigint_column("NUMERIC_SCALE"),
258 bigint_column("DATETIME_PRECISION"),
259 string_column("CHARACTER_SET_NAME"),
260 string_column("COLLATION_NAME"),
261 string_column("DTD_IDENTIFIER"),
262 string_column("ROUTINE_TYPE"),
263 ],
264 vec![],
265 ),
266
267 PROFILING => (
268 vec![
269 bigint_column("QUERY_ID"),
270 bigint_column("SEQ"),
271 string_column("STATE"),
272 bigint_column("DURATION"),
273 bigint_column("CPU_USER"),
274 bigint_column("CPU_SYSTEM"),
275 bigint_column("CONTEXT_VOLUNTARY"),
276 bigint_column("CONTEXT_INVOLUNTARY"),
277 bigint_column("BLOCK_OPS_IN"),
278 bigint_column("BLOCK_OPS_OUT"),
279 bigint_column("MESSAGES_SENT"),
280 bigint_column("MESSAGES_RECEIVED"),
281 bigint_column("PAGE_FAULTS_MAJOR"),
282 bigint_column("PAGE_FAULTS_MINOR"),
283 bigint_column("SWAPS"),
284 string_column("SOURCE_FUNCTION"),
285 string_column("SOURCE_FILE"),
286 bigint_column("SOURCE_LINE"),
287 ],
288 vec![],
289 ),
290
291 REFERENTIAL_CONSTRAINTS => (
293 vec![
294 string_column("CONSTRAINT_CATALOG"),
295 string_column("CONSTRAINT_SCHEMA"),
296 string_column("CONSTRAINT_NAME"),
297 string_column("UNIQUE_CONSTRAINT_CATALOG"),
298 string_column("UNIQUE_CONSTRAINT_SCHEMA"),
299 string_column("UNIQUE_CONSTRAINT_NAME"),
300 string_column("MATCH_OPTION"),
301 string_column("UPDATE_RULE"),
302 string_column("DELETE_RULE"),
303 string_column("TABLE_NAME"),
304 string_column("REFERENCED_TABLE_NAME"),
305 ],
306 vec![],
307 ),
308
309 ROUTINES => (
310 vec![
311 string_column("SPECIFIC_NAME"),
312 string_column("ROUTINE_CATALOG"),
313 string_column("ROUTINE_SCHEMA"),
314 string_column("ROUTINE_NAME"),
315 string_column("ROUTINE_TYPE"),
316 string_column("DATA_TYPE"),
317 bigint_column("CHARACTER_MAXIMUM_LENGTH"),
318 bigint_column("CHARACTER_OCTET_LENGTH"),
319 bigint_column("NUMERIC_PRECISION"),
320 bigint_column("NUMERIC_SCALE"),
321 bigint_column("DATETIME_PRECISION"),
322 string_column("CHARACTER_SET_NAME"),
323 string_column("COLLATION_NAME"),
324 string_column("DTD_IDENTIFIER"),
325 string_column("ROUTINE_BODY"),
326 string_column("ROUTINE_DEFINITION"),
327 string_column("EXTERNAL_NAME"),
328 string_column("EXTERNAL_LANGUAGE"),
329 string_column("PARAMETER_STYLE"),
330 string_column("IS_DETERMINISTIC"),
331 string_column("SQL_DATA_ACCESS"),
332 string_column("SQL_PATH"),
333 string_column("SECURITY_TYPE"),
334 timestamp_micro_column("CREATED"),
335 timestamp_micro_column("LAST_ALTERED"),
336 string_column("SQL_MODE"),
337 string_column("ROUTINE_COMMENT"),
338 string_column("DEFINER"),
339 string_column("CHARACTER_SET_CLIENT"),
340 string_column("COLLATION_CONNECTION"),
341 string_column("DATABASE_COLLATION"),
342 ],
343 vec![],
344 ),
345
346 SCHEMA_PRIVILEGES => (
347 vec![
348 string_column("GRANTEE"),
349 string_column("TABLE_CATALOG"),
350 string_column("TABLE_SCHEMA"),
351 string_column("PRIVILEGE_TYPE"),
352 string_column("IS_GRANTABLE"),
353 ],
354 vec![],
355 ),
356
357 TABLE_PRIVILEGES => (
358 vec![
359 string_column("GRANTEE"),
360 string_column("TABLE_CATALOG"),
361 string_column("TABLE_SCHEMA"),
362 string_column("TABLE_NAME"),
363 string_column("PRIVILEGE_TYPE"),
364 string_column("IS_GRANTABLE"),
365 ],
366 vec![],
367 ),
368
369 TRIGGERS => (
370 vec![
371 string_column("TRIGGER_NAME"),
372 ColumnSchema::new(
373 "trigger_id",
374 ConcreteDataType::uint64_datatype(),
375 false,
376 ),
377 string_column("TRIGGER_DEFINITION"),
378 ColumnSchema::new(
379 "flownode_id",
380 ConcreteDataType::uint64_datatype(),
381 true,
382 ),
383 ],
384 vec![],
385 ),
386
387 GLOBAL_STATUS => (
390 vec![
391 string_column("VARIABLE_NAME"),
392 string_column("VARIABLE_VALUE"),
393 ],
394 vec![],
395 ),
396
397 SESSION_STATUS => (
398 vec![
399 string_column("VARIABLE_NAME"),
400 string_column("VARIABLE_VALUE"),
401 ],
402 vec![],
403 ),
404
405 _ => unreachable!("Unknown table in information_schema: {}", table_name),
406 };
407
408 (Arc::new(Schema::new(column_schemas)), columns)
409}