From db295c143901bf91572e56d3077167c40c0aca33 Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Wed, 5 Aug 2026 07:21:25 -0400 Subject: [PATCH] docs(sql): verification green across five suites; tracker + design status reconciled (Postgres/Oracle shipped) --- .../2026-07-24-driver-expansion-tracking.md | 9 +++++---- .../2026-08-05-sql-postgres-oracle-design.md | 9 ++++++++- .../2026-08-05-sql-postgres-oracle.md.tasks.json | 16 ++++++++-------- 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/docs/plans/2026-07-24-driver-expansion-tracking.md b/docs/plans/2026-07-24-driver-expansion-tracking.md index f9df628f..5bd32fe7 100644 --- a/docs/plans/2026-07-24-driver-expansion-tracking.md +++ b/docs/plans/2026-07-24-driver-expansion-tracking.md @@ -154,12 +154,12 @@ SQL poll reuses the always-on central SQL Server. **Both shipped.** ### SQL poll — ✅ Done (merged `4ad54037`, live gate PASSED) - **Design:** [`2026-07-15-sql-poll-driver-design.md`](2026-07-15-sql-poll-driver-design.md) -- **Implementation plan:** [`2026-07-24-sql-poll-driver.md`](2026-07-24-sql-poll-driver.md) · [`.tasks.json`](2026-07-24-sql-poll-driver.md.tasks.json) — **22 tasks, all done**. `ISqlDialect` + `SqlServerDialect` shipped; Postgres/ODBC remain deferred to P2/P3 behind the same seam. +- **Implementation plan:** [`2026-07-24-sql-poll-driver.md`](2026-07-24-sql-poll-driver.md) · [`.tasks.json`](2026-07-24-sql-poll-driver.md.tasks.json) — **22 tasks, all done**. `ISqlDialect` + `SqlServerDialect` shipped. ~~Postgres/ODBC remain deferred to P2/P3 behind the same seam.~~ **Postgres + Oracle shipped 2026-08-05** via managed providers (Npgsql 10.0.3, ODP.NET Core 23.26.300) — dialect-owned parameter markers/bind names + Oracle `BindByName`, `INFORMATION_SCHEMA` vs `ALL_*` catalog SQL, provider gates widened, AdminUI dropdown, env-gated docker suites (postgres:17-alpine / gvenzl/oracle-free:23-slim). The live suites found + fixed ORA-01745 (Oracle rejects reserved-word bind names — `:table` — so the first Oracle build was structurally broken until binds were `p_`-prefixed). MySql/Odbc stay reserved. See [`2026-08-05-sql-postgres-oracle-design.md`](2026-08-05-sql-postgres-oracle-design.md). - **Post-merge follow-ups closed** in `28c28667`: #496 catalog identifier-validation gate (`4dc2ad80`), #497 wrong status-code constants across six drivers, #498 deploy-gate rejection of a persisted `connectionString` (`1919a8e5`). -- **Scope:** a bespoke schema-browser driver polling a SQL table into equipment tags (SQL Server - shipped; Postgres/ODBC deferred behind `ISqlDialect`). +- **Scope:** a bespoke schema-browser driver polling a SQL table into equipment tags (SQL Server, + **PostgreSQL and Oracle** shipped behind `ISqlDialect`; MySql/Odbc reserved). - **Fixture:** SQLite unit fixture (primary) + an **env-gated integration fixture against the existing central SQL Server** (`10.100.0.35,14330`) with a seeded `SqlPollFixture` DB. The blackhole/timeout live-gate pauses a **dedicated** `mssql` container — **never** the shared @@ -283,7 +283,8 @@ Both CI-simulatable on the shared docker host, no hardware. pass-through) CLOSED 2026-08-05 — see the Wave 0 section above. 2. **Wave 1 is done.** Both deliverables shipped and live-gated: **Modbus RTU-over-TCP** (merged `0f38f486` / #495) and **SQL poll** (merged `4ad54037`; follow-ups #496/#497/#498 closed in - `28c28667`). Remaining SQL work is optional follow-on — Postgres/ODBC dialects behind + `28c28667`). **Postgres + Oracle dialects shipped 2026-08-05** (managed providers, see the SQL + poll section above); remaining SQL work is optional follow-on — MySql/Odbc dialects behind `ISqlDialect`, and `SqlTagModel.Query` (P3, currently rejected end-to-end by design). 3. **Wave 2 is done.** Both deliverables shipped and live-gated: **MQTT / Sparkplug B** (P1 + P2) and **MTConnect Agent** (P1 Agent MVP, PR #506). Remaining work on both is optional follow-on — MQTT P3 write-through (`IWritable`: NCMD/DCMD + plain publish) plus its two browse-UI gaps, and MTConnect write-back (deliberately deferred; the Agent surface is read-only). diff --git a/docs/plans/2026-08-05-sql-postgres-oracle-design.md b/docs/plans/2026-08-05-sql-postgres-oracle-design.md index cd6e25ee..608cba4c 100644 --- a/docs/plans/2026-08-05-sql-postgres-oracle-design.md +++ b/docs/plans/2026-08-05-sql-postgres-oracle-design.md @@ -1,6 +1,13 @@ # Sql driver: Postgres + Oracle providers (managed drivers only) — design -**Status:** DRAFT 2026-08-05. +**Status:** DONE 2026-08-05 — all eight tasks delivered and reviewed. Suites: Driver.Sql.Tests +355/355, Browser.Tests 75/75, IntegrationTests 33 skip-clean offline; **both new integration suites +also ran LIVE during development** against real local containers (postgres:17-alpine 5/5, +gvenzl/oracle-free:23-slim 6/6), which surfaced and fixed a provider-fatal defect no offline test +could see: **ORA-01745** — Oracle rejects a bind variable named after a reserved word (`:table`), +so every Oracle catalog load failed until OracleDialect namespaced all binds with a `p_` prefix +(`ec90b7c4`, pinned by a never-bare-base-name invariant theory). §4.3's chrome/AdminUI gate remains +with the operator; the shared-host fixture deploy + live run is recorded below when complete. ## 1. Problem diff --git a/docs/plans/2026-08-05-sql-postgres-oracle.md.tasks.json b/docs/plans/2026-08-05-sql-postgres-oracle.md.tasks.json index c11b5396..de102425 100644 --- a/docs/plans/2026-08-05-sql-postgres-oracle.md.tasks.json +++ b/docs/plans/2026-08-05-sql-postgres-oracle.md.tasks.json @@ -1,14 +1,14 @@ { "planPath": "docs/plans/2026-08-05-sql-postgres-oracle.md", "tasks": [ - { "id": 0, "subject": "Task 0: Package pins", "status": "pending" }, - { "id": 1, "subject": "Task 1: Dialect-owned parameter naming + ConfigureCommand", "status": "pending" }, - { "id": 2, "subject": "Task 2: PostgresDialect", "status": "pending", "blockedBy": [0, 1] }, - { "id": 3, "subject": "Task 3: OracleDialect", "status": "pending", "blockedBy": [0, 1] }, - { "id": 4, "subject": "Task 4: Widen the provider gates", "status": "pending", "blockedBy": [2, 3] }, - { "id": 5, "subject": "Task 5: AdminUI dropdown + docs", "status": "pending" }, - { "id": 6, "subject": "Task 6: Integration fixtures + env-gated suites", "status": "pending", "blockedBy": [4] }, - { "id": 7, "subject": "Task 7: Full-suite verification + bookkeeping", "status": "pending", "blockedBy": [5, 6] }, + { "id": 0, "subject": "Task 0: Package pins", "status": "completed" }, + { "id": 1, "subject": "Task 1: Dialect-owned parameter naming + ConfigureCommand", "status": "completed" }, + { "id": 2, "subject": "Task 2: PostgresDialect", "status": "completed", "blockedBy": [0, 1] }, + { "id": 3, "subject": "Task 3: OracleDialect", "status": "completed", "blockedBy": [0, 1] }, + { "id": 4, "subject": "Task 4: Widen the provider gates", "status": "completed", "blockedBy": [2, 3] }, + { "id": 5, "subject": "Task 5: AdminUI dropdown + docs", "status": "completed" }, + { "id": 6, "subject": "Task 6: Integration fixtures + env-gated suites", "status": "completed", "blockedBy": [4], "note": "found+fixed ORA-01745 (ec90b7c4); both suites ran live locally (pg 5/5, oracle 6/6)" }, + { "id": 7, "subject": "Task 7: Full-suite verification + bookkeeping", "status": "completed", "blockedBy": [5, 6] }, { "id": 8, "subject": "Task 8: Fixture deploy + live integration run (main session); chrome gate deferred to operator", "status": "pending", "blockedBy": [7] } ], "lastUpdated": "2026-08-05T00:00:00Z"