@dbml/core 2.2.0 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/lib/export/DbmlExporter.js +15 -4
  2. package/lib/export/JsonExporter.js +1 -3
  3. package/lib/export/ModelExporter.js +1 -3
  4. package/lib/export/MysqlExporter.js +50 -42
  5. package/lib/export/PostgresExporter.js +64 -49
  6. package/lib/export/SqlServerExporter.js +52 -46
  7. package/lib/model_structure/database.js +73 -28
  8. package/lib/model_structure/dbState.js +1 -3
  9. package/lib/model_structure/element.js +13 -13
  10. package/lib/model_structure/endpoint.js +18 -14
  11. package/lib/model_structure/enum.js +18 -14
  12. package/lib/model_structure/enumValue.js +16 -12
  13. package/lib/model_structure/field.js +47 -13
  14. package/lib/model_structure/indexColumn.js +16 -12
  15. package/lib/model_structure/indexes.js +18 -14
  16. package/lib/model_structure/ref.js +19 -16
  17. package/lib/model_structure/schema.js +24 -36
  18. package/lib/model_structure/table.js +19 -15
  19. package/lib/model_structure/tableGroup.js +18 -14
  20. package/lib/model_structure/utils.js +5 -0
  21. package/lib/parse/Parser.js +2 -4
  22. package/lib/parse/buildParser.js +1 -3
  23. package/lib/parse/dbml/parser.pegjs +64 -20
  24. package/lib/parse/dbmlParser.js +1401 -899
  25. package/lib/parse/mssql/constraint_definition/actions.js +2 -2
  26. package/lib/parse/mssql/fk_definition/actions.js +10 -3
  27. package/lib/parse/mssql/keyword_parsers.js +0 -1
  28. package/lib/parse/mssql/statements/actions.js +9 -6
  29. package/lib/parse/mssql/statements/statement_types/alter_table/actions.js +11 -5
  30. package/lib/parse/mssql/statements/statement_types/create_index/actions.js +6 -1
  31. package/lib/parse/mssql/statements/statement_types/create_table/actions.js +12 -10
  32. package/lib/parse/mssql/utils.js +16 -1
  33. package/lib/parse/mysql/parser.pegjs +57 -34
  34. package/lib/parse/mysqlParser.js +270 -218
  35. package/lib/parse/postgresParser.js +12 -10
  36. package/lib/parse/postgresql/Base_rules.pegjs +45 -10
  37. package/lib/parse/postgresql/Commands/Alter_table/Alter_table.pegjs +2 -1
  38. package/lib/parse/postgresql/Commands/Create_table/Create_table_normal.pegjs +5 -3
  39. package/lib/parse/postgresql/Commands/Create_table/Create_table_of.pegjs +1 -1
  40. package/lib/parse/postgresql/Commands/Create_table/Create_table_partition_of.pegjs +1 -1
  41. package/lib/parse/postgresql/Commands/Create_type/Create_type_enum.pegjs +2 -2
  42. package/lib/parse/postgresql/InitializerUtils.pegjs +10 -0
  43. package/lib/parse/postgresql/parser.pegjs +2 -1
  44. package/lib/parse/schemarbParser.js +3 -3
  45. package/package.json +5 -3
  46. package/types/export/ModelExporter.d.ts +5 -0
  47. package/types/export/index.d.ts +5 -0
  48. package/types/import/index.d.ts +5 -0
  49. package/types/index.d.ts +5 -0
  50. package/types/model_structure/database.d.ts +195 -0
  51. package/types/model_structure/dbState.d.ts +14 -0
  52. package/types/model_structure/element.d.ts +21 -0
  53. package/types/model_structure/endpoint.d.ts +55 -0
  54. package/types/model_structure/enum.d.ts +67 -0
  55. package/types/model_structure/enumValue.d.ts +39 -0
  56. package/types/model_structure/field.d.ts +77 -0
  57. package/types/model_structure/indexColumn.d.ts +37 -0
  58. package/types/model_structure/indexes.d.ts +74 -0
  59. package/types/model_structure/ref.d.ts +66 -0
  60. package/types/model_structure/schema.d.ts +188 -0
  61. package/types/model_structure/table.d.ts +118 -0
  62. package/types/model_structure/tableGroup.d.ts +54 -0
  63. package/types/parse/Parser.d.ts +11 -0
  64. package/lib/export/Exporter.js +0 -80
  65. package/lib/export/SchemaExporter.js +0 -99
  66. package/lib/parse/dbml/multiline_content.txt +0 -7
  67. package/lib/parse/dbml/multiline_string.pegjs +0 -17
  68. package/lib/parse/dbml/parser1.json +0 -219
  69. package/lib/parse/dbml/parser1.pegjs +0 -702
  70. package/lib/parse/dbml/parser1_content.txt +0 -29
  71. package/lib/parse/dbml/test_multiline.js +0 -53
  72. package/lib/parse/dbml/test_parser1.js +0 -16
  73. package/lib/parse/mssql/base_utils.js +0 -28
  74. package/lib/parse/mssql/composite_parsers.js +0 -109
  75. package/lib/parse/mssql/statement_types/alter_table/actions.js +0 -29
  76. package/lib/parse/mssql/statement_types/alter_table/add/actions.js +0 -8
  77. package/lib/parse/mssql/statement_types/alter_table/add/index.js +0 -58
  78. package/lib/parse/mssql/statement_types/alter_table/index.js +0 -32
  79. package/lib/parse/mssql/statement_types/create_index/actions.js +0 -25
  80. package/lib/parse/mssql/statement_types/create_index/index.js +0 -50
  81. package/lib/parse/mssql/statement_types/create_table/actions.js +0 -95
  82. package/lib/parse/mssql/statement_types/create_table/index.js +0 -50
  83. package/lib/parse/mssql/statement_types/index.js +0 -13
  84. package/lib/schema/element.js +0 -84
  85. package/lib/schema/endpoint.js +0 -102
  86. package/lib/schema/enum.js +0 -102
  87. package/lib/schema/enumValue.js +0 -70
  88. package/lib/schema/field.js +0 -104
  89. package/lib/schema/indexes.js +0 -74
  90. package/lib/schema/ref.js +0 -93
  91. package/lib/schema/schema.js +0 -245
  92. package/lib/schema/table.js +0 -163
  93. package/lib/schema/tableGroup.js +0 -93
@@ -2,7 +2,7 @@
2
2
 
3
3
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
4
4
 
5
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
5
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
6
6
 
7
7
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
8
8
 
@@ -55,7 +55,7 @@ function makeTableConstraint(constraintName, option) {
55
55
  if (!option) return null;
56
56
  return {
57
57
  type: option.type,
58
- value: _objectSpread({}, option.value, {
58
+ value: _objectSpread(_objectSpread({}, option.value), {}, {
59
59
  name: option.type === 'indexes' && option.value.pk ? null : constraintName
60
60
  })
61
61
  };
@@ -2,9 +2,13 @@
2
2
 
3
3
  var _ = require('lodash');
4
4
 
5
+ var _require = require('../utils'),
6
+ getFullTableName = _require.getFullTableName;
7
+
5
8
  function makeEndPoint(tableName, columnName, relation) {
6
9
  return {
7
- tableName: tableName[tableName.length - 1],
10
+ tableName: tableName.name,
11
+ schemaName: tableName.schemaName,
8
12
  fieldNames: columnName,
9
13
  relation: relation
10
14
  };
@@ -24,7 +28,8 @@ function setOption(value, fkOptions) {
24
28
 
25
29
  function makeColumnConstraintFK(_unused, tableName, columnName, fkOptions) {
26
30
  var value = {};
27
- value.endpoint = makeEndPoint(tableName, columnName, '1');
31
+ var fullTableName = getFullTableName(tableName);
32
+ value.endpoint = makeEndPoint(fullTableName, columnName, '1');
28
33
  setOption(value, fkOptions);
29
34
  return {
30
35
  type: 'inline_refs',
@@ -43,6 +48,7 @@ function makeTableEndpoint(columnNames) {
43
48
 
44
49
  function makeTableConstraintFK(_keyword1, endpoint1, _keyword2, tableName, endpoint2, fkOptions) {
45
50
  var value = {};
51
+ var fullTableName = getFullTableName(tableName);
46
52
 
47
53
  if (!endpoint2) {
48
54
  // eslint-disable-next-line no-param-reassign
@@ -55,7 +61,8 @@ function makeTableConstraintFK(_keyword1, endpoint1, _keyword2, tableName, endpo
55
61
 
56
62
  endpoint1.value.relation = '*';
57
63
  endpoint2.value.relation = '1';
58
- endpoint2.value.tableName = _.last(tableName);
64
+ endpoint2.value.tableName = fullTableName.name;
65
+ endpoint2.value.schemaName = fullTableName.schemaName;
59
66
  value.endpoints = [endpoint1.value, endpoint2.value];
60
67
  setOption(value, fkOptions);
61
68
  return {
@@ -72,7 +72,6 @@ exports.KeywordNoCheck = keyword(/NOCHECK/i);
72
72
  exports.KeywordDrop = keyword(/DROP/i);
73
73
  exports.KeywordAlterColumn = keyword(/ALTER COLUMN/i);
74
74
  exports.KeywordGo = keyword(/GO/i);
75
- exports.KeywordDrop = keyword(/DROP/i);
76
75
  exports.KeywordBulkInsert = keyword(/BULK INSERT/i);
77
76
  exports.KeywordInsert = keyword(/INSERT/i);
78
77
  exports.KeywordUpdate = keyword(/UPDATE/i);
@@ -2,10 +2,13 @@
2
2
 
3
3
  var _ = require('lodash');
4
4
 
5
- function findTable(ast, tableName) {
6
- return ast.tables.find(function (_table) {
7
- return _table.name === tableName;
5
+ function findTable(ast, tableName, schemaName) {
6
+ var realSchemaName = schemaName || 'public';
7
+ var table = ast.tables.find(function (t) {
8
+ var targetSchemaName = t.schemaName || 'public';
9
+ return targetSchemaName === realSchemaName && t.name === tableName;
8
10
  });
11
+ return table;
9
12
  }
10
13
 
11
14
  function findField(table, fieldName) {
@@ -15,7 +18,7 @@ function findField(table, fieldName) {
15
18
  }
16
19
 
17
20
  function handleIndexes(index, ast) {
18
- var table = findTable(ast, index.tableName);
21
+ var table = findTable(ast, index.tableName, index.schemaName);
19
22
  table.indexes.push(index);
20
23
  index.tableName = null;
21
24
  }
@@ -37,7 +40,7 @@ function handleTable(table, ast) {
37
40
  }
38
41
 
39
42
  function handleDefaults(dbdefault, ast) {
40
- var table = findTable(ast, dbdefault.tableName);
43
+ var table = findTable(ast, dbdefault.tableName, dbdefault.schemaName);
41
44
  var field = findField(table, dbdefault.fieldName);
42
45
  dbdefault.fieldName = null;
43
46
  dbdefault.tableName = null;
@@ -45,7 +48,7 @@ function handleDefaults(dbdefault, ast) {
45
48
  }
46
49
 
47
50
  function handleEnums(_enum, ast) {
48
- var table = findTable(ast, _enum.tableName);
51
+ var table = findTable(ast, _enum.tableName, _enum.schemaName);
49
52
  var field = findField(table, _enum.fieldName);
50
53
  _enum.name = "".concat(_enum.tableName, "_").concat(_enum.fieldName, "_enum");
51
54
  _enum.fieldName = null;
@@ -2,31 +2,37 @@
2
2
 
3
3
  var _ = require('lodash');
4
4
 
5
+ var _require = require('../../../utils'),
6
+ getFullTableName = _require.getFullTableName;
7
+
5
8
  function handleRef(tableName, result) {
6
9
  var endpointWithNoTableName = result.value.endpoints.find(function (ele) {
7
10
  return !ele.tableName;
8
11
  });
9
- endpointWithNoTableName.tableName = _.last(tableName);
12
+ endpointWithNoTableName.tableName = tableName.name;
13
+ endpointWithNoTableName.schemaName = tableName.schemaName;
10
14
  }
11
15
 
12
16
  function addTableName(tableName, result) {
13
- result.value.tableName = _.last(tableName);
17
+ result.value.tableName = tableName.name;
18
+ result.value.schemaName = tableName.schemaName;
14
19
  }
15
20
 
16
21
  function handleAlterTableResult(_keyword, tableName, results) {
17
- if (!results) return null; // eslint-disable-next-line consistent-return
22
+ if (!results) return null;
23
+ var fullName = getFullTableName(tableName); // eslint-disable-next-line consistent-return
18
24
 
19
25
  results.forEach(function (result) {
20
26
  if (result) {
21
27
  switch (result.type) {
22
28
  case 'refs':
23
- handleRef(tableName, result);
29
+ handleRef(fullName, result);
24
30
  break;
25
31
 
26
32
  case 'indexes':
27
33
  case 'dbdefault':
28
34
  case 'enums':
29
- addTableName(tableName, result);
35
+ addTableName(fullName, result);
30
36
  break;
31
37
 
32
38
  default:
@@ -1,6 +1,10 @@
1
1
  "use strict";
2
2
 
3
+ var _require = require('../../../utils'),
4
+ getFullTableName = _require.getFullTableName;
5
+
3
6
  function makeIndex(_create, isUnique, _clustered, _index, indexName, _on, tableName, columnNames) {
7
+ var fullTableName = getFullTableName(tableName);
4
8
  var columns = [];
5
9
  columnNames.forEach(function (columnName) {
6
10
  columns.push({
@@ -13,7 +17,8 @@ function makeIndex(_create, isUnique, _clustered, _index, indexName, _on, tableN
13
17
  value: {
14
18
  name: indexName,
15
19
  unique: isUnique ? true : null,
16
- tableName: tableName[tableName.length - 1],
20
+ tableName: fullTableName.name,
21
+ schemaName: fullTableName.schemaName,
17
22
  columns: columns
18
23
  }
19
24
  };
@@ -2,12 +2,15 @@
2
2
 
3
3
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
4
4
 
5
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
5
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
6
6
 
7
7
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
8
8
 
9
9
  var _ = require('lodash');
10
10
 
11
+ var _require = require('../../../utils'),
12
+ getFullTableName = _require.getFullTableName;
13
+
11
14
  function createRefFromInlineRef(linesRefs, inlineRefs, fieldName, tableName) {
12
15
  if (!inlineRefs || inlineRefs.length === 0) return;
13
16
  var newRef = {};
@@ -16,7 +19,8 @@ function createRefFromInlineRef(linesRefs, inlineRefs, fieldName, tableName) {
16
19
  newRef.onDelete = inlineRef.onDelete;
17
20
  newRef.endpoints = [];
18
21
  newRef.endpoints.push({
19
- tableName: tableName,
22
+ tableName: tableName.name,
23
+ schemaName: tableName.schemaName,
20
24
  fieldNames: [fieldName],
21
25
  relation: '*'
22
26
  });
@@ -33,7 +37,7 @@ function pushOutEnum(linesEnums, fieldValue, tableName) {
33
37
  if (fieldValue.enums) {
34
38
  var _enum = fieldValue.enums;
35
39
  var fieldType = fieldValue.type;
36
- _enum.name = "".concat(tableName, "_").concat(fieldValue.enums.name);
40
+ _enum.name = "".concat(tableName.schemaName ? "".concat(tableName.schemaName, "_") : '').concat(tableName.name, "_").concat(fieldValue.enums.name);
37
41
  fieldType.type_name = _enum.name;
38
42
  fieldType.args = _enum.values.map(function (value) {
39
43
  return "'".concat(value.name, "'");
@@ -71,7 +75,8 @@ function getLinesValue(lines, tableName) {
71
75
 
72
76
  if (line.type === 'refs') {
73
77
  var ref = line.value;
74
- ref.endpoints[0].tableName = tableName;
78
+ ref.endpoints[0].tableName = tableName.name;
79
+ ref.endpoints[0].schemaName = tableName.schemaName;
75
80
  }
76
81
 
77
82
  value[line.type].push(line.value);
@@ -84,14 +89,11 @@ function getLinesValue(lines, tableName) {
84
89
  }
85
90
 
86
91
  function makeTable(_keyword, tableName, _keyword2, lines) {
87
- var linesValue = getLinesValue(lines, _.last(tableName));
92
+ var fullName = getFullTableName(tableName);
93
+ var linesValue = getLinesValue(lines, fullName);
88
94
  return {
89
95
  type: 'tables',
90
- value: _objectSpread({
91
- name: _.last(tableName)
92
- }, linesValue.value, {
93
- schemaName: tableName.length > 1 ? tableName[tableName.length - 2] : null
94
- })
96
+ value: _objectSpread(_objectSpread({}, fullName), linesValue.value)
95
97
  };
96
98
  }
97
99
 
@@ -1,9 +1,11 @@
1
1
  "use strict";
2
2
 
3
- function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
3
+ function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
4
4
 
5
5
  var P = require('parsimmon');
6
6
 
7
+ var _ = require('lodash');
8
+
7
9
  var _require = require('./keyword_parsers'),
8
10
  LParen = _require.LParen,
9
11
  RParen = _require.RParen,
@@ -47,4 +49,17 @@ exports.streamline = function (type) {
47
49
  };
48
50
  });
49
51
  };
52
+ };
53
+
54
+ exports.getFullTableName = function (nameList) {
55
+ var schemaName = null;
56
+
57
+ if (nameList.length > 1) {
58
+ schemaName = nameList[nameList.length - 2];
59
+ }
60
+
61
+ return {
62
+ name: _.last(nameList),
63
+ schemaName: schemaName
64
+ };
50
65
  };
@@ -4,6 +4,15 @@
4
4
  const refs = [];
5
5
  const enums = [];
6
6
 
7
+ // TODO: support configurable default schema name other than 'public'
8
+ const findTable = (schemaName, tableName) => {
9
+ const realSchemaName = schemaName || 'public';
10
+ const table = tables.find(table => {
11
+ const targetSchemaName = table.schemaName || 'public';
12
+ return targetSchemaName === realSchemaName && table.name === tableName;
13
+ });
14
+ return table;
15
+ };
7
16
  // intput:
8
17
  // `
9
18
  // 'created'
@@ -35,31 +44,16 @@ Expr =
35
44
  // TableSyntax: support "CREATE TABLE" syntax.
36
45
  // Try to support as mush as possible syntax in MySQL offical documents.
37
46
  // https://dev.mysql.com/doc/refman/8.0/en/create-table.html
38
- // Return: table object: {name, fields, [,indexes]}
47
+ // Return: table object: {name, schemaName, fields, [,indexes]}
39
48
  TableSyntax
40
- = create_table (__ if_not_exist)? __ name:table_name _
49
+ = create_table (__ if_not_exist)? __ table_name:table_name _
41
50
  "(" _ body:TableBody _ ")" _ TableOptions? _ semicolon endline?
42
51
  {
43
52
  const fields = body.fields;
44
53
  const indexes = body.indexes;
45
- // push inline_ref to refs
54
+ const bodyRefs = body.refs;
55
+
46
56
  fields.forEach((field)=>{
47
- (field.inline_ref || []).forEach(ref => {
48
- const endpoints = [
49
- {
50
- tableName: name,
51
- fieldNames: [field.name],
52
- relation: "*", //set by default
53
- },
54
- ref.endpoint,
55
- ]
56
- refs.push({
57
- endpoints,
58
- onUpdate: ref.onUpdate,
59
- onDelete: ref.onDelete,
60
- });
61
- })
62
-
63
57
  // process enum: rename enum and push to array `enums`
64
58
  if (field.type.type_name.toLowerCase() === 'enum') {
65
59
  let enumValuesArr = field.type.args.split(/[\s\r\n\n]*,[\s\r\n\n]*/);
@@ -74,18 +68,26 @@ TableSyntax
74
68
  });
75
69
 
76
70
  const _enum = {
77
- name: `${name}_${field.name}_enum`,
71
+ name: `${table_name.schemaName
72
+ ? `${table_name.schemaName}_` : ''}${table_name.name}_${field.name}_enum`,
78
73
  values
79
74
  };
80
75
  enums.push(_enum);
81
76
  field.type.type_name = _enum.name;
82
77
  }
78
+ });
79
+
80
+ bodyRefs.forEach(ref => {
81
+ ref.endpoints[0].tableName = table_name.name;
82
+ ref.endpoints[0].schemaName = table_name.schemaName;
83
+ ref.endpoints[0].relation = '*';
84
+ refs.push(ref);
85
+ });
83
86
 
84
- })
85
87
  // return statement
86
88
  return indexes ?
87
- {name, fields, indexes}
88
- : {name, fields}
89
+ {...table_name, fields, indexes}
90
+ : {...table_name, fields}
89
91
  }
90
92
 
91
93
  // TableBody: this is the part between parenthesis.
@@ -124,9 +126,9 @@ TableBody = _ lines:Line* _ {
124
126
  onUpdate: key.onUpdate,
125
127
  onDelete: key.onDelete,
126
128
  });
127
- })
129
+ });
128
130
 
129
- return {fields, indexes}
131
+ return {fields, indexes, refs: fks}
130
132
  }
131
133
 
132
134
  // Line: is create_definition in MySQL documents.
@@ -158,7 +160,8 @@ FKSyntax = _ constraint:("CONSTRAINT"i _ name)? _ foreign_key _
158
160
  relation: "*",
159
161
  },
160
162
  {
161
- tableName: table2,
163
+ tableName: table2.name,
164
+ schemaName: table2.schemaName,
162
165
  fieldNames: fields2,
163
166
  relation: "1",
164
167
  }
@@ -184,7 +187,7 @@ UniqueSyntax
184
187
  // IndexInLineSyntax: Support "[UNIQUE] (INDEX/KEY) `indexName`(`field` (ASC/DESC)?)"
185
188
  // "KEY is normally a synonym for INDEX".
186
189
  IndexInLineSyntax = _ unique:index_in_line
187
- _ name:name? _ type1:index_type?
190
+ _ name:name? _ type1:index_type? _
188
191
  "(" _ columns:IndexColumnValues _")" IndexOption? type2:index_type?
189
192
  {
190
193
  const index = { columns };
@@ -304,16 +307,19 @@ CheckConstraintSyntax = _ ("CONSTRAINT"i name _)? "CHECK"i _ expression _ ("NOT"
304
307
  // AlterSyntax: support "ALTER TABLE" syntax
305
308
  // We will support ADD_COLUMN, ADD_FOREIGN_KEY, ADD_INDEX
306
309
  // https://dev.mysql.com/doc/refman/8.0/en/alter-table.html
307
- AlterSyntax = alter_table _ table:name _
310
+ AlterSyntax = alter_table _ table:table_name _
308
311
  options:(AddOptions/ChangeOptions/DropOptions) _
309
312
  semicolon
310
313
  {
311
314
  const fks = _.flatten(options.filter(o => o.type === "add_fk").map(o => o.fks));
312
- fks.forEach(fk => {fk.endpoints[0].tableName = table});
315
+ fks.forEach(fk => {
316
+ fk.endpoints[0].tableName = table.name;
317
+ fk.endpoints[0].schemaName = table.schemaName;
318
+ });
313
319
  refs.push(...fks)
314
320
 
315
321
  const pks = _.flatten(options.filter(o => o.type === "add_pk").map(o => o.pks));
316
- const tableAlter = tables.find((t) => t.name === table);
322
+ const tableAlter = findTable(table.schemaName, table.name);
317
323
 
318
324
  const index = {
319
325
  columns: pks.map(field => ({
@@ -350,7 +356,7 @@ DropOptions = "DROP"i [^;]
350
356
 
351
357
  // IndexSyntax: support "CREATE INDEX" syntax
352
358
  IndexSyntax = constraint:create_index _ indexName:name _
353
- "ON"i _ tableName:name _ indexType:index_type? _
359
+ "ON"i _ tableName:table_name _ indexType:index_type? _
354
360
  columns: IndexColumn _
355
361
  option:IndexOption? semicolon
356
362
  {
@@ -367,7 +373,8 @@ IndexSyntax = constraint:create_index _ indexName:name _
367
373
  if(type)
368
374
  index.type = type;
369
375
 
370
- const table = tables.find(table => table.name === tableName);
376
+ const table = findTable(tableName.schemaName, tableName.name);
377
+
371
378
  if(table.indexes) {
372
379
  table.indexes.push(index);
373
380
  } else {
@@ -467,8 +474,24 @@ index_type "index type" = "USING"i _ type:("BTREE"i/"HASH"i) { return type.toUpp
467
474
  name "valid name"
468
475
  = c:(character)+ { return c.join("") }
469
476
  / quote c:[^`]+ quote { return c.join("") }
470
- table_name "valid table name"
471
- = (name _ "." _)* name:name { return name }
477
+
478
+ path_name = names:(name _ "." _)* {
479
+ let dbName = null;
480
+ let schemaName = null;
481
+ if (names && names.length > 0) {
482
+ if (names.length === 1) schemaName = names[0][0];
483
+ else {
484
+ dbName = names[0][0];
485
+ schemaName = names[1][0];
486
+ }
487
+ }
488
+ return { dbName, schemaName }
489
+ }
490
+
491
+ table_name "valid table name" = pathName:path_name name:name {
492
+ return { ...pathName, name }
493
+ }
494
+
472
495
  type "type" = c:type_name { return c }
473
496
  / c:name { return { type_name: c } }
474
497
  type_name = type_name:name _ args:("(" _ expression _ ")")? {