Top

23.6. Virtuoso System Tables

23.6.1. Core System Tables

	create table SYS_COLS (
		TABLE			varchar,
		COLUMN			varchar,
		COL_ID			integer,
		COL_DTP			integer,
		primary key (COL_ID))

	create index SYS_COLS_BY_NAME on SYS_COLS (TABLE, COLUMN)

	create table SYS_KEYS (
		KEY_TABLE		varchar,
		KEY_NAME		varchar,
		KEY_ID			integer,
		KEY_N_SIGNIFICANT	integer,
		KEY_CLUSTER_ON_ID	integer,
		KEY_IS_MAIN		integer,
		KEY_IS_OBJECT_ID	integer,
		KEY_IS_UNIQUE		integer,
		KEY_MIGRATE_TO		integer,
		primary key (KEY_TABLE, KEY_NAME))

	create index SYS_KEYS_BY_ID on SYS_KEYS (KEY_ID)

	create table SYS_KEY_PARTS (
		KP_KEY_ID		integer,
		KP_NTH			integer,
		KP_COL			integer
		primary key (KP_KEY_ID, KP_NTH))

	create table SYS_KEY_SUBKEY (
		SUPER			integer,
		SUB			integer,
		primary key (SUPER, SUB))

The SYS_COLS table defines all tables and columns. Each column appears once in this table. No entries are made for inherited columns. The SYS_KEYS table defines all indices. A row in this table corresponds to each key in the database, either originally defined or inherited.

KEY_IS_MAIN is non-zero if this is the primary key of its table. The KEY_MIGRATE_TO is the key ID of a new version of this key if this key is obsolete (e.g. the primary key of a table from before an ALTER TABLE). The KEY_N_SIGNIFICANT indicates how many leading key parts are used in ordering keys.

The KEY_ID references the KP_KEY_ID in the SYS_KEY_PARTS table. This table embodies the actual layout of keys and rows. The KP_NTH is a number positioning the KP_COL to the appropriate place in the row. The KP_COL references the COL_ID in SYS_COLS. The KP_NTH is not necessarily a series of consecutive integers but the order matches the order of columns on the row.

The SYS_KEY_SUBKEY table has a row for each pair of keys where one is the immediate subkey of the other. Note that when a table is altered, the obsolete layout is marked as a subtable of the new layout of the primary key. Thus a select on the new primary key will also get the obsolete rows.

The following SQL procedure exemplifies how the SYS_COLS, SYS_KEYS and SYS_KEY_PARTS tables combine. Given a table name it produces the set of columns and the set of indices and their parts.

	create procedure dt (in tn varchar)
	{
		declare index_name, col, dtp varchar;
		declare t, nth integer;

		dtp := '-';

		result_names (col, t);	  --- first result set

		declare cr cursor for select COLUMN, COL_DTP
		  from SYS_COLS where TABLE = tn;

		whenever not found goto done;
		open cr;
		while (1=1) {
			fetch cr into col, t;
			result (col, t);
		}
	done:
		result_names (index_name, nth, col);	 -- 2nd result set
		end_result ();

		declare icr cursor for select KEY_NAME, KP_NTH, COLUMN
		  from SYS_KEYS, SYS_KEY_PARTS, SYS_COLS
		  where KEY_TABLE = tn and KP_KEY_ID = KEY_ID
		  and KP_NTH < KEY_N_SIGNIFICANT and	 COL_ID = KP_COL;

		whenever not found goto k_done;
		open icr;
		while (1=1) {
			fetch icr into index_name, nth, col;
			result (index_name, nth, col);
		}
	k_done:
		return 0;
	}