1# dialects/oracle/dictionary.py
2# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors
3# <see AUTHORS file>
4#
5# This module is part of SQLAlchemy and is released under
6# the MIT License: https://www.opensource.org/licenses/mit-license.php
7# mypy: ignore-errors
8
9from .types import DATE
10from .types import LONG
11from .types import NUMBER
12from .types import RAW
13from .types import VARCHAR2
14from ... import Column
15from ... import MetaData
16from ... import Table
17from ... import table
18from ...sql.sqltypes import CHAR
19
20# constants
21DB_LINK_PLACEHOLDER = "__$sa_dblink$__"
22# tables
23dual = table("dual")
24dictionary_meta = MetaData()
25
26# NOTE: all the dictionary_meta are aliases because oracle does not like
27# using the full table@dblink for every column in query, and complains with
28# ORA-00960: ambiguous column naming in select list
29all_tables = Table(
30 "all_tables" + DB_LINK_PLACEHOLDER,
31 dictionary_meta,
32 Column("owner", VARCHAR2(128), nullable=False),
33 Column("table_name", VARCHAR2(128), nullable=False),
34 Column("tablespace_name", VARCHAR2(30)),
35 Column("cluster_name", VARCHAR2(128)),
36 Column("iot_name", VARCHAR2(128)),
37 Column("status", VARCHAR2(8)),
38 Column("pct_free", NUMBER),
39 Column("pct_used", NUMBER),
40 Column("ini_trans", NUMBER),
41 Column("max_trans", NUMBER),
42 Column("initial_extent", NUMBER),
43 Column("next_extent", NUMBER),
44 Column("min_extents", NUMBER),
45 Column("max_extents", NUMBER),
46 Column("pct_increase", NUMBER),
47 Column("freelists", NUMBER),
48 Column("freelist_groups", NUMBER),
49 Column("logging", VARCHAR2(3)),
50 Column("backed_up", VARCHAR2(1)),
51 Column("num_rows", NUMBER),
52 Column("blocks", NUMBER),
53 Column("empty_blocks", NUMBER),
54 Column("avg_space", NUMBER),
55 Column("chain_cnt", NUMBER),
56 Column("avg_row_len", NUMBER),
57 Column("avg_space_freelist_blocks", NUMBER),
58 Column("num_freelist_blocks", NUMBER),
59 Column("degree", VARCHAR2(10)),
60 Column("instances", VARCHAR2(10)),
61 Column("cache", VARCHAR2(5)),
62 Column("table_lock", VARCHAR2(8)),
63 Column("sample_size", NUMBER),
64 Column("last_analyzed", DATE),
65 Column("partitioned", VARCHAR2(3)),
66 Column("iot_type", VARCHAR2(12)),
67 Column("temporary", VARCHAR2(1)),
68 Column("secondary", VARCHAR2(1)),
69 Column("nested", VARCHAR2(3)),
70 Column("buffer_pool", VARCHAR2(7)),
71 Column("flash_cache", VARCHAR2(7)),
72 Column("cell_flash_cache", VARCHAR2(7)),
73 Column("row_movement", VARCHAR2(8)),
74 Column("global_stats", VARCHAR2(3)),
75 Column("user_stats", VARCHAR2(3)),
76 Column("duration", VARCHAR2(15)),
77 Column("skip_corrupt", VARCHAR2(8)),
78 Column("monitoring", VARCHAR2(3)),
79 Column("cluster_owner", VARCHAR2(128)),
80 Column("dependencies", VARCHAR2(8)),
81 Column("compression", VARCHAR2(8)),
82 Column("compress_for", VARCHAR2(30)),
83 Column("dropped", VARCHAR2(3)),
84 Column("read_only", VARCHAR2(3)),
85 Column("segment_created", VARCHAR2(3)),
86 Column("result_cache", VARCHAR2(7)),
87 Column("clustering", VARCHAR2(3)),
88 Column("activity_tracking", VARCHAR2(23)),
89 Column("dml_timestamp", VARCHAR2(25)),
90 Column("has_identity", VARCHAR2(3)),
91 Column("container_data", VARCHAR2(3)),
92 Column("inmemory", VARCHAR2(8)),
93 Column("inmemory_priority", VARCHAR2(8)),
94 Column("inmemory_distribute", VARCHAR2(15)),
95 Column("inmemory_compression", VARCHAR2(17)),
96 Column("inmemory_duplicate", VARCHAR2(13)),
97 Column("default_collation", VARCHAR2(100)),
98 Column("duplicated", VARCHAR2(1)),
99 Column("sharded", VARCHAR2(1)),
100 Column("externally_sharded", VARCHAR2(1)),
101 Column("externally_duplicated", VARCHAR2(1)),
102 Column("external", VARCHAR2(3)),
103 Column("hybrid", VARCHAR2(3)),
104 Column("cellmemory", VARCHAR2(24)),
105 Column("containers_default", VARCHAR2(3)),
106 Column("container_map", VARCHAR2(3)),
107 Column("extended_data_link", VARCHAR2(3)),
108 Column("extended_data_link_map", VARCHAR2(3)),
109 Column("inmemory_service", VARCHAR2(12)),
110 Column("inmemory_service_name", VARCHAR2(1000)),
111 Column("container_map_object", VARCHAR2(3)),
112 Column("memoptimize_read", VARCHAR2(8)),
113 Column("memoptimize_write", VARCHAR2(8)),
114 Column("has_sensitive_column", VARCHAR2(3)),
115 Column("admit_null", VARCHAR2(3)),
116 Column("data_link_dml_enabled", VARCHAR2(3)),
117 Column("logical_replication", VARCHAR2(8)),
118).alias("a_tables")
119
120all_views = Table(
121 "all_views" + DB_LINK_PLACEHOLDER,
122 dictionary_meta,
123 Column("owner", VARCHAR2(128), nullable=False),
124 Column("view_name", VARCHAR2(128), nullable=False),
125 Column("text_length", NUMBER),
126 Column("text", LONG),
127 Column("text_vc", VARCHAR2(4000)),
128 Column("type_text_length", NUMBER),
129 Column("type_text", VARCHAR2(4000)),
130 Column("oid_text_length", NUMBER),
131 Column("oid_text", VARCHAR2(4000)),
132 Column("view_type_owner", VARCHAR2(128)),
133 Column("view_type", VARCHAR2(128)),
134 Column("superview_name", VARCHAR2(128)),
135 Column("editioning_view", VARCHAR2(1)),
136 Column("read_only", VARCHAR2(1)),
137 Column("container_data", VARCHAR2(1)),
138 Column("bequeath", VARCHAR2(12)),
139 Column("origin_con_id", VARCHAR2(256)),
140 Column("default_collation", VARCHAR2(100)),
141 Column("containers_default", VARCHAR2(3)),
142 Column("container_map", VARCHAR2(3)),
143 Column("extended_data_link", VARCHAR2(3)),
144 Column("extended_data_link_map", VARCHAR2(3)),
145 Column("has_sensitive_column", VARCHAR2(3)),
146 Column("admit_null", VARCHAR2(3)),
147 Column("pdb_local_only", VARCHAR2(3)),
148).alias("a_views")
149
150all_sequences = Table(
151 "all_sequences" + DB_LINK_PLACEHOLDER,
152 dictionary_meta,
153 Column("sequence_owner", VARCHAR2(128), nullable=False),
154 Column("sequence_name", VARCHAR2(128), nullable=False),
155 Column("min_value", NUMBER),
156 Column("max_value", NUMBER),
157 Column("increment_by", NUMBER, nullable=False),
158 Column("cycle_flag", VARCHAR2(1)),
159 Column("order_flag", VARCHAR2(1)),
160 Column("cache_size", NUMBER, nullable=False),
161 Column("last_number", NUMBER, nullable=False),
162 Column("scale_flag", VARCHAR2(1)),
163 Column("extend_flag", VARCHAR2(1)),
164 Column("sharded_flag", VARCHAR2(1)),
165 Column("session_flag", VARCHAR2(1)),
166 Column("keep_value", VARCHAR2(1)),
167).alias("a_sequences")
168
169all_users = Table(
170 "all_users" + DB_LINK_PLACEHOLDER,
171 dictionary_meta,
172 Column("username", VARCHAR2(128), nullable=False),
173 Column("user_id", NUMBER, nullable=False),
174 Column("created", DATE, nullable=False),
175 Column("common", VARCHAR2(3)),
176 Column("oracle_maintained", VARCHAR2(1)),
177 Column("inherited", VARCHAR2(3)),
178 Column("default_collation", VARCHAR2(100)),
179 Column("implicit", VARCHAR2(3)),
180 Column("all_shard", VARCHAR2(3)),
181 Column("external_shard", VARCHAR2(3)),
182).alias("a_users")
183
184all_mviews = Table(
185 "all_mviews" + DB_LINK_PLACEHOLDER,
186 dictionary_meta,
187 Column("owner", VARCHAR2(128), nullable=False),
188 Column("mview_name", VARCHAR2(128), nullable=False),
189 Column("container_name", VARCHAR2(128), nullable=False),
190 Column("query", LONG),
191 Column("query_len", NUMBER(38)),
192 Column("updatable", VARCHAR2(1)),
193 Column("update_log", VARCHAR2(128)),
194 Column("master_rollback_seg", VARCHAR2(128)),
195 Column("master_link", VARCHAR2(128)),
196 Column("rewrite_enabled", VARCHAR2(1)),
197 Column("rewrite_capability", VARCHAR2(9)),
198 Column("refresh_mode", VARCHAR2(6)),
199 Column("refresh_method", VARCHAR2(8)),
200 Column("build_mode", VARCHAR2(9)),
201 Column("fast_refreshable", VARCHAR2(18)),
202 Column("last_refresh_type", VARCHAR2(8)),
203 Column("last_refresh_date", DATE),
204 Column("last_refresh_end_time", DATE),
205 Column("staleness", VARCHAR2(19)),
206 Column("after_fast_refresh", VARCHAR2(19)),
207 Column("unknown_prebuilt", VARCHAR2(1)),
208 Column("unknown_plsql_func", VARCHAR2(1)),
209 Column("unknown_external_table", VARCHAR2(1)),
210 Column("unknown_consider_fresh", VARCHAR2(1)),
211 Column("unknown_import", VARCHAR2(1)),
212 Column("unknown_trusted_fd", VARCHAR2(1)),
213 Column("compile_state", VARCHAR2(19)),
214 Column("use_no_index", VARCHAR2(1)),
215 Column("stale_since", DATE),
216 Column("num_pct_tables", NUMBER),
217 Column("num_fresh_pct_regions", NUMBER),
218 Column("num_stale_pct_regions", NUMBER),
219 Column("segment_created", VARCHAR2(3)),
220 Column("evaluation_edition", VARCHAR2(128)),
221 Column("unusable_before", VARCHAR2(128)),
222 Column("unusable_beginning", VARCHAR2(128)),
223 Column("default_collation", VARCHAR2(100)),
224 Column("on_query_computation", VARCHAR2(1)),
225 Column("auto", VARCHAR2(3)),
226).alias("a_mviews")
227
228all_tab_identity_cols = Table(
229 "all_tab_identity_cols" + DB_LINK_PLACEHOLDER,
230 dictionary_meta,
231 Column("owner", VARCHAR2(128), nullable=False),
232 Column("table_name", VARCHAR2(128), nullable=False),
233 Column("column_name", VARCHAR2(128), nullable=False),
234 Column("generation_type", VARCHAR2(10)),
235 Column("sequence_name", VARCHAR2(128), nullable=False),
236 Column("identity_options", VARCHAR2(298)),
237).alias("a_tab_identity_cols")
238
239all_tab_cols = Table(
240 "all_tab_cols" + DB_LINK_PLACEHOLDER,
241 dictionary_meta,
242 Column("owner", VARCHAR2(128), nullable=False),
243 Column("table_name", VARCHAR2(128), nullable=False),
244 Column("column_name", VARCHAR2(128), nullable=False),
245 Column("data_type", VARCHAR2(128)),
246 Column("data_type_mod", VARCHAR2(3)),
247 Column("data_type_owner", VARCHAR2(128)),
248 Column("data_length", NUMBER, nullable=False),
249 Column("data_precision", NUMBER),
250 Column("data_scale", NUMBER),
251 Column("nullable", VARCHAR2(1)),
252 Column("column_id", NUMBER),
253 Column("default_length", NUMBER),
254 Column("data_default", LONG),
255 Column("num_distinct", NUMBER),
256 Column("low_value", RAW(1000)),
257 Column("high_value", RAW(1000)),
258 Column("density", NUMBER),
259 Column("num_nulls", NUMBER),
260 Column("num_buckets", NUMBER),
261 Column("last_analyzed", DATE),
262 Column("sample_size", NUMBER),
263 Column("character_set_name", VARCHAR2(44)),
264 Column("char_col_decl_length", NUMBER),
265 Column("global_stats", VARCHAR2(3)),
266 Column("user_stats", VARCHAR2(3)),
267 Column("avg_col_len", NUMBER),
268 Column("char_length", NUMBER),
269 Column("char_used", VARCHAR2(1)),
270 Column("v80_fmt_image", VARCHAR2(3)),
271 Column("data_upgraded", VARCHAR2(3)),
272 Column("hidden_column", VARCHAR2(3)),
273 Column("virtual_column", VARCHAR2(3)),
274 Column("segment_column_id", NUMBER),
275 Column("internal_column_id", NUMBER, nullable=False),
276 Column("histogram", VARCHAR2(15)),
277 Column("qualified_col_name", VARCHAR2(4000)),
278 Column("user_generated", VARCHAR2(3)),
279 Column("default_on_null", VARCHAR2(3)),
280 Column("identity_column", VARCHAR2(3)),
281 Column("evaluation_edition", VARCHAR2(128)),
282 Column("unusable_before", VARCHAR2(128)),
283 Column("unusable_beginning", VARCHAR2(128)),
284 Column("collation", VARCHAR2(100)),
285 Column("collated_column_id", NUMBER),
286).alias("a_tab_cols")
287
288all_tab_comments = Table(
289 "all_tab_comments" + DB_LINK_PLACEHOLDER,
290 dictionary_meta,
291 Column("owner", VARCHAR2(128), nullable=False),
292 Column("table_name", VARCHAR2(128), nullable=False),
293 Column("table_type", VARCHAR2(11)),
294 Column("comments", VARCHAR2(4000)),
295 Column("origin_con_id", NUMBER),
296).alias("a_tab_comments")
297
298all_col_comments = Table(
299 "all_col_comments" + DB_LINK_PLACEHOLDER,
300 dictionary_meta,
301 Column("owner", VARCHAR2(128), nullable=False),
302 Column("table_name", VARCHAR2(128), nullable=False),
303 Column("column_name", VARCHAR2(128), nullable=False),
304 Column("comments", VARCHAR2(4000)),
305 Column("origin_con_id", NUMBER),
306).alias("a_col_comments")
307
308all_mview_comments = Table(
309 "all_mview_comments" + DB_LINK_PLACEHOLDER,
310 dictionary_meta,
311 Column("owner", VARCHAR2(128), nullable=False),
312 Column("mview_name", VARCHAR2(128), nullable=False),
313 Column("comments", VARCHAR2(4000)),
314).alias("a_mview_comments")
315
316all_ind_columns = Table(
317 "all_ind_columns" + DB_LINK_PLACEHOLDER,
318 dictionary_meta,
319 Column("index_owner", VARCHAR2(128), nullable=False),
320 Column("index_name", VARCHAR2(128), nullable=False),
321 Column("table_owner", VARCHAR2(128), nullable=False),
322 Column("table_name", VARCHAR2(128), nullable=False),
323 Column("column_name", VARCHAR2(4000)),
324 Column("column_position", NUMBER, nullable=False),
325 Column("column_length", NUMBER, nullable=False),
326 Column("char_length", NUMBER),
327 Column("descend", VARCHAR2(4)),
328 Column("collated_column_id", NUMBER),
329).alias("a_ind_columns")
330
331all_indexes = Table(
332 "all_indexes" + DB_LINK_PLACEHOLDER,
333 dictionary_meta,
334 Column("owner", VARCHAR2(128), nullable=False),
335 Column("index_name", VARCHAR2(128), nullable=False),
336 Column("index_type", VARCHAR2(27)),
337 Column("table_owner", VARCHAR2(128), nullable=False),
338 Column("table_name", VARCHAR2(128), nullable=False),
339 Column("table_type", CHAR(11)),
340 Column("uniqueness", VARCHAR2(9)),
341 Column("compression", VARCHAR2(13)),
342 Column("prefix_length", NUMBER),
343 Column("tablespace_name", VARCHAR2(30)),
344 Column("ini_trans", NUMBER),
345 Column("max_trans", NUMBER),
346 Column("initial_extent", NUMBER),
347 Column("next_extent", NUMBER),
348 Column("min_extents", NUMBER),
349 Column("max_extents", NUMBER),
350 Column("pct_increase", NUMBER),
351 Column("pct_threshold", NUMBER),
352 Column("include_column", NUMBER),
353 Column("freelists", NUMBER),
354 Column("freelist_groups", NUMBER),
355 Column("pct_free", NUMBER),
356 Column("logging", VARCHAR2(3)),
357 Column("blevel", NUMBER),
358 Column("leaf_blocks", NUMBER),
359 Column("distinct_keys", NUMBER),
360 Column("avg_leaf_blocks_per_key", NUMBER),
361 Column("avg_data_blocks_per_key", NUMBER),
362 Column("clustering_factor", NUMBER),
363 Column("status", VARCHAR2(8)),
364 Column("num_rows", NUMBER),
365 Column("sample_size", NUMBER),
366 Column("last_analyzed", DATE),
367 Column("degree", VARCHAR2(40)),
368 Column("instances", VARCHAR2(40)),
369 Column("partitioned", VARCHAR2(3)),
370 Column("temporary", VARCHAR2(1)),
371 Column("generated", VARCHAR2(1)),
372 Column("secondary", VARCHAR2(1)),
373 Column("buffer_pool", VARCHAR2(7)),
374 Column("flash_cache", VARCHAR2(7)),
375 Column("cell_flash_cache", VARCHAR2(7)),
376 Column("user_stats", VARCHAR2(3)),
377 Column("duration", VARCHAR2(15)),
378 Column("pct_direct_access", NUMBER),
379 Column("ityp_owner", VARCHAR2(128)),
380 Column("ityp_name", VARCHAR2(128)),
381 Column("parameters", VARCHAR2(1000)),
382 Column("global_stats", VARCHAR2(3)),
383 Column("domidx_status", VARCHAR2(12)),
384 Column("domidx_opstatus", VARCHAR2(6)),
385 Column("funcidx_status", VARCHAR2(8)),
386 Column("join_index", VARCHAR2(3)),
387 Column("iot_redundant_pkey_elim", VARCHAR2(3)),
388 Column("dropped", VARCHAR2(3)),
389 Column("visibility", VARCHAR2(9)),
390 Column("domidx_management", VARCHAR2(14)),
391 Column("segment_created", VARCHAR2(3)),
392 Column("orphaned_entries", VARCHAR2(3)),
393 Column("indexing", VARCHAR2(7)),
394 Column("auto", VARCHAR2(3)),
395).alias("a_indexes")
396
397all_ind_expressions = Table(
398 "all_ind_expressions" + DB_LINK_PLACEHOLDER,
399 dictionary_meta,
400 Column("index_owner", VARCHAR2(128), nullable=False),
401 Column("index_name", VARCHAR2(128), nullable=False),
402 Column("table_owner", VARCHAR2(128), nullable=False),
403 Column("table_name", VARCHAR2(128), nullable=False),
404 Column("column_expression", LONG),
405 Column("column_position", NUMBER, nullable=False),
406).alias("a_ind_expressions")
407
408all_constraints = Table(
409 "all_constraints" + DB_LINK_PLACEHOLDER,
410 dictionary_meta,
411 Column("owner", VARCHAR2(128)),
412 Column("constraint_name", VARCHAR2(128)),
413 Column("constraint_type", VARCHAR2(1)),
414 Column("table_name", VARCHAR2(128)),
415 Column("search_condition", LONG),
416 Column("search_condition_vc", VARCHAR2(4000)),
417 Column("r_owner", VARCHAR2(128)),
418 Column("r_constraint_name", VARCHAR2(128)),
419 Column("delete_rule", VARCHAR2(9)),
420 Column("status", VARCHAR2(8)),
421 Column("deferrable", VARCHAR2(14)),
422 Column("deferred", VARCHAR2(9)),
423 Column("validated", VARCHAR2(13)),
424 Column("generated", VARCHAR2(14)),
425 Column("bad", VARCHAR2(3)),
426 Column("rely", VARCHAR2(4)),
427 Column("last_change", DATE),
428 Column("index_owner", VARCHAR2(128)),
429 Column("index_name", VARCHAR2(128)),
430 Column("invalid", VARCHAR2(7)),
431 Column("view_related", VARCHAR2(14)),
432 Column("origin_con_id", VARCHAR2(256)),
433).alias("a_constraints")
434
435all_cons_columns = Table(
436 "all_cons_columns" + DB_LINK_PLACEHOLDER,
437 dictionary_meta,
438 Column("owner", VARCHAR2(128), nullable=False),
439 Column("constraint_name", VARCHAR2(128), nullable=False),
440 Column("table_name", VARCHAR2(128), nullable=False),
441 Column("column_name", VARCHAR2(4000)),
442 Column("position", NUMBER),
443).alias("a_cons_columns")
444
445# TODO figure out if it's still relevant, since there is no mention from here
446# https://docs.oracle.com/en/database/oracle/oracle-database/21/refrn/ALL_DB_LINKS.html
447# original note:
448# using user_db_links here since all_db_links appears
449# to have more restricted permissions.
450# https://docs.oracle.com/cd/B28359_01/server.111/b28310/ds_admin005.htm
451# will need to hear from more users if we are doing
452# the right thing here. See [ticket:2619]
453all_db_links = Table(
454 "all_db_links" + DB_LINK_PLACEHOLDER,
455 dictionary_meta,
456 Column("owner", VARCHAR2(128), nullable=False),
457 Column("db_link", VARCHAR2(128), nullable=False),
458 Column("username", VARCHAR2(128)),
459 Column("host", VARCHAR2(2000)),
460 Column("created", DATE, nullable=False),
461 Column("hidden", VARCHAR2(3)),
462 Column("shard_internal", VARCHAR2(3)),
463 Column("valid", VARCHAR2(3)),
464 Column("intra_cdb", VARCHAR2(3)),
465).alias("a_db_links")
466
467all_synonyms = Table(
468 "all_synonyms" + DB_LINK_PLACEHOLDER,
469 dictionary_meta,
470 Column("owner", VARCHAR2(128)),
471 Column("synonym_name", VARCHAR2(128)),
472 Column("table_owner", VARCHAR2(128)),
473 Column("table_name", VARCHAR2(128)),
474 Column("db_link", VARCHAR2(128)),
475 Column("origin_con_id", VARCHAR2(256)),
476).alias("a_synonyms")
477
478all_objects = Table(
479 "all_objects" + DB_LINK_PLACEHOLDER,
480 dictionary_meta,
481 Column("owner", VARCHAR2(128), nullable=False),
482 Column("object_name", VARCHAR2(128), nullable=False),
483 Column("subobject_name", VARCHAR2(128)),
484 Column("object_id", NUMBER, nullable=False),
485 Column("data_object_id", NUMBER),
486 Column("object_type", VARCHAR2(23)),
487 Column("created", DATE, nullable=False),
488 Column("last_ddl_time", DATE, nullable=False),
489 Column("timestamp", VARCHAR2(19)),
490 Column("status", VARCHAR2(7)),
491 Column("temporary", VARCHAR2(1)),
492 Column("generated", VARCHAR2(1)),
493 Column("secondary", VARCHAR2(1)),
494 Column("namespace", NUMBER, nullable=False),
495 Column("edition_name", VARCHAR2(128)),
496 Column("sharing", VARCHAR2(13)),
497 Column("editionable", VARCHAR2(1)),
498 Column("oracle_maintained", VARCHAR2(1)),
499 Column("application", VARCHAR2(1)),
500 Column("default_collation", VARCHAR2(100)),
501 Column("duplicated", VARCHAR2(1)),
502 Column("sharded", VARCHAR2(1)),
503 Column("created_appid", NUMBER),
504 Column("created_vsnid", NUMBER),
505 Column("modified_appid", NUMBER),
506 Column("modified_vsnid", NUMBER),
507).alias("a_objects")