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