Appendix 5: JSON Schema Grammar
What follows is taken from the JSON validation grammar with the tree building rules removed.
Rules
json_schema: '{'
'"tables"' ':' '[' opt_tables ']' ','
'"virtualTables"' ':' '[' opt_virtual_tables ']' ','
'"views"' ':' '[' opt_views ']' ','
'"indices"' ':' '[' opt_indices ']' ','
'"triggers"' ':' '[' opt_triggers ']' ','
'"attributes"' ':' '[' opt_attribute_list ']' ','
'"queries"' ':' '[' opt_queries ']' ','
'"inserts"' ':' '[' opt_inserts ']' ','
'"generalInserts"' ':' '[' opt_inserts_general ']' ','
'"updates"' ':' '[' opt_updates ']' ','
'"deletes"' ':' '[' opt_deletes ']' ','
'"general"' ':' '[' opt_generals ']' ','
'"declareProcs"' ':' '[' opt_declare_procs']' ','
'"declareNoCheckProcs"' ':' '[' opt_declare_no_check_procs']' ','
'"declareFuncs"' ':' '[' opt_declare_funcs']' ','
'"declareNoCheckFuncs"' ':' '[' opt_declare_no_check_funcs']' ','
'"declareSelectFuncs"' ':' '[' opt_declare_select_funcs']' ','
'"declareNoCheckSelectFuncs"' ':' '[' opt_declare_no_check_select_funcs']' ','
'"interfaces"' ':' '[' opt_interfaces ']' ','
'"regions"' ':' '[' opt_regions ']' ','
'"adHocMigrationProcs"' ':' '[' opt_ad_hoc_migrations ']' ','
'"enums"' ':' '[' opt_enums ']' ','
'"constantGroups"' ':' '[' opt_const_groups ']' ','
'"subscriptions"' ':' '[' opt_subscriptions ']'
'}'
;
BOOL_LITERAL: '0' | '1'
;
opt_tables: | tables
;
tables: table | table ',' tables
;
opt_backing_details: | '"isBacking"' ':' '1' ',' | '"isBacked"' ':' '1' ',' '"typeHash"' ':' num_literal ','
;
opt_type_hash: | '"typeHash"' ':' num_literal ','
;
table: '{'
'"name"' ':' STRING_LITERAL ','
'"schema"' ':' STRING_LITERAL ','
'"crc"' ':' STRING_LITERAL ','
'"isTemp"' ':' BOOL_LITERAL ','
'"ifNotExists"' ':' BOOL_LITERAL ','
'"withoutRowid"' ':' BOOL_LITERAL ','
'"isAdded"' ':' BOOL_LITERAL ','
opt_added_version
'"isDeleted"' ':' BOOL_LITERAL ','
opt_deleted_version
'"isRecreated"' ':' BOOL_LITERAL ','
opt_recreate_group_name
opt_unsub_version
opt_backing_details
opt_region_info
opt_table_indices
opt_attributes
'"columns"' ':' '[' columns ']' ','
'"primaryKey"' ':' '[' opt_column_names ']' ','
'"primaryKeySortOrders"' ':' '[' opt_sort_order_names ']' ','
opt_primary_key_name
'"foreignKeys"' ':' '[' opt_foreign_keys ']' ','
'"uniqueKeys"' ':' '[' opt_unique_keys ']' ','
'"checkExpressions"' ':' '[' opt_check_expressions ']'
'}'
;
opt_primary_key_name: | '"primaryKeyName"' ':' STRING_LITERAL ','
;
opt_virtual_tables: | virtual_tables
;
virtual_tables: virtual_table | virtual_table ',' virtual_tables
;
virtual_table: '{'
'"name"' ':' STRING_LITERAL ','
'"schema"' ':' STRING_LITERAL ','
'"crc"' ':' STRING_LITERAL ','
'"isTemp"' ':' '0' ','
'"ifNotExists"' ':' BOOL_LITERAL ','
'"withoutRowid"' ':' BOOL_LITERAL ','
'"isAdded"' ':' BOOL_LITERAL ','
opt_added_version
'"isDeleted"' ':' BOOL_LITERAL ','
opt_deleted_version
'"isRecreated"' ':' BOOL_LITERAL ','
opt_region_info
'"isVirtual"' ':' '1' ','
'"isEponymous"' ':' BOOL_LITERAL ','
'"module"' ':' STRING_LITERAL ','
opt_module_args
opt_attributes
'"columns"' ':' '[' columns ']' ','
'"primaryKey"' ':' '[' opt_column_names ']' ','
'"primaryKeySortOrders"' ':' '[' opt_sort_order_names ']' ','
'"foreignKeys"' ':' '[' opt_foreign_keys ']' ','
'"uniqueKeys"' ':' '[' opt_unique_keys ']' ','
'"checkExpressions"' ':' '[' opt_check_expressions ']'
'}'
;
opt_module_args: | '"moduleArgs"' ':' STRING_LITERAL ','
;
opt_added_version: | '"addedVersion"' ':' any_integer ',' opt_added_migration_proc
;
opt_added_migration_proc: | '"addedMigrationProc"' ':' STRING_LITERAL ','
;
opt_unsub_version: | '"unsubscribedVersion"' ':' any_integer ','
;
opt_deleted_version: | '"deletedVersion"' ':' any_integer ',' opt_deleted_migration_proc
;
opt_deleted_migration_proc: | '"deletedMigrationProc"' ':' STRING_LITERAL ','
;
opt_recreate_group_name: | '"recreateGroupName"' ':' STRING_LITERAL ','
;
opt_index_names: | index_names
;
index_names: STRING_LITERAL | STRING_LITERAL ',' index_names
;
opt_arg_names: | arg_names
;
arg_names: STRING_LITERAL | STRING_LITERAL ',' arg_names
;
opt_column_names: | column_names
;
column_names: STRING_LITERAL | STRING_LITERAL ',' column_names
;
opt_table_names: | table_names
;
table_names: STRING_LITERAL | STRING_LITERAL ',' table_names
;
opt_view_names: | view_names
;
view_names: STRING_LITERAL | STRING_LITERAL ',' view_names
;
opt_procedure_names: | procedure_names
;
procedure_names: STRING_LITERAL | STRING_LITERAL ',' procedure_names
;
opt_sort_order_names: | sort_order_names
;
sort_order_names: STRING_LITERAL | STRING_LITERAL ',' sort_order_names
;
columns: column | column ',' columns
;
column: '{'
'"name"' ':' STRING_LITERAL ','
opt_attributes
'"type"' ':' STRING_LITERAL ','
opt_kind
opt_is_sensitive
'"isNotNull"' ':' BOOL_LITERAL ','
'"isAdded"' ':' BOOL_LITERAL ','
opt_added_version
'"isDeleted"' ':' BOOL_LITERAL ','
opt_deleted_version
opt_default_value
opt_collate
opt_check_expr
opt_type_hash
'"isPrimaryKey"' ':' BOOL_LITERAL ','
'"isUniqueKey"' ':' BOOL_LITERAL ','
'"isAutoIncrement"' ':' BOOL_LITERAL
'}'
;
opt_collate : | '"collate"' ':' STRING_LITERAL ','
;
opt_check_expr: | '"checkExpr"' ':' STRING_LITERAL ',' '"checkExprArgs"' ':' '[' opt_arg_names ']' ','
;
opt_default_value: | '"defaultValue"' ':' any_literal ','
;
opt_foreign_keys : | foreign_keys
;
opt_kind: | '"kind"' ':' STRING_LITERAL ','
;
opt_is_sensitive: | '"isSensitive"' ':' '1' ','
;
foreign_keys : foreign_key | foreign_key ',' foreign_keys
;
foreign_key : '{'
opt_name
'"columns"' ':' '[' column_names ']' ','
'"referenceTable"' ':' STRING_LITERAL ','
'"referenceColumns"' ':' '[' column_names ']' ','
'"onUpdate"' ':' STRING_LITERAL ','
'"onDelete"' ':' STRING_LITERAL ','
'"isDeferred"' ':' BOOL_LITERAL
'}'
;
opt_unique_keys : | unique_keys
;
unique_keys : unique_key | unique_key ',' unique_keys
;
unique_key: '{'
opt_name
'"columns"' ':' '[' column_names ']' ','
'"sortOrders"' ':' '[' sort_order_names ']'
'}'
;
opt_check_expressions: | check_expressions
;
check_expressions: check_expression | check_expression ',' check_expressions
;
check_expression: '{'
opt_name
'"checkExpr"' ':' STRING_LITERAL ','
'"checkExprArgs"' ':' '[' ']'
'}'
;
opt_name: | '"name"' ':' STRING_LITERAL ','
;
opt_table_indices: | table_indices
;
table_indices: '"indices"' ':' '[' opt_index_names ']' ','
;
opt_attributes: | attributes
;
attributes: '"attributes"' ':' '[' attribute_list ']' ','
;
opt_attribute_list: | attribute_list
;
attribute_list: attribute | attribute ',' attribute_list
;
attribute: '{'
'"name"' ':' STRING_LITERAL ','
'"value"' ':' attribute_value
'}'
;
attribute_array: '[' opt_attribute_value_list ']'
;
opt_attribute_value_list: | attribute_value_list
;
attribute_value_list: attribute_value | attribute_value ',' attribute_value_list
;
attribute_value: any_literal | attribute_array
;
any_integer: BOOL_LITERAL | INT_LITERAL
;
any_literal: BOOL_LITERAL |
INT_LITERAL | '-' INT_LITERAL |
LONG_LITERAL | '-' LONG_LITERAL |
REAL_LITERAL | '-' REAL_LITERAL |
STRING_LITERAL | NULL_LITERAL
;
num_literal: BOOL_LITERAL |
INT_LITERAL | '-' INT_LITERAL |
LONG_LITERAL | '-' LONG_LITERAL |
REAL_LITERAL | '-' REAL_LITERAL
;
opt_views: | views
;
views: view | view ',' views
;
view: '{'
'"name"' ':' STRING_LITERAL ','
'"crc"' ':' STRING_LITERAL ','
'"isTemp"' ':' BOOL_LITERAL ','
'"isDeleted"' ':' BOOL_LITERAL ','
opt_deleted_version
opt_region_info
opt_attributes
projection
'"select"' ':' STRING_LITERAL ','
'"selectArgs"' ':' '[' ']' ','
dependencies
'}'
;
opt_region_info: | '"region"' ':' STRING_LITERAL ',' | '"region"' ':' STRING_LITERAL ',' '"deployedInRegion"' ':' STRING_LITERAL ','
;
opt_projection: | projection
;
projection: '"projection"' ':' '[' projected_columns ']' ','
;
projected_columns: projected_column | projected_column ',' projected_columns
;
projected_column: '{'
'"name"' ':' STRING_LITERAL ','
'"type"' ':' STRING_LITERAL ','
opt_kind
opt_is_sensitive
'"isNotNull"' ':' BOOL_LITERAL
'}'
;
opt_indices: | indices
;
indices: index | index ',' indices
;
index: '{'
'"name"' ':' STRING_LITERAL ','
'"crc"' ':' STRING_LITERAL ','
'"table"' ':' STRING_LITERAL ','
'"isUnique"' ':' BOOL_LITERAL ','
'"ifNotExists"' ':' BOOL_LITERAL ','
'"isDeleted"' ':' BOOL_LITERAL ','
opt_deleted_version
opt_region_info
opt_partial_index_where
opt_attributes
'"columns"' ':' '[' column_names ']' ','
'"sortOrders"' ':' '[' sort_order_names ']'
'}'
;
opt_partial_index_where: | '"where"' ':' STRING_LITERAL ','
;
opt_triggers: | triggers
;
triggers: trigger | trigger ',' triggers
;
trigger: '{'
'"name"' ':' STRING_LITERAL ','
'"crc"' ':' STRING_LITERAL ','
'"target"' ':' STRING_LITERAL ','
'"isTemp"' ':' BOOL_LITERAL ','
'"ifNotExists"' ':' BOOL_LITERAL ','
'"isDeleted"' ':' BOOL_LITERAL ','
opt_deleted_version
before_after_instead ','
delete_insert_update ','
opt_for_each_row
opt_when_expr
'"statement"' ':' STRING_LITERAL ','
'"statementArgs"' ':' '[' opt_arg_names ']' ','
opt_region_info
opt_attributes
dependencies
'}'
;
before_after_instead: '"isBeforeTrigger"' ':' '1' | '"isAfterTrigger"' ':' '1' | '"isInsteadOfTrigger"' ':' '1'
;
delete_insert_update: '"isDeleteTrigger"' ':' '1' | '"isInsertTrigger"' ':' '1' | '"isUpdateTrigger"' ':' '1'
;
opt_for_each_row: | '"forEachRow"' ':' BOOL_LITERAL ','
;
opt_when_expr: | '"whenExpr"' ':' STRING_LITERAL ',' '"whenExprArgs"' ':' '[' opt_arg_names ']' ','
;
dependencies: opt_insert_tables
opt_update_tables
opt_delete_tables
opt_from_tables
opt_uses_procedures
opt_uses_views
'"usesTables"' ':' '[' opt_table_names ']'
;
opt_uses_views: | '"usesViews"' ':' '[' opt_view_names ']' ','
;
opt_insert_tables: | '"insertTables"' ':' '[' opt_table_names ']' ','
;
opt_update_tables: | '"updateTables"' ':' '[' opt_table_names ']' ','
;
opt_delete_tables: | '"deleteTables"' ':' '[' opt_table_names ']' ','
;
opt_from_tables: | '"fromTables"' ':' '[' opt_table_names ']' ','
;
opt_uses_procedures : | '"usesProcedures"' ':' '[' opt_procedure_names ']' ','
;
opt_queries: | queries ;
queries: query | query ',' queries ;
query: '{'
'"name"' ':' STRING_LITERAL ','
'"definedInFile"' ':' STRING_LITERAL ','
'"definedOnLine"' ':' INT_LITERAL ','
'"args"' ':' '[' opt_args ']' ','
dependencies ','
opt_region_info
opt_attributes
projection
'"statement"' ':' STRING_LITERAL ','
'"statementArgs"' ':' '[' opt_arg_names ']'
'}'
;
opt_args: | args
;
args: arg | arg ',' args
;
arg: '{'
'"name"' ':' STRING_LITERAL ','
'"argOrigin"' ':' STRING_LITERAL ','
'"type"' ':' STRING_LITERAL ','
opt_kind
opt_is_sensitive
'"isNotNull"' ':' BOOL_LITERAL
'}'
;
opt_inserts: | inserts
;
inserts: insert | insert ',' inserts
;
insert : '{' insert_details ',' '"values"' ':' '[' opt_values ']' '}'
;
opt_inserts_general: | inserts_general
;
inserts_general: insert_general | insert_general ',' inserts_general
;
insert_details:
'"name"' ':' STRING_LITERAL ','
'"definedInFile"' ':' STRING_LITERAL ','
'"definedOnLine"' ':' INT_LITERAL ','
'"args"' ':' '[' opt_args ']' ','
dependencies ','
opt_region_info
opt_attributes
'"table"' ':' STRING_LITERAL ','
'"statement"' ':' STRING_LITERAL ','
'"statementArgs"' ':' '[' opt_arg_names ']' ','
'"statementType"' ':' STRING_LITERAL ','
'"columns"' ':' '[' column_names ']'
insert_general : '{' insert_details '}'
;
opt_values: | values
;
values: value | value ',' values
;
value: '{'
'"value"' ':' STRING_LITERAL ','
'"valueArgs"' ':' '[' opt_arg_names ']'
'}'
;
opt_updates: | updates
;
updates: update | update ',' updates
;
update : '{'
'"name"' ':' STRING_LITERAL ','
'"definedInFile"' ':' STRING_LITERAL ','
'"definedOnLine"' ':' INT_LITERAL ','
'"args"' ':' '[' opt_args ']' ','
dependencies ','
opt_region_info
opt_attributes
'"table"' ':' STRING_LITERAL ','
'"statement"' ':' STRING_LITERAL ','
'"statementArgs"' ':' '[' opt_arg_names ']'
'}'
;
opt_deletes: | deletes
;
deletes: delete | delete ',' deletes
;
delete : '{'
'"name"' ':' STRING_LITERAL ','
'"definedInFile"' ':' STRING_LITERAL ','
'"definedOnLine"' ':' INT_LITERAL ','
'"args"' ':' '[' opt_args ']' ','
dependencies ','
opt_region_info
opt_attributes
'"table"' ':' STRING_LITERAL ','
'"statement"' ':' STRING_LITERAL ','
'"statementArgs"' ':' '[' opt_arg_names ']'
'}'
;
opt_generals: | generals
;
generals: general | general ',' generals
;
general: '{'
'"name"' ':' STRING_LITERAL ','
'"definedInFile"' ':' STRING_LITERAL ','
'"definedOnLine"' ':' INT_LITERAL ','
'"args"' ':' '[' opt_complex_args ']' ','
dependencies ','
opt_regions
opt_attributes
opt_projection
opt_result_contract
'"usesDatabase"' ':' BOOL_LITERAL
'}'
;
opt_result_contract: | '"hasSelectResult"' ':' '1' ',' | '"hasOutResult"' ':' '1' ',' | '"hasOutUnionResult"' ':''1' ','
;
opt_complex_args: | complex_args
;
complex_args: complex_arg | complex_arg ',' complex_args
;
complex_arg: '{'
binding
'"name"' ':' STRING_LITERAL ','
opt_arg_origin
'"type"' ':' STRING_LITERAL ','
opt_kind
opt_is_sensitive
'"isNotNull"' ':' BOOL_LITERAL
'}'
;
binding: | '"binding"' ':' '"inout"' ',' | '"binding"' ':' '"out"' ','
;
opt_arg_origin: | arg_origin
;
arg_origin: '"argOrigin"' ':' STRING_LITERAL ','
;
opt_enums: | enums
;
enums: enum | enum ',' enums
;
enum: '{'
'"name"' ':' STRING_LITERAL ','
'"type"' ':' STRING_LITERAL ','
'"isNotNull"' ':' '1' ','
'"values"' ':' '[' enum_values ']'
'}'
;
enum_values: enum_value | enum_value ',' enum_values
;
enum_value: '{'
'"name"' ':' STRING_LITERAL ','
'"value"' ':' num_literal
'}'
;
opt_declare_procs: | declare_procs
;
declare_procs: declare_proc | declare_proc ',' declare_procs
declare_proc: '{'
'"name"' ':' STRING_LITERAL ','
'"args"' ':' '[' opt_complex_args ']' ','
opt_attributes
opt_projection
'"usesDatabase"' ':' BOOL_LITERAL
'}'
;
opt_declare_no_check_procs: | declare_no_check_procs
;
declare_no_check_procs: declare_no_check_proc | declare_no_check_proc ',' declare_no_check_procs
;
declare_no_check_proc: '{' '"name"' ':' STRING_LITERAL ',' '"attributes"' ':' '[' attribute_list ']' '}' | '{' '"name"' ':' STRING_LITERAL '}'
;
opt_declare_funcs: | declare_funcs
;
declare_funcs: declare_func | declare_func ',' declare_funcs
;
opt_declare_select_funcs: | declare_select_funcs
;
declare_select_funcs: declare_select_func | declare_select_func ',' declare_select_funcs
;
declare_select_func:
'{' '"name"' ':' STRING_LITERAL ',' '"args"' ':' '[' opt_complex_args ']' ',' opt_attributes return_type '}'
| '{' '"name"' ':' STRING_LITERAL ',' '"args"' ':' '[' opt_complex_args ']' ',' opt_attributes '"projection"' ':' '[' projected_columns ']' '}'
;
opt_declare_no_check_funcs: | declare_no_check_funcs
;
declare_no_check_funcs: declare_no_check_func | declare_no_check_func ',' declare_no_check_funcs
;
opt_declare_no_check_select_funcs: | declare_no_check_select_funcs
;
declare_no_check_select_funcs: declare_no_check_select_func | declare_no_check_select_func ',' declare_no_check_select_funcs
;
declare_no_check_select_func:
'{' '"name"' ':' STRING_LITERAL ',' opt_attributes return_type '}'
| '{' '"name"' ':' STRING_LITERAL ',' opt_attributes '"projection"' ':' '[' projected_columns ']' '}'
;
declare_func: '{'
'"name"' ':' STRING_LITERAL ','
'"args"' ':' '[' opt_complex_args ']' ','
opt_attributes
return_type ','
'"createsObject"' ':' BOOL_LITERAL
'}'
;
declare_no_check_func: '{'
'"name"' ':' STRING_LITERAL ','
opt_attributes
return_type ','
'"createsObject"' ':' BOOL_LITERAL
'}'
;
return_type: '"returnType"' ':' '{'
'"type"' ':' STRING_LITERAL ','
opt_kind
opt_is_sensitive
'"isNotNull"' ':' BOOL_LITERAL
'}'
;
opt_interfaces: | interfaces
;
interfaces: interface | interface ',' interfaces
;
interface: '{'
'"name"' ':' STRING_LITERAL ','
'"definedInFile"' ':' STRING_LITERAL ','
'"definedOnLine"' ':' INT_LITERAL ','
opt_attributes
'"projection"' ':' '[' projected_columns ']'
'}'
;
opt_subscriptions: | subscriptions
;
subscriptions: subscription | subscription ',' subscriptions
;
subscription: '{'
'"type"' ':' STRING_LITERAL ','
'"table"' ':' STRING_LITERAL ','
opt_region_info
'"version"' ':' any_integer
'}'
;
opt_const_groups: | const_groups
;
const_groups: const_group | const_group ',' const_groups
;
const_group: '{'
'"name"' ':' STRING_LITERAL ','
'"values"' ':' '[' const_values ']'
'}'
;
const_values: const_value | const_value ',' const_values
;
const_value: '{'
'"name"' ':' STRING_LITERAL ','
'"type"' ':' STRING_LITERAL ','
opt_kind
'"isNotNull"' ':' BOOL_LITERAL ','
'"value"' ':' num_literal
'}'
| '{'
'"name"' ':' STRING_LITERAL ','
'"type"' ':' STRING_LITERAL ','
opt_kind
'"isNotNull"' ':' BOOL_LITERAL ','
'"value"' ':' STRING_LITERAL
'}'
;
opt_regions: | regions
;
regions: region | region ',' regions
;
region: '{'
'"name"' ':' STRING_LITERAL ','
'"isDeployableRoot"' ':' BOOL_LITERAL ','
'"deployedInRegion"' ':' STRING_LITERAL ','
'"using"' ':' '[' opt_region_names ']' ','
'"usingPrivately"' ':' '[' opt_bool_list ']'
'}'
;
opt_region_names: | region_names
;
region_names: STRING_LITERAL | STRING_LITERAL ',' region_names
;
opt_bool_list: | bool_list
;
bool_list: BOOL_LITERAL | BOOL_LITERAL ',' bool_list
;
opt_ad_hoc_migrations: | ad_hoc_migrations
;
ad_hoc_migrations: ad_hoc_migration | ad_hoc_migration ',' ad_hoc_migrations
;
ad_hoc_migration: '{'
'"name"' ':' STRING_LITERAL ','
'"crc"' ':' STRING_LITERAL ','
opt_attributes
'"version"' ':' any_integer
'}'
| '{'
'"name"' ':' STRING_LITERAL ','
'"crc"' ':' STRING_LITERAL ','
opt_attributes
'"onRecreateOf"' ':' STRING_LITERAL
'}'
;