System Catalogs

Many relational database systems, including SQLite, keep system state data in a series of data structures known as system catalogs. All of the SQLite system catalogs start with the prefix sqlite_. Although many of these catalogs contain internal data, they can be queried, using SELECT, just as if they were standard tables. Most system catalogs are read-only. If you encounter an unknown database and you’re not sure what’s in it, examining the system catalogs is a good place to start.

All nontemporary SQLite databases have an sqlite_master catalog. This is the master record of all database objects. If any of the tables has a populated AUTOINCREMENT column, the database will also have an sqlite_sequence catalog. This catalog is used to keep track of the next valid sequence value (for more information on AUTOINCREMENT, see Primary keys). If the SQL command ANALYZE has been used, it will also generate one or more sqlite_stat# tables, such as sqlite_stat1 and sqlite_stat2. These tables hold various statistics about the values and distributions in various indexes, and are used to help the query optimizer pick the more efficient query solution. For more information, see ANALYZE in Appendix C.

The most important of these system catalogs is the sqlite_master table. This catalog contains information on all the objects within a database, including the SQL used to define them. The sqlite_master table has five columns:

Column nameColumn typeMeaning
type TextType of database object
name TextIdentifier name of object
tbl_name TextName of associated table
rootpage IntegerInternal use only
sql TextSQL used to define object

The type column can be table (including virtual tables), index, view, or trigger. The name column gives the name of the object itself, while the tbl_name column gives the name of the table or view the object is associated with. For tables and views, the tbl_name is just a copy of the name column. The final sql column holds a full copy of the original SQL command used to define the object, such as a CREATE TABLE or CREATE TRIGGER command.

Temporary databases do not have an sqlite_master system catalog. Rather, they have an sqlite_temp_master table instead.

Get Using SQLite now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.