"columns": {<id>: <column-schema>, ...} required
"maxRows": <integer> optional
+ "isRoot": <boolean> optional
+ "indexes": [<column-set>*] optional
The value of "columns" is a JSON object whose names are column
names and whose values are <column-schema>s.
the database process is stopped and then started again, each
"_version" also changes to a new random value.
+ If "isRoot" is omitted or specified as false, then any given row
+ in the table may exist only when there is at least one reference
+ to it, with refType "strong", from a different row (in the same
+ table or a different table). This is a "deferred" action:
+ unreferenced rows in the table are deleted just before transaction
+ commit. If "isRoot" is specified as true, then rows in the table
+ exist independent of any references (they can be thought of as
+ part of the "root set" in a garbage collector).
+
+ For compatibility with schemas created before "isRoot" was
+ introduced, if "isRoot" is omitted or false in every
+ <table-schema> in a given <database-schema>, then every table is
+ part of the root set.
+
If "maxRows" is specified, as a positive integer, it limits the
maximum number of rows that may be present in the table. This is
a "deferred" constraint, enforced only at transaction commit time
(see the "transact" request below). If "maxRows" is not
specified, the size of the table is limited only by the resources
- available to the database server.
+ available to the database server. "maxRows" constraints are
+ enforced after unreferenced rows are deleted from tables with a
+ false "isRoot".
+
+ If "indexes" is specified, it must be an array of zero or more
+ <column-set>s. A <column-set> is an array of one or more strings,
+ each of which names a column. Each <column-set> is a set of
+ columns whose values, taken together within any given row, must be
+ unique within the table. This is a "deferred" constraint,
+ enforced only at transaction commit time, after unreferenced rows
+ are deleted and dangling weak references are removed. Ephemeral
+ columns may not be part of indexes.
<column-schema>
"ephemeral": <boolean> optional
"mutable": <boolean> optional
- The "type" specifies the type of data stored in this column. If
- "ephemeral" is specified as true, then this column's values are
+ The "type" specifies the type of data stored in this column.
+
+ If "ephemeral" is specified as true, then this column's values are
not guaranteed to be durable; they may be lost when the database
- restarts. If "mutable" is specified as false, then this column's
- values may not be modified after they are initially set with the
- "insert" operation.
+ restarts. A column whose type (either key or value) is a strong
+ reference to a table that is not part of the root set is always
+ durable, regardless of this value. (Otherwise, restarting the
+ database could lose entire rows.)
+
+ If "mutable" is specified as false, then this column's values may
+ not be modified after they are initially set with the "insert"
+ operation.
<type>
The number of rows in a table exceeds the maximum number
permitted by the table's "maxRows" value (see <table-schema>).
+ "error": "constraint violation"
+
+ Two or more rows in a table had the same values in the columns
+ that comprise an index.
+
+ "error": "resources exhausted"
+ "error": "I/O error"
+
+ As described in the definition of <error> above.
+
If "params" contains one or more "wait" operations, then the
transaction may take an arbitrary amount of time to complete. The
database implementation must be capable of accepting, executing, and