docs: ADR-0035 — record two /runda refinements (IF [NOT] EXISTS, INTEGER PRIMARY KEY)
Pre-implementation /runda round settled two open micro-calls before 4a, both user-confirmed: - IF [NOT] EXISTS admitted (no-op-that-succeeds-with-a-note), not refused — a near-universal cross-vendor idiom (PostgreSQL, MySQL, SQLite, Oracle 23ai), reclassified into scope rather than treated as an engine-specific spelling. Touches §3/§4/§12/§13 (4a, 4c). - INTEGER PRIMARY KEY maps to a plain int PK, not auto-increment; serial stays the sole auto-increment type (§3). README index updated in the same edit per the lockstep rule.
This commit is contained in:
@@ -8,6 +8,16 @@ roadmap (the advanced-mode SQL surface), the peer of ADR-0031
|
|||||||
(expression grammar), ADR-0032 (`SELECT`), and ADR-0033 (DML). It
|
(expression grammar), ADR-0032 (`SELECT`), and ADR-0033 (DML). It
|
||||||
**clarifies ADR-0030 §4** on how DDL is represented and executed.
|
**clarifies ADR-0030 §4** on how DDL is represented and executed.
|
||||||
|
|
||||||
|
**Refinements (2026-05-24, pre-implementation `/runda` round,
|
||||||
|
user-confirmed).** Two open micro-calls were settled before 4a:
|
||||||
|
(1) `IF [NOT] EXISTS` is **admitted** as a no-op-that-succeeds-with-a-note
|
||||||
|
rather than refused — it is a near-universal cross-vendor idiom
|
||||||
|
(PostgreSQL, MySQL/MariaDB, SQLite, Oracle 23ai), not an
|
||||||
|
engine-specific spelling, so it belongs in the standard surface
|
||||||
|
(§3/§4/§12/§13); (2) `INTEGER PRIMARY KEY` maps to a **plain `int`**
|
||||||
|
primary key, *not* auto-increment — `serial` remains the sole
|
||||||
|
auto-increment type (§3).
|
||||||
|
|
||||||
## Context
|
## Context
|
||||||
|
|
||||||
ADR-0030 fixed the *architecture* of advanced mode — SQL authored as
|
ADR-0030 fixed the *architecture* of advanced mode — SQL authored as
|
||||||
@@ -109,6 +119,13 @@ length/precision argument (`varchar(255)`, `numeric(10,2)`) is
|
|||||||
unparameterised. Engine storage-type names are neither accepted as
|
unparameterised. Engine storage-type names are neither accepted as
|
||||||
input nor shown (§9).
|
input nor shown (§9).
|
||||||
|
|
||||||
|
The map is purely **lexical**: `INTEGER PRIMARY KEY` becomes a plain
|
||||||
|
`int` primary key — it is **not** treated as auto-increment, unlike
|
||||||
|
the engine's rowid-alias idiom. Auto-increment is reached only through
|
||||||
|
the explicit `serial` type (`id serial primary key`). This keeps the
|
||||||
|
engine's storage behaviour from leaking into the standard surface and
|
||||||
|
matches ADR-0005's single-auto-increment-type model.
|
||||||
|
|
||||||
### 4. The DDL surface (full; `Q4`, no pre-emptive cuts)
|
### 4. The DDL surface (full; `Q4`, no pre-emptive cuts)
|
||||||
|
|
||||||
**`CREATE TABLE <name> ( <element>, … )`**
|
**`CREATE TABLE <name> ( <element>, … )`**
|
||||||
@@ -123,9 +140,18 @@ input nor shown (§9).
|
|||||||
[ON DELETE …] [ON UPDATE …]` (§5).
|
[ON DELETE …] [ON UPDATE …]` (§5).
|
||||||
- `CHECK` and `DEFAULT` expressions reuse the ADR-0031 `sql_expr`
|
- `CHECK` and `DEFAULT` expressions reuse the ADR-0031 `sql_expr`
|
||||||
grammar (the same fragment `WHERE`/`HAVING`/projections use).
|
grammar (the same fragment `WHERE`/`HAVING`/projections use).
|
||||||
|
- `CREATE TABLE IF NOT EXISTS <name> …` is admitted: when the table
|
||||||
|
already exists the statement is a **no-op that succeeds with a note**
|
||||||
|
("table already exists — skipped") instead of the plain-form
|
||||||
|
"table already exists" error. `IF NOT EXISTS` is a near-universal
|
||||||
|
cross-vendor idiom, not an engine-specific spelling, so it is part of
|
||||||
|
the standard surface (refines §12).
|
||||||
|
|
||||||
**`DROP TABLE <name>`** → `SqlDropTable`. Cascade of inbound
|
**`DROP TABLE [IF EXISTS] <name>`** → `SqlDropTable`. Cascade of inbound
|
||||||
relationships follows the existing `drop table` semantics.
|
relationships follows the existing `drop table` semantics. `IF EXISTS`
|
||||||
|
is admitted (universal across the major engines): dropping an absent
|
||||||
|
table is then a **no-op that succeeds with a note** instead of the
|
||||||
|
plain-form "no such table" error.
|
||||||
|
|
||||||
**`ALTER TABLE <name> <action>`** → `SqlAlterTable`, where `<action>`
|
**`ALTER TABLE <name> <action>`** → `SqlAlterTable`, where `<action>`
|
||||||
covers, mapping to the existing low-level operations:
|
covers, mapping to the existing low-level operations:
|
||||||
@@ -267,9 +293,10 @@ note). The integration is structural, not free of authoring.
|
|||||||
- The **DSL → SQL teaching echo** (ADR-0030 §10) is Phase 5, a
|
- The **DSL → SQL teaching echo** (ADR-0030 §10) is Phase 5, a
|
||||||
separate ADR — not this one.
|
separate ADR — not this one.
|
||||||
- Engine-specific DDL spellings (`AUTOINCREMENT`, `WITHOUT ROWID`,
|
- Engine-specific DDL spellings (`AUTOINCREMENT`, `WITHOUT ROWID`,
|
||||||
collations, `IF [NOT] EXISTS` if judged out-of-subset) — the
|
collations) — the grammar admits the standard surface; extras are
|
||||||
grammar admits the standard surface; extras are ordinary parse
|
ordinary parse errors. (`IF [NOT] EXISTS` was **reclassified into
|
||||||
errors.
|
scope** — see §4 — as a near-universal cross-vendor idiom rather
|
||||||
|
than an engine-specific spelling.)
|
||||||
|
|
||||||
### 13. Phased implementation plan
|
### 13. Phased implementation plan
|
||||||
|
|
||||||
@@ -279,10 +306,12 @@ ADR-0033's structure:
|
|||||||
|
|
||||||
- **4a — Dispatch + `CREATE TABLE` core.** Advanced `create`
|
- **4a — Dispatch + `CREATE TABLE` core.** Advanced `create`
|
||||||
dispatch; `SqlCreateTable` for columns + types (the §3 map) +
|
dispatch; `SqlCreateTable` for columns + types (the §3 map) +
|
||||||
column constraints + single/compound `PRIMARY KEY`. No FK yet.
|
column constraints + single/compound `PRIMARY KEY`, plus
|
||||||
|
`IF NOT EXISTS` (no-op-with-note, §4). No FK yet.
|
||||||
- **4b — Foreign keys in `CREATE TABLE`.** Inline `REFERENCES` +
|
- **4b — Foreign keys in `CREATE TABLE`.** Inline `REFERENCES` +
|
||||||
table-level `FOREIGN KEY` → relationship metadata, one undo step.
|
table-level `FOREIGN KEY` → relationship metadata, one undo step.
|
||||||
- **4c — `DROP TABLE`** → `SqlDropTable` (cascade parity).
|
- **4c — `DROP TABLE [IF EXISTS]`** → `SqlDropTable` (cascade parity;
|
||||||
|
`IF EXISTS` no-op-with-note, §4).
|
||||||
- **4d — `CREATE [UNIQUE] INDEX` / `DROP INDEX`** → `SqlCreateIndex`
|
- **4d — `CREATE [UNIQUE] INDEX` / `DROP INDEX`** → `SqlCreateIndex`
|
||||||
/ `SqlDropIndex` (ADR-0025; the `UNIQUE` flag extension if needed).
|
/ `SqlDropIndex` (ADR-0025; the `UNIQUE` flag extension if needed).
|
||||||
- **4e — `ALTER TABLE` add/drop/rename column.**
|
- **4e — `ALTER TABLE` add/drop/rename column.**
|
||||||
|
|||||||
+1
-1
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user