@dbml/cli 5.2.0 → 5.3.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 (47) hide show
  1. package/__tests__/db2dbml/mssql/dbml-error.log +39 -6
  2. package/__tests__/db2dbml/mysql/dbml-error.log +10 -1
  3. package/__tests__/db2dbml/oracle/dbml-error.log +91 -0
  4. package/__tests__/db2dbml/oracle/expect-out-files/schema.dbml +419 -0
  5. package/__tests__/db2dbml/oracle/options.json +8 -0
  6. package/__tests__/db2dbml/oracle/out-files/schema.dbml +419 -0
  7. package/__tests__/db2dbml/oracle/schema.sql +529 -0
  8. package/__tests__/db2dbml/oracle/stdout.txt +1 -0
  9. package/__tests__/db2dbml/postgres/dbml-error.log +25 -4
  10. package/__tests__/dbml2sql/filename --mysql --out-file/out-files/schema.sql +1 -1
  11. package/__tests__/dbml2sql/filename --oracle --out-file/out-files/schema.sql +1 -1
  12. package/__tests__/dbml2sql/filename --out-file/out-files/schema.sql +1 -1
  13. package/__tests__/dbml2sql/filename --postgres --out-file/out-files/schema.sql +1 -1
  14. package/__tests__/dbml2sql/filenames --mysql --out-file/out-files/schema.sql +1 -1
  15. package/__tests__/dbml2sql/filenames --oracle --out-file/out-files/schema.sql +1 -1
  16. package/__tests__/dbml2sql/filenames --out-file/out-files/schema.sql +1 -1
  17. package/__tests__/dbml2sql/filenames --postgres --out-file/out-files/schema.sql +1 -1
  18. package/__tests__/dbml2sql/multiple_schema_mssql/out-files/multiple_schema.out.sql +1 -1
  19. package/__tests__/dbml2sql/multiple_schema_mysql/out-files/multiple_schema.out.sql +1 -1
  20. package/__tests__/dbml2sql/multiple_schema_oracle/out-files/multiple_schema.out.sql +1 -1
  21. package/__tests__/dbml2sql/multiple_schema_pg/out-files/multiple_schema.out.sql +1 -1
  22. package/__tests__/dbml2sql/syntax-error/dbml-error.log +9 -3
  23. package/__tests__/sql2dbml/custom-error-alter-table-column-not-found --oracle/dbml-error.log +51 -0
  24. package/__tests__/sql2dbml/custom-error-alter-table-column-not-found --oracle/out-files/schema.dbml +0 -0
  25. package/__tests__/sql2dbml/custom-error-alter-table-table-not-found --oracle/dbml-error.log +51 -0
  26. package/__tests__/sql2dbml/custom-error-alter-table-table-not-found --oracle/out-files/schema.dbml +0 -0
  27. package/__tests__/sql2dbml/custom-error-column-comment-column-not-found --oracle/dbml-error.log +51 -0
  28. package/__tests__/sql2dbml/custom-error-column-comment-column-not-found --oracle/out-files/schema.dbml +0 -0
  29. package/__tests__/sql2dbml/custom-error-column-comment-table-not-found --oracle/dbml-error.log +51 -0
  30. package/__tests__/sql2dbml/custom-error-column-comment-table-not-found --oracle/out-files/schema.dbml +0 -0
  31. package/__tests__/sql2dbml/custom-error-create-index-table-not-found --oracle/dbml-error.log +51 -0
  32. package/__tests__/sql2dbml/custom-error-create-index-table-not-found --oracle/out-files/schema.dbml +0 -0
  33. package/__tests__/sql2dbml/custom-error-table-comment-table-not-found --oracle/dbml-error.log +27 -0
  34. package/__tests__/sql2dbml/custom-error-table-comment-table-not-found --oracle/out-files/schema.dbml +0 -0
  35. package/__tests__/sql2dbml/filename --oracle --out-file/dbml-error.log +0 -0
  36. package/__tests__/sql2dbml/filename --oracle --out-file/out-files/schema.dbml +83 -0
  37. package/__tests__/sql2dbml/syntax-error/dbml-error.log +45 -3
  38. package/__tests__/sql2dbml/syntax-error-duplicate-endpoints --mssql/dbml-error.log +45 -3
  39. package/__tests__/sql2dbml/syntax-error-duplicate-endpoints --mysql/dbml-error.log +45 -3
  40. package/lib/cli/index.js +1 -0
  41. package/lib/cli/utils.js +1 -1
  42. package/package.json +4 -4
  43. package/src/cli/index.js +1 -0
  44. package/src/cli/utils.js +1 -1
  45. package/__tests__/db2dbml/mssql/out-files/schema.dbml +0 -219
  46. package/__tests__/db2dbml/mysql/out-files/schema.dbml +0 -188
  47. package/__tests__/db2dbml/postgres/out-files/schema.dbml +0 -184
@@ -0,0 +1,529 @@
1
+ -- ============================================================================
2
+ -- ORACLE CONNECTOR TEST SCHEMA
3
+ -- Each test case uses a separate set of tables to avoid accumulated effects
4
+ -- ============================================================================
5
+
6
+ -- ============================================================================
7
+ -- CASE 1: CREATE TABLE with PRIMARY KEY
8
+ -- ============================================================================
9
+ CREATE TABLE pk_simple (
10
+ id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
11
+ name VARCHAR2(100) NOT NULL
12
+ );
13
+
14
+ -- ============================================================================
15
+ -- CASE 2: CREATE TABLE with SELF-REFERENCING FOREIGN KEY
16
+ -- ============================================================================
17
+ CREATE TABLE self_ref_fk (
18
+ id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
19
+ parent_id NUMBER,
20
+ name VARCHAR2(100) NOT NULL,
21
+ CONSTRAINT fk_self_ref FOREIGN KEY (parent_id) REFERENCES self_ref_fk(id) ON DELETE SET NULL
22
+ );
23
+
24
+ -- ============================================================================
25
+ -- CASE 3: CREATE TABLE with NON-SELF-REFERENCING FOREIGN KEY
26
+ -- ============================================================================
27
+ CREATE TABLE fk_parent (
28
+ id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
29
+ name VARCHAR2(100) NOT NULL
30
+ );
31
+
32
+ CREATE TABLE fk_child (
33
+ id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
34
+ parent_id NUMBER NOT NULL,
35
+ description VARCHAR2(200),
36
+ CONSTRAINT fk_child_parent FOREIGN KEY (parent_id) REFERENCES fk_parent(id) ON DELETE CASCADE
37
+ );
38
+
39
+ -- ============================================================================
40
+ -- CASE 4: CREATE TABLE with CHECK CONSTRAINTS
41
+ -- ============================================================================
42
+ CREATE TABLE check_constraints (
43
+ id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
44
+ age NUMBER NOT NULL,
45
+ salary NUMBER(10, 2) NOT NULL,
46
+ status VARCHAR2(20) NOT NULL,
47
+ start_date DATE,
48
+ end_date DATE,
49
+ CONSTRAINT chk_age_positive CHECK (age > 0),
50
+ CONSTRAINT chk_salary_range CHECK (salary BETWEEN 0 AND 1000000),
51
+ CONSTRAINT chk_status_values CHECK (status IN ('active', 'inactive', 'pending')),
52
+ CONSTRAINT chk_date_range CHECK (start_date <= end_date)
53
+ );
54
+
55
+ -- ============================================================================
56
+ -- CASE 5: CREATE TABLE with DEFAULT VALUES
57
+ -- ============================================================================
58
+ CREATE TABLE default_values (
59
+ id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
60
+ str_default VARCHAR2(50) DEFAULT 'default_string',
61
+ num_default NUMBER DEFAULT 42,
62
+ decimal_default NUMBER(10, 2) DEFAULT 99.99,
63
+ date_default DATE DEFAULT SYSDATE,
64
+ timestamp_default TIMESTAMP DEFAULT SYSTIMESTAMP,
65
+ char_default CHAR(10) DEFAULT 'fixed'
66
+ );
67
+
68
+ -- ============================================================================
69
+ -- CASE 6: CREATE TABLE with NOT NULL columns
70
+ -- ============================================================================
71
+ CREATE TABLE not_null_cols (
72
+ id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
73
+ required_str VARCHAR2(100) NOT NULL,
74
+ required_num NUMBER NOT NULL,
75
+ required_date DATE NOT NULL
76
+ );
77
+
78
+ -- ============================================================================
79
+ -- CASE 7: CREATE TABLE with NULLABLE columns
80
+ -- ============================================================================
81
+ CREATE TABLE nullable_cols (
82
+ id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
83
+ optional_str VARCHAR2(100),
84
+ optional_num NUMBER,
85
+ optional_date DATE
86
+ );
87
+
88
+ -- ============================================================================
89
+ -- CASE 8: CREATE TABLE with AUTOINCREMENT (IDENTITY)
90
+ -- ============================================================================
91
+ CREATE TABLE autoincrement_table (
92
+ id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
93
+ name VARCHAR2(100) NOT NULL
94
+ );
95
+
96
+ -- ============================================================================
97
+ -- CASE 9: CREATE TABLE with UNIQUE constraint
98
+ -- ============================================================================
99
+ CREATE TABLE unique_cols (
100
+ id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
101
+ email VARCHAR2(100) NOT NULL UNIQUE,
102
+ username VARCHAR2(50) NOT NULL,
103
+ CONSTRAINT uq_username UNIQUE (username)
104
+ );
105
+
106
+ -- ============================================================================
107
+ -- CASE 10: CREATE TABLE with COMPOSITE PRIMARY KEY
108
+ -- ============================================================================
109
+ CREATE TABLE composite_pk (
110
+ region_id NUMBER NOT NULL,
111
+ product_id NUMBER NOT NULL,
112
+ quantity NUMBER DEFAULT 0,
113
+ price NUMBER(10, 2),
114
+ CONSTRAINT pk_composite PRIMARY KEY (region_id, product_id)
115
+ );
116
+
117
+ -- ============================================================================
118
+ -- CASE 11: CREATE TABLE with COMPOSITE SELF-REFERENCING FOREIGN KEY
119
+ -- ============================================================================
120
+ CREATE TABLE composite_self_ref (
121
+ dept_id NUMBER NOT NULL,
122
+ emp_id NUMBER NOT NULL,
123
+ parent_dept_id NUMBER,
124
+ parent_emp_id NUMBER,
125
+ name VARCHAR2(100) NOT NULL,
126
+ CONSTRAINT pk_composite_self_ref PRIMARY KEY (dept_id, emp_id),
127
+ CONSTRAINT fk_composite_self FOREIGN KEY (parent_dept_id, parent_emp_id)
128
+ REFERENCES composite_self_ref(dept_id, emp_id) ON DELETE SET NULL
129
+ );
130
+
131
+ -- ============================================================================
132
+ -- CASE 12: CREATE TABLE with COMPOSITE UNIQUE constraint
133
+ -- ============================================================================
134
+ CREATE TABLE composite_unique (
135
+ id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
136
+ first_name VARCHAR2(50) NOT NULL,
137
+ last_name VARCHAR2(50) NOT NULL,
138
+ email VARCHAR2(100),
139
+ CONSTRAINT uq_full_name UNIQUE (first_name, last_name)
140
+ );
141
+
142
+ -- ============================================================================
143
+ -- CASE 13: FUNCTIONAL INDEX
144
+ -- ============================================================================
145
+ CREATE TABLE functional_index_table (
146
+ id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
147
+ full_name VARCHAR2(100) NOT NULL,
148
+ email VARCHAR2(100) NOT NULL
149
+ );
150
+
151
+ CREATE INDEX idx_lower_name ON functional_index_table (LOWER(full_name));
152
+ CREATE INDEX idx_upper_email ON functional_index_table (UPPER(email));
153
+
154
+ -- ============================================================================
155
+ -- CASE 14: COMPOSITE INDEX
156
+ -- ============================================================================
157
+ CREATE TABLE composite_index_table (
158
+ id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
159
+ first_name VARCHAR2(50) NOT NULL,
160
+ last_name VARCHAR2(50) NOT NULL,
161
+ department VARCHAR2(50)
162
+ );
163
+
164
+ CREATE INDEX idx_composite_name ON composite_index_table (first_name, last_name);
165
+ CREATE INDEX idx_composite_dept ON composite_index_table (department, last_name);
166
+
167
+ -- ============================================================================
168
+ -- CASE 15: MIXED FUNCTIONAL AND COLUMN INDEX
169
+ -- ============================================================================
170
+ CREATE TABLE mixed_index_table (
171
+ id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
172
+ first_name VARCHAR2(50) NOT NULL,
173
+ last_name VARCHAR2(50) NOT NULL,
174
+ email VARCHAR2(100)
175
+ );
176
+
177
+ CREATE INDEX idx_mixed_name ON mixed_index_table (LOWER(first_name), last_name);
178
+ CREATE INDEX idx_mixed_email ON mixed_index_table (first_name, UPPER(email));
179
+
180
+ -- ============================================================================
181
+ -- CASE 16: COLUMN INDEX (simple)
182
+ -- ============================================================================
183
+ CREATE TABLE column_index_table (
184
+ id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
185
+ category VARCHAR2(50),
186
+ status VARCHAR2(20),
187
+ created_at DATE DEFAULT SYSDATE
188
+ );
189
+
190
+ CREATE INDEX idx_category ON column_index_table (category);
191
+ CREATE INDEX idx_status ON column_index_table (status);
192
+ CREATE INDEX idx_created_at ON column_index_table (created_at);
193
+
194
+ -- ============================================================================
195
+ -- CASE 17: ALTER TABLE to ADD PRIMARY KEY
196
+ -- ============================================================================
197
+ CREATE TABLE alter_add_pk (
198
+ id NUMBER NOT NULL,
199
+ name VARCHAR2(100)
200
+ );
201
+
202
+ ALTER TABLE alter_add_pk ADD CONSTRAINT pk_alter_pk PRIMARY KEY (id);
203
+
204
+ -- ============================================================================
205
+ -- CASE 18: ALTER TABLE to ADD FOREIGN KEY (non-self-ref)
206
+ -- ============================================================================
207
+ CREATE TABLE alter_fk_parent (
208
+ id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
209
+ name VARCHAR2(100)
210
+ );
211
+
212
+ CREATE TABLE alter_fk_child (
213
+ id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
214
+ parent_id NUMBER
215
+ );
216
+
217
+ ALTER TABLE alter_fk_child ADD CONSTRAINT fk_alter_parent
218
+ FOREIGN KEY (parent_id) REFERENCES alter_fk_parent(id) ON DELETE CASCADE;
219
+
220
+ -- ============================================================================
221
+ -- CASE 19: ALTER TABLE to ADD SELF-REFERENCING FOREIGN KEY
222
+ -- ============================================================================
223
+ CREATE TABLE alter_self_ref (
224
+ id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
225
+ parent_id NUMBER,
226
+ name VARCHAR2(100)
227
+ );
228
+
229
+ ALTER TABLE alter_self_ref ADD CONSTRAINT fk_alter_self
230
+ FOREIGN KEY (parent_id) REFERENCES alter_self_ref(id) ON DELETE SET NULL;
231
+
232
+ -- ============================================================================
233
+ -- CASE 20: ALTER TABLE to ADD CHECK CONSTRAINT
234
+ -- ============================================================================
235
+ CREATE TABLE alter_add_check (
236
+ id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
237
+ age NUMBER,
238
+ salary NUMBER(10, 2),
239
+ status VARCHAR2(20)
240
+ );
241
+
242
+ ALTER TABLE alter_add_check ADD CONSTRAINT chk_alter_age CHECK (age >= 18);
243
+ ALTER TABLE alter_add_check ADD CONSTRAINT chk_alter_salary CHECK (salary > 0);
244
+ ALTER TABLE alter_add_check ADD CONSTRAINT chk_alter_status CHECK (status IN ('A', 'B', 'C'));
245
+
246
+ -- ============================================================================
247
+ -- CASE 21: ALTER TABLE to ADD UNIQUE CONSTRAINT
248
+ -- ============================================================================
249
+ CREATE TABLE alter_add_unique (
250
+ id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
251
+ email VARCHAR2(100),
252
+ code VARCHAR2(20)
253
+ );
254
+
255
+ ALTER TABLE alter_add_unique ADD CONSTRAINT uq_alter_email UNIQUE (email);
256
+ ALTER TABLE alter_add_unique ADD CONSTRAINT uq_alter_code UNIQUE (code);
257
+
258
+ -- ============================================================================
259
+ -- CASE 22: ALTER TABLE to ADD COMPOSITE PRIMARY KEY
260
+ -- ============================================================================
261
+ CREATE TABLE alter_composite_pk (
262
+ region_id NUMBER NOT NULL,
263
+ product_id NUMBER NOT NULL,
264
+ quantity NUMBER
265
+ );
266
+
267
+ ALTER TABLE alter_composite_pk ADD CONSTRAINT pk_alter_composite PRIMARY KEY (region_id, product_id);
268
+
269
+ -- ============================================================================
270
+ -- CASE 23: ALTER TABLE to ADD COMPOSITE FOREIGN KEY
271
+ -- ============================================================================
272
+ CREATE TABLE alter_composite_fk_parent (
273
+ dept_id NUMBER NOT NULL,
274
+ emp_id NUMBER NOT NULL,
275
+ name VARCHAR2(100),
276
+ CONSTRAINT pk_alter_comp_parent PRIMARY KEY (dept_id, emp_id)
277
+ );
278
+
279
+ CREATE TABLE alter_composite_fk_child (
280
+ id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
281
+ ref_dept_id NUMBER,
282
+ ref_emp_id NUMBER
283
+ );
284
+
285
+ ALTER TABLE alter_composite_fk_child ADD CONSTRAINT fk_alter_composite
286
+ FOREIGN KEY (ref_dept_id, ref_emp_id) REFERENCES alter_composite_fk_parent(dept_id, emp_id);
287
+
288
+ -- ============================================================================
289
+ -- CASE 24: ALTER TABLE to ADD COMPOSITE UNIQUE
290
+ -- ============================================================================
291
+ CREATE TABLE alter_composite_unique (
292
+ id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
293
+ first_name VARCHAR2(50),
294
+ last_name VARCHAR2(50)
295
+ );
296
+
297
+ ALTER TABLE alter_composite_unique ADD CONSTRAINT uq_alter_fullname UNIQUE (first_name, last_name);
298
+
299
+ -- ============================================================================
300
+ -- CASE 25: ALTER TABLE ADD COLUMN
301
+ -- ============================================================================
302
+ CREATE TABLE alter_add_column (
303
+ id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
304
+ name VARCHAR2(100)
305
+ );
306
+
307
+ ALTER TABLE alter_add_column ADD new_col VARCHAR2(50);
308
+ ALTER TABLE alter_add_column ADD another_col NUMBER DEFAULT 0;
309
+ ALTER TABLE alter_add_column ADD date_col DATE DEFAULT SYSDATE;
310
+
311
+ -- ============================================================================
312
+ -- CASE 26: INDEX - BTREE (default in Oracle)
313
+ -- ============================================================================
314
+ CREATE TABLE idx_btree_table (
315
+ id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
316
+ code VARCHAR2(20),
317
+ category VARCHAR2(50)
318
+ );
319
+
320
+ CREATE INDEX idx_btree_code ON idx_btree_table (code);
321
+
322
+ -- ============================================================================
323
+ -- CASE 27: INDEX - BITMAP
324
+ -- ============================================================================
325
+ CREATE TABLE idx_bitmap_table (
326
+ id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
327
+ gender VARCHAR2(10),
328
+ status VARCHAR2(20)
329
+ );
330
+
331
+ CREATE BITMAP INDEX idx_bitmap_gender ON idx_bitmap_table (gender);
332
+ CREATE BITMAP INDEX idx_bitmap_status ON idx_bitmap_table (status);
333
+
334
+ -- ============================================================================
335
+ -- CASE 28: INDEX - UNIQUE
336
+ -- ============================================================================
337
+ CREATE TABLE idx_unique_table (
338
+ id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
339
+ email VARCHAR2(100),
340
+ ssn VARCHAR2(20)
341
+ );
342
+
343
+ CREATE UNIQUE INDEX idx_unique_email ON idx_unique_table (email);
344
+ CREATE UNIQUE INDEX idx_unique_ssn ON idx_unique_table (ssn);
345
+
346
+ -- ============================================================================
347
+ -- CASE 29: INDEX - COMPOSITE
348
+ -- ============================================================================
349
+ CREATE TABLE idx_composite_only (
350
+ id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
351
+ col1 VARCHAR2(50),
352
+ col2 VARCHAR2(50),
353
+ col3 VARCHAR2(50)
354
+ );
355
+
356
+ CREATE INDEX idx_comp_12 ON idx_composite_only (col1, col2);
357
+ CREATE INDEX idx_comp_23 ON idx_composite_only (col2, col3);
358
+ CREATE INDEX idx_comp_123 ON idx_composite_only (col1, col2, col3);
359
+
360
+ -- ============================================================================
361
+ -- CASE 30: INDEX - FUNCTIONAL (via ALTER/separate CREATE)
362
+ -- ============================================================================
363
+ CREATE TABLE idx_functional_only (
364
+ id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
365
+ full_name VARCHAR2(100),
366
+ description VARCHAR2(500)
367
+ );
368
+
369
+ CREATE INDEX idx_func_lower_name ON idx_functional_only (LOWER(full_name));
370
+ CREATE INDEX idx_func_substr ON idx_functional_only (SUBSTR(description, 1, 100));
371
+
372
+ -- ============================================================================
373
+ -- CASE 31: ADD REFS (SIMPLE) - via ALTER TABLE
374
+ -- ============================================================================
375
+ CREATE TABLE ref_simple_parent (
376
+ id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
377
+ name VARCHAR2(100)
378
+ );
379
+
380
+ CREATE TABLE ref_simple_child (
381
+ id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
382
+ parent_id NUMBER
383
+ );
384
+
385
+ ALTER TABLE ref_simple_child ADD CONSTRAINT fk_ref_simple
386
+ FOREIGN KEY (parent_id) REFERENCES ref_simple_parent(id);
387
+
388
+ -- ============================================================================
389
+ -- CASE 32: ADD REFS (COMPOSITE) - via ALTER TABLE
390
+ -- ============================================================================
391
+ CREATE TABLE ref_composite_parent (
392
+ key1 NUMBER NOT NULL,
393
+ key2 NUMBER NOT NULL,
394
+ data VARCHAR2(100),
395
+ CONSTRAINT pk_ref_comp_parent PRIMARY KEY (key1, key2)
396
+ );
397
+
398
+ CREATE TABLE ref_composite_child (
399
+ id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
400
+ fk1 NUMBER,
401
+ fk2 NUMBER
402
+ );
403
+
404
+ ALTER TABLE ref_composite_child ADD CONSTRAINT fk_ref_composite
405
+ FOREIGN KEY (fk1, fk2) REFERENCES ref_composite_parent(key1, key2);
406
+
407
+ -- ============================================================================
408
+ -- CASE 33: Various Oracle data types
409
+ -- ============================================================================
410
+ CREATE TABLE oracle_data_types (
411
+ id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
412
+ -- Character types
413
+ char_col CHAR(10),
414
+ varchar2_col VARCHAR2(100),
415
+ nchar_col NCHAR(10),
416
+ nvarchar2_col NVARCHAR2(100),
417
+ -- Number types
418
+ number_col NUMBER,
419
+ number_precision NUMBER(10),
420
+ number_scale NUMBER(10, 2),
421
+ binary_float_col BINARY_FLOAT,
422
+ binary_double_col BINARY_DOUBLE,
423
+ -- Date/Time types
424
+ date_col DATE,
425
+ timestamp_col TIMESTAMP,
426
+ timestamp_tz TIMESTAMP WITH TIME ZONE,
427
+ timestamp_ltz TIMESTAMP WITH LOCAL TIME ZONE,
428
+ interval_ym INTERVAL YEAR TO MONTH,
429
+ interval_ds INTERVAL DAY TO SECOND,
430
+ -- Large object types
431
+ clob_col CLOB,
432
+ nclob_col NCLOB,
433
+ blob_col BLOB,
434
+ -- Raw type
435
+ raw_col RAW(100),
436
+ -- ROWID
437
+ rowid_col ROWID
438
+ );
439
+
440
+ -- ============================================================================
441
+ -- CASE 34: Table with comments
442
+ -- ============================================================================
443
+ CREATE TABLE table_with_comments (
444
+ id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
445
+ name VARCHAR2(100) NOT NULL,
446
+ description VARCHAR2(500)
447
+ );
448
+
449
+ COMMENT ON TABLE table_with_comments IS 'This table''
450
+ stores items with descriptions';
451
+ COMMENT ON COLUMN table_with_comments.id IS 'Unique
452
+ identifier';
453
+ COMMENT ON COLUMN table_with_comments.name IS '!@#$%^&*()[]"Item name - required field';
454
+ COMMENT ON COLUMN table_with_comments.description IS 'Optional description of the item';
455
+
456
+ -- ============================================================================
457
+ -- CASE 35: Composite self-ref FK added via ALTER
458
+ -- ============================================================================
459
+ CREATE TABLE alter_comp_self_ref (
460
+ dept_id NUMBER NOT NULL,
461
+ emp_id NUMBER NOT NULL,
462
+ parent_dept_id NUMBER,
463
+ parent_emp_id NUMBER,
464
+ name VARCHAR2(100),
465
+ CONSTRAINT pk_alter_comp_self PRIMARY KEY (dept_id, emp_id)
466
+ );
467
+
468
+ ALTER TABLE alter_comp_self_ref ADD CONSTRAINT fk_alter_comp_self
469
+ FOREIGN KEY (parent_dept_id, parent_emp_id) REFERENCES alter_comp_self_ref(dept_id, emp_id);
470
+
471
+ -- ============================================================================
472
+ -- CASE 36: Special data types with precision
473
+ -- ============================================================================
474
+ CREATE TABLE special_data_types (
475
+ id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
476
+ -- Timestamp with various precisions
477
+ ts_default TIMESTAMP,
478
+ ts_0 TIMESTAMP(0),
479
+ ts_3 TIMESTAMP(3),
480
+ ts_6 TIMESTAMP(6),
481
+ ts_9 TIMESTAMP(9),
482
+ -- Timestamp with time zone with various precisions
483
+ ts_tz_default TIMESTAMP WITH TIME ZONE,
484
+ ts_tz_0 TIMESTAMP(0) WITH TIME ZONE,
485
+ ts_tz_3 TIMESTAMP(3) WITH TIME ZONE,
486
+ ts_tz_6 TIMESTAMP(6) WITH TIME ZONE,
487
+ ts_tz_9 TIMESTAMP(9) WITH TIME ZONE,
488
+ -- Timestamp with local time zone with various precisions
489
+ ts_ltz_default TIMESTAMP WITH LOCAL TIME ZONE,
490
+ ts_ltz_0 TIMESTAMP(0) WITH LOCAL TIME ZONE,
491
+ ts_ltz_3 TIMESTAMP(3) WITH LOCAL TIME ZONE,
492
+ ts_ltz_6 TIMESTAMP(6) WITH LOCAL TIME ZONE,
493
+ ts_ltz_9 TIMESTAMP(9) WITH LOCAL TIME ZONE,
494
+ -- Interval year to month with various precisions
495
+ iym_default INTERVAL YEAR TO MONTH,
496
+ iym_2 INTERVAL YEAR(2) TO MONTH,
497
+ iym_4 INTERVAL YEAR(4) TO MONTH,
498
+ iym_9 INTERVAL YEAR(9) TO MONTH,
499
+ -- Interval day to second with various precisions
500
+ ids_default INTERVAL DAY TO SECOND,
501
+ ids_day_4 INTERVAL DAY(4) TO SECOND,
502
+ ids_sec_3 INTERVAL DAY TO SECOND(3),
503
+ ids_both INTERVAL DAY(5) TO SECOND(4),
504
+ -- Float with various precisions
505
+ float_default FLOAT,
506
+ float_1 FLOAT(1),
507
+ float_63 FLOAT(63),
508
+ float_126 FLOAT(126),
509
+ -- Number with various precisions and scales
510
+ num_default NUMBER,
511
+ num_p NUMBER(5),
512
+ num_ps NUMBER(10, 2),
513
+ num_p_neg_s NUMBER(10, -2),
514
+ -- Character types with sizes
515
+ char_default CHAR,
516
+ char_sized CHAR(50),
517
+ varchar2_sized VARCHAR2(255),
518
+ nchar_default NCHAR,
519
+ nchar_sized NCHAR(50),
520
+ nvarchar2_sized NVARCHAR2(255),
521
+ -- Raw with size
522
+ raw_sized RAW(200),
523
+ -- UROWID with size
524
+ urowid_default UROWID,
525
+ urowid_sized UROWID(100)
526
+ );
527
+
528
+ EXIT;
529
+
@@ -0,0 +1 @@
1
+ ✔ Generated DBML file from database's connection: schema.dbml
@@ -1,7 +1,28 @@
1
- 2025-11-17T14:38:16.383Z
1
+ 2025-11-06T03:16:08.692Z
2
2
  Error: PostgreSQL connection error: AggregateError
3
- at getValidatedClient (/home/huydna/projects/dbml/packages/dbml-connector/dist/connectors/postgresConnector.js:21:19)
3
+ at getValidatedClient (/home/huydna/projects/dbml-release/packages/dbml-connector/dist/connectors/postgresConnector.js:20:19)
4
4
  at process.processTicksAndRejections (node:internal/process/task_queues:105:5)
5
- at async fetchSchemaJson (/home/huydna/projects/dbml/packages/dbml-connector/dist/connectors/postgresConnector.js:482:20)
6
- at async connectionHandler (/home/huydna/projects/dbml/packages/dbml-cli/lib/cli/connector.js:24:24)
5
+ at async fetchSchemaJson (/home/huydna/projects/dbml-release/packages/dbml-connector/dist/connectors/postgresConnector.js:481:20)
6
+ at async connectionHandler (/home/huydna/projects/dbml-release/packages/dbml-cli/lib/cli/connector.js:24:24)
7
+
8
+ 2025-11-18T08:13:12.163Z
9
+ Error: PostgreSQL connection error: AggregateError
10
+ at getValidatedClient (/home/huydna/projects/dbml-release/packages/dbml-connector/dist/connectors/postgresConnector.js:20:19)
11
+ at process.processTicksAndRejections (node:internal/process/task_queues:105:5)
12
+ at async fetchSchemaJson (/home/huydna/projects/dbml-release/packages/dbml-connector/dist/connectors/postgresConnector.js:485:20)
13
+ at async connectionHandler (/home/huydna/projects/dbml-release/packages/dbml-cli/lib/cli/connector.js:24:24)
14
+
15
+ 2025-11-18T09:04:37.202Z
16
+ Error: PostgreSQL connection error: AggregateError
17
+ at getValidatedClient (/home/huydna/projects/dbml-release/packages/dbml-connector/dist/connectors/postgresConnector.js:20:19)
18
+ at process.processTicksAndRejections (node:internal/process/task_queues:105:5)
19
+ at async fetchSchemaJson (/home/huydna/projects/dbml-release/packages/dbml-connector/dist/connectors/postgresConnector.js:485:20)
20
+ at async connectionHandler (/home/huydna/projects/dbml-release/packages/dbml-cli/lib/cli/connector.js:24:24)
21
+
22
+ 2025-11-27T14:15:15.990Z
23
+ Error: PostgreSQL connection error: AggregateError
24
+ at getValidatedClient (/home/huydna/projects/dbml-release/packages/dbml-connector/dist/connectors/postgres/index.js:20:19)
25
+ at process.processTicksAndRejections (node:internal/process/task_queues:105:5)
26
+ at async fetchSchemaJson (/home/huydna/projects/dbml-release/packages/dbml-connector/dist/connectors/postgres/index.js:487:20)
27
+ at async connectionHandler (/home/huydna/projects/dbml-release/packages/dbml-cli/lib/cli/connector.js:25:24)
7
28
 
@@ -1,6 +1,6 @@
1
1
  -- SQL dump generated using DBML (dbml.dbdiagram.io)
2
2
  -- Database: MySQL
3
- -- Generated at: 2025-11-17T14:37:29.432Z
3
+ -- Generated at: 2025-11-27T14:14:10.059Z
4
4
 
5
5
  CREATE TABLE `orders` (
6
6
  `id` int PRIMARY KEY AUTO_INCREMENT,
@@ -1,6 +1,6 @@
1
1
  -- SQL dump generated using DBML (dbml.dbdiagram.io)
2
2
  -- Database: Oracle
3
- -- Generated at: 2025-11-17T14:37:31.068Z
3
+ -- Generated at: 2025-11-27T14:14:12.048Z
4
4
 
5
5
  CREATE TABLE "orders" (
6
6
  "id" int GENERATED AS IDENTITY PRIMARY KEY,
@@ -1,6 +1,6 @@
1
1
  -- SQL dump generated using DBML (dbml.dbdiagram.io)
2
2
  -- Database: PostgreSQL
3
- -- Generated at: 2025-11-17T14:37:32.743Z
3
+ -- Generated at: 2025-11-27T14:14:13.971Z
4
4
 
5
5
  CREATE TYPE "orders_status" AS ENUM (
6
6
  'created',
@@ -1,6 +1,6 @@
1
1
  -- SQL dump generated using DBML (dbml.dbdiagram.io)
2
2
  -- Database: PostgreSQL
3
- -- Generated at: 2025-11-17T14:37:33.593Z
3
+ -- Generated at: 2025-11-27T14:14:14.971Z
4
4
 
5
5
  CREATE TYPE "orders_status" AS ENUM (
6
6
  'created',
@@ -1,6 +1,6 @@
1
1
  -- SQL dump generated using DBML (dbml.dbdiagram.io)
2
2
  -- Database: MySQL
3
- -- Generated at: 2025-11-17T14:37:36.085Z
3
+ -- Generated at: 2025-11-27T14:14:18.029Z
4
4
 
5
5
  CREATE TABLE `staff` (
6
6
  `id` int PRIMARY KEY,
@@ -1,6 +1,6 @@
1
1
  -- SQL dump generated using DBML (dbml.dbdiagram.io)
2
2
  -- Database: Oracle
3
- -- Generated at: 2025-11-17T14:37:37.805Z
3
+ -- Generated at: 2025-11-27T14:14:20.062Z
4
4
 
5
5
  CREATE TABLE "staff" (
6
6
  "id" int PRIMARY KEY,
@@ -1,6 +1,6 @@
1
1
  -- SQL dump generated using DBML (dbml.dbdiagram.io)
2
2
  -- Database: PostgreSQL
3
- -- Generated at: 2025-11-17T14:37:39.489Z
3
+ -- Generated at: 2025-11-27T14:14:22.104Z
4
4
 
5
5
  CREATE TABLE "staff" (
6
6
  "id" int PRIMARY KEY,
@@ -1,6 +1,6 @@
1
1
  -- SQL dump generated using DBML (dbml.dbdiagram.io)
2
2
  -- Database: PostgreSQL
3
- -- Generated at: 2025-11-17T14:37:40.334Z
3
+ -- Generated at: 2025-11-27T14:14:23.109Z
4
4
 
5
5
  CREATE TABLE "staff" (
6
6
  "id" int PRIMARY KEY,
@@ -1,6 +1,6 @@
1
1
  -- SQL dump generated using DBML (dbml.dbdiagram.io)
2
2
  -- Database: SQL Server
3
- -- Generated at: 2025-11-17T14:37:42.778Z
3
+ -- Generated at: 2025-11-27T14:14:26.196Z
4
4
 
5
5
  CREATE SCHEMA [schemaB]
6
6
  GO
@@ -1,6 +1,6 @@
1
1
  -- SQL dump generated using DBML (dbml.dbdiagram.io)
2
2
  -- Database: MySQL
3
- -- Generated at: 2025-11-17T14:37:43.600Z
3
+ -- Generated at: 2025-11-27T14:14:27.171Z
4
4
 
5
5
  CREATE SCHEMA `schemaB`;
6
6
 
@@ -1,6 +1,6 @@
1
1
  -- SQL dump generated using DBML (dbml.dbdiagram.io)
2
2
  -- Database: Oracle
3
- -- Generated at: 2025-11-17T14:37:44.428Z
3
+ -- Generated at: 2025-11-27T14:14:28.173Z
4
4
 
5
5
  CREATE USER "C##test01"
6
6
  NO AUTHENTICATION
@@ -1,6 +1,6 @@
1
1
  -- SQL dump generated using DBML (dbml.dbdiagram.io)
2
2
  -- Database: PostgreSQL
3
- -- Generated at: 2025-11-17T14:37:45.207Z
3
+ -- Generated at: 2025-11-27T14:14:29.142Z
4
4
 
5
5
  CREATE SCHEMA "schemaB";
6
6