catalog/system_schema/information_schema/
information_memory_table.rs

1// Copyright 2023 Greptime Team
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15use 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
29/// Find the schema and columns by the table_name, only valid for memory tables.
30/// Safety: the user MUST ensure the table schema exists, panic otherwise.
31pub(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                // TODO(dennis): It must be a JSON type, but we don't support it yet
52                "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            // Not support check constraints yet
154            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        // MySQL(https://dev.mysql.com/doc/refman/8.2/en/information-schema-parameters-table.html)
242        // has the spec that is different from
243        // PostgreSQL(https://www.postgresql.org/docs/current/infoschema-parameters.html).
244        // Follow `MySQL` spec here.
245        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        // TODO: _Must_ reimplement this table when foreign key constraint is supported.
292        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        // TODO: Considering store internal metrics in `global_status` and
388        // `session_status` tables.
389        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}