VillageSQL stores extension metadata in system tables within the villagesql schema. Query this information via system tables or INFORMATION_SCHEMA views.
Never modify system tables directly. Use INSTALL EXTENSION, UNINSTALL EXTENSION, and other SQL commands to manage extensions.
System Tables
| Table | Purpose | Key Columns |
|---|
villagesql.extensions | Installed extensions registry | extension_name, extension_version, veb_sha256 |
villagesql.custom_columns | Type usage tracking | db_name, table_name, column_name, type_name |
villagesql.properties | System properties | property_name, property_value |
villagesql.extensions
Tracks all installed extensions with version and integrity information.
Schema:
CREATE TABLE villagesql.extensions (
extension_name VARCHAR(64) NOT NULL PRIMARY KEY,
extension_version VARCHAR(64) NOT NULL,
veb_sha256 VARCHAR(64) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Query Example:
SELECT extension_name, extension_version
FROM villagesql.extensions;
Sample Output:
+------------------+-------------------+
| extension_name | extension_version |
+------------------+-------------------+
| vsql_complex | 1.0.0 |
| vsql_uuid | 0.2.1 |
+------------------+-------------------+
villagesql.custom_columns
Tracks which table columns use custom types. Critical for preventing uninstall of extensions with active usage.
Schema:
CREATE TABLE villagesql.custom_columns (
db_name VARCHAR(64) NOT NULL,
table_name VARCHAR(64) NOT NULL,
column_name VARCHAR(64) NOT NULL,
type_name VARCHAR(64) NOT NULL,
extension_name VARCHAR(64) NOT NULL,
extension_version VARCHAR(64) NOT NULL,
PRIMARY KEY (db_name, table_name, column_name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Query Example:
-- Find all tables using custom types
SELECT
db_name,
table_name,
column_name,
type_name
FROM villagesql.custom_columns
ORDER BY db_name, table_name;
-- Check dependencies before uninstall
SELECT COUNT(*) as dependent_columns
FROM villagesql.custom_columns
WHERE extension_name = 'vsql_complex';
Sample Output:
+---------+------------+-------------+-----------+
| db_name | table_name | column_name | type_name |
+---------+------------+-------------+-----------+
| mydb | signals | impedance | COMPLEX |
| mydb | signals | frequency | COMPLEX |
| testdb | users | user_id | UUID |
+---------+------------+-------------+-----------+
villagesql.properties
System properties and metadata, including schema version.
Schema:
CREATE TABLE villagesql.properties (
property_name VARCHAR(64) NOT NULL PRIMARY KEY,
property_value VARCHAR(256) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Query Example:
-- Check schema version
SELECT property_value
FROM villagesql.properties
WHERE property_name = 'schema_version';
System Views
Public view for querying installed extensions. Recommended for applications and scripts.
Schema:
SELECT
EXTENSION_NAME,
EXTENSION_VERSION
FROM INFORMATION_SCHEMA.EXTENSIONS;
Source: Backed by villagesql.extensions table.
Example:
-- List all installed extensions
SELECT * FROM INFORMATION_SCHEMA.EXTENSIONS;
-- Check specific extension version
SELECT EXTENSION_VERSION
FROM INFORMATION_SCHEMA.EXTENSIONS
WHERE EXTENSION_NAME = 'vsql_complex';
Common Queries
Find Extension Dependencies
Check if an extension can be safely uninstalled:
SELECT
'Custom Types' as dependency_type,
type_name as name
FROM villagesql.custom_columns
WHERE extension_name = 'vsql_complex'
UNION ALL
SELECT
'Columns' as dependency_type,
CONCAT(db_name, '.', table_name, '.', column_name) as name
FROM villagesql.custom_columns
WHERE extension_name = 'vsql_complex';
List All Custom Types with Usage
SELECT
ct.type_name,
ct.extension_name,
e.extension_version,
COUNT(cc.column_name) as usage_count
FROM villagesql.custom_columns ct
LEFT JOIN villagesql.custom_columns cc
ON ct.type_name = cc.type_name
AND ct.extension_name = cc.extension_name
JOIN villagesql.extensions e
ON ct.extension_name = e.extension_name
GROUP BY ct.type_name, ct.extension_name, e.extension_version
ORDER BY usage_count DESC;
Find Tables Using Extension Types
SELECT DISTINCT
cc.db_name,
cc.table_name,
GROUP_CONCAT(cc.column_name ORDER BY cc.column_name) as columns
FROM villagesql.custom_columns cc
WHERE cc.extension_name = 'vsql_complex'
GROUP BY cc.db_name, cc.table_name;
Next Steps