Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
390 commits
Select commit Hold shift + click to select a range
96a578d
feat: SQLProcedureColumns, SQLColumnPrivileges and SQLTablePrivileges…
maltesander Jul 28, 2026
7e6bf5e
feat: METADATA_ID and the driver-side HY009 for the last four catalog…
maltesander Jul 28, 2026
21b13d1
docs: the catalog contract is ten methods, not six
maltesander Jul 28, 2026
ba65e0b
docs: name the one behaviour change in the catalog migration list
maltesander Jul 28, 2026
bce171b
fix: log the parsed arguments in the four catalog functions that did not
maltesander Jul 28, 2026
87bdb18
docs: a string argument counts as parsed input for the logging rule
maltesander Jul 28, 2026
b02cfee
feat: add the HY008 vocabulary and the one place that applies it
maltesander Jul 28, 2026
200793d
fix!: mint a cancel token per execution, not per statement
maltesander Jul 28, 2026
9c8a94f
test: a mock that cancels itself mid-call, for the HY008 entry-point …
maltesander Jul 28, 2026
9b7fc1e
feat: report HY008 from the execution entry points
maltesander Jul 28, 2026
60e3e6e
feat: report HY008 from the ten catalog functions
maltesander Jul 28, 2026
e715c4d
feat: report HY008 from SQLFetch, SQLFetchScroll and SQLGetData
maltesander Jul 28, 2026
3711a3f
test: prove the cross-thread cancel path end to end
maltesander Jul 28, 2026
ef07d52
docs: state the real HY008 contract on all 32 entry points
maltesander Jul 28, 2026
4fb165b
test: model a cancel racing the execution that replaces its token
maltesander Jul 28, 2026
b09848b
fix: honour the declared SQL type and reject phantom parameters
maltesander Jul 28, 2026
f469b50
fix: enforce a DECIMAL parameter's declared precision and scale
maltesander Jul 28, 2026
28cc186
fix: inherit SQL_ATTR_METADATA_ID from the connection at statement al…
maltesander Jul 29, 2026
5592abf
fix: answer every SQLSetStmtAttr value core cannot honour, and read t…
maltesander Jul 29, 2026
32233a2
fix: enforce SQLSetConnectAttr's driver-side state and support rules
maltesander Jul 29, 2026
38b51fe
fix: report the processed parameter set after every execution
maltesander Jul 29, 2026
5a0400f
test: police common_get_info_raw the way default_get_info is policed
maltesander Jul 29, 2026
f359852
feat!: make the catalog row types non_exhaustive, with generated setters
maltesander Jul 29, 2026
368b1fd
feat!: ten required Backend methods for the claims core was making it…
maltesander Jul 29, 2026
b2f79b7
fix: derive SQL_DATABASE_NAME and correct SQL_CURSOR_SENSITIVITY
maltesander Jul 29, 2026
ea555cd
feat: check the SQLGetInfo groups whose members constrain each other
maltesander Jul 29, 2026
290e12f
test: skip the raw-path classification scan under Miri
maltesander Jul 29, 2026
0c38e91
fix: write statement attributes at full SQLULEN width
maltesander Jul 29, 2026
dca26fa
feat: make SQL_ATTR_CURRENT_CATALOG readable and applied, and export …
maltesander Jul 29, 2026
a38ba47
docs: correct Backend::cancel_token's token-lifetime contract
maltesander Jul 29, 2026
4631f16
feat: let a data source enforce SQL_ATTR_QUERY_TIMEOUT
maltesander Jul 29, 2026
8e766e7
feat: enforce SQL_ATTR_QUERY_TIMEOUT in core when the backend delegates
maltesander Jul 29, 2026
a9c3f20
feat: back SQL_ATTR_CONNECTION_DEAD with Backend::connection_dead
maltesander Jul 29, 2026
6e9cd50
fix: return 24000 when SQL_ATTR_CURRENT_CATALOG is set with a result …
maltesander Jul 29, 2026
34e7a8b
fix: return HY011 when SQL_ATTR_TXN_ISOLATION is set with a transacti…
maltesander Jul 29, 2026
dc2f178
feat: carry SQL_ATTR_ACCESS_MODE to the data source
maltesander Jul 29, 2026
19641c3
feat: give Backend::connect the login and connection timeouts
maltesander Jul 29, 2026
77f918a
feat: let the data source apply SQL_ATTR_MAX_ROWS and SQL_ATTR_MAX_LE…
maltesander Jul 29, 2026
b8c56bf
fix: arm the query timer at SQLFetch, not only at execute
maltesander Jul 29, 2026
f696509
fix: two wrong answers to the application (F1, F2)
maltesander Jul 29, 2026
9961605
fix: name 3D000 and correct what the docs claimed about it (F3)
maltesander Jul 29, 2026
cac424e
perf: one registry lookup per FFI call, not two (F5)
maltesander Jul 29, 2026
3505c79
fix: make the loom models build, and make one of them prove something…
maltesander Jul 29, 2026
9f37621
chore: pin the package job, guard the lock sites, add issue/PR templates
maltesander Jul 29, 2026
507b53c
fix: enforce a character parameter's declared ColumnSize
maltesander Jul 29, 2026
3ecb88a
fix: enforce a binary parameter's declared ColumnSize
maltesander Jul 29, 2026
7f0e189
fix: enforce a SQL_C_BINARY parameter's declared ColumnSize
maltesander Jul 29, 2026
85014cf
docs: record what the declared-size checks cover, and what they do not
maltesander Jul 29, 2026
21e6167
chore: stop markdownlint failing on the PR template
maltesander Jul 29, 2026
36cfab3
feat: convert SQL_C_BINARY parameters to their declared SQL type
maltesander Jul 29, 2026
48556ea
docs: point at the binary table and retire the deferral note
maltesander Jul 29, 2026
e760196
fix: SQL_DATE (9) is a date, not a timestamp
maltesander Jul 29, 2026
e705f1a
fix: the descriptor stubs post a diagnostic instead of a silent error
maltesander Jul 29, 2026
725a31b
fix: stop reporting the descriptor functions as supported
maltesander Jul 29, 2026
16a09bb
fix: stop silently accepting a descriptor swap SQLSetStmtAttr cannot …
maltesander Jul 29, 2026
8c41025
refactor: a bound column is a record in the ARD
maltesander Jul 29, 2026
7d01127
refactor: a bound parameter is an APD record and an IPD record
maltesander Jul 29, 2026
46243ef
refactor: the header-field attributes live on the descriptor that own…
maltesander Jul 29, 2026
795c4dc
docs: record the descriptor model, and what D3 and D4 still owe
maltesander Jul 29, 2026
cb6a3c2
refactor: one descriptor record type, and a role on the descriptor
maltesander Jul 29, 2026
1e82773
fix: a binding is a non-null data pointer, not a present key
maltesander Jul 29, 2026
2e4abdf
feat: the per-role descriptor field tables
maltesander Jul 29, 2026
8d9966e
feat: the HY021 consistency check, at all four sites
maltesander Jul 29, 2026
2514176
refactor: one accessor resolves a descriptor to its statement and role
maltesander Jul 29, 2026
6ef5b95
feat: SQLGetDescFieldW reads the descriptor fields
maltesander Jul 29, 2026
c783ae3
fix: SQL_DESC_DATETIME_INTERVAL_CODE is the subcode, not the concise …
maltesander Jul 29, 2026
13b5de6
feat: SQLSetDescFieldW writes the descriptor fields
maltesander Jul 29, 2026
1467009
feat: SQLGetDescRecW reads a record in one call
maltesander Jul 29, 2026
2a1792c
feat: SQLSetDescRec sets a record in one call
maltesander Jul 29, 2026
d5c7bc0
feat: report the four descriptor functions as supported
maltesander Jul 29, 2026
d381cac
docs: record the descriptor field model, and what D4 still owes
maltesander Jul 29, 2026
08e38d6
refactor: key descriptor header fields by field, not by attribute
maltesander Jul 30, 2026
f9e59a5
refactor: reach descriptors through HandleScope::desc_of
maltesander Jul 30, 2026
a291afa
refactor: descriptors become standalone registered allocations
maltesander Jul 30, 2026
43d5c19
feat: allocate and free explicit descriptor handles
maltesander Jul 30, 2026
c6df2fe
feat: associate an explicit descriptor with a statement
maltesander Jul 30, 2026
49d768f
feat: SQLCopyDesc copies a descriptor in two phases
maltesander Jul 30, 2026
2e7f3e6
docs: record explicit descriptor support, and drop dead plan references
maltesander Jul 30, 2026
b62a943
fix: the group-lock audit was line-ending dependent, and failed on Wi…
maltesander Jul 30, 2026
b27c0af
build: check every text file out with LF on every platform
maltesander Jul 30, 2026
995beb9
feat: a driver can prompt the user, and SQL_DRIVER_NOPROMPT is honoured
maltesander Jul 30, 2026
013fc42
refactor: ConnectParams::prompter hands back an owned Arc
maltesander Jul 30, 2026
f234606
fix: SQL_C_TINYINT is accepted like the other 2.x integer spellings
maltesander Jul 30, 2026
bbe6473
fix: a parameter bound to NULL is no longer reported as unbound
maltesander Jul 30, 2026
a3c8616
refactor: the character table shares its size checks with both siblings
maltesander Jul 30, 2026
a471b42
feat: SqlState gains interval field overflow
maltesander Jul 30, 2026
b59dfe0
feat: name the thirteen concise interval SQL types
maltesander Jul 30, 2026
d88f230
feat: interval_from_raw joins the conversion family
maltesander Jul 30, 2026
8b699ba
feat: the numeric table's character rows
maltesander Jul 30, 2026
6f1b2aa
feat: the numeric table's exact numeric row, with its optional warning
maltesander Jul 30, 2026
c228403
feat: the numeric table's approximate and bit rows
maltesander Jul 30, 2026
75e0f3b
feat: the numeric table's interval row, and its bind-time refusals
maltesander Jul 30, 2026
66edc55
refactor: a parameter read can carry a warning alongside its value
maltesander Jul 30, 2026
98535a9
feat: numeric parameters are converted to their declared SQL type
maltesander Jul 30, 2026
fde91d3
feat: a truncated numeric parameter reports 01S07
maltesander Jul 30, 2026
caada87
feat: the consistency check validates an interval leading precision
maltesander Jul 30, 2026
8234eab
docs: record the numeric conversion table and interval support
maltesander Jul 30, 2026
9b13353
fix: the new parameter-warning tests free their connections
maltesander Jul 30, 2026
081f382
feat: SQLExtendedFetch fetches rows instead of failing blankly
maltesander Jul 30, 2026
3ec9224
feat: SQLSetScrollOptions is left to the Driver Manager
maltesander Jul 30, 2026
bcc5e44
feat: SQL_ROWSET_SIZE other than 1 reports 01S02
maltesander Jul 30, 2026
be56559
docs: stop counting the FFI entry points
maltesander Jul 30, 2026
af3a2d1
test: resolve_error's assertion holds in a release test build
maltesander Jul 30, 2026
0a67689
feat!: the deprecated ODBC 2.x functions are no longer exported
maltesander Jul 30, 2026
72abccc
feat!: SQLSetCursorName enforces the spec's cursor-name rules
maltesander Jul 30, 2026
e501845
docs: record the SQLSetCursorName changes in the changelog
maltesander Jul 30, 2026
2412293
fix: ConfigDSNW says why it failed, and cannot unwind into the caller
maltesander Jul 30, 2026
2b89240
docs: a 3.x driver does not export the deprecated 2.x functions
maltesander Jul 30, 2026
29ebcfb
fix: SQLGetDescRecW no longer fails HY091 on an ARD or APD
maltesander Jul 30, 2026
830c096
fix: SQLCopyDesc copies the header fields an IRD or IPD keeps on its …
maltesander Jul 30, 2026
fa03ba2
fix: 07009 for record 0 on an IPD and a negative record number
maltesander Jul 30, 2026
9e5f808
feat!: SQLSetDescFieldW enforces SQL_MAX_IDENTIFIER_LEN on SQL_DESC_NAME
maltesander Jul 30, 2026
40fc89f
docs: say why SQL_DESC_PARAMETER_TYPE is validated despite HY105 bein…
maltesander Jul 30, 2026
b850f1d
fix: SQLPutData resolves SQL_NTS in the bound C type
maltesander Jul 30, 2026
7f46762
docs: cite the two drivers that resolve SQL_NTS in the bound C type
maltesander Jul 30, 2026
33f6d18
fix: SQLBindCol keeps the indicator-only binding the spec permits
maltesander Jul 30, 2026
e05c06e
feat: name 25S03, the SQLSTATE that keeps a connection out of suspend…
maltesander Jul 30, 2026
4264fc2
fix: SQLPutData reports HY020 for a concatenated null
maltesander Jul 30, 2026
8ea0873
fix: SQLParamData twice in a row is HY010, not a silent NULL
maltesander Jul 30, 2026
97c2a19
fix: SQLPutData recognises SQL_DEFAULT_PARAM instead of calling it ma…
maltesander Jul 30, 2026
b3a92ce
fix: SQLPutData's HY009 guard matches the clause it stands in for
maltesander Jul 30, 2026
e1c760a
fix: withdrawing SQL_ATTR_QUERY_TIMEOUT disarms core's timer
maltesander Jul 30, 2026
5e75393
fix: resetting a data-source limit reaches the data source
maltesander Jul 30, 2026
a49efcd
fix: SQL_ATTR_ROW_NUMBER is not echoed back from the application
maltesander Jul 30, 2026
838d15a
docs: SQLGetStmtAttr writes an SQLULEN, and HYC00 covers both sensiti…
maltesander Jul 30, 2026
f09bc8f
fix: SQLConnectW hands the backend the DSN name it connected with
maltesander Jul 30, 2026
ed69bd5
fix: SQLSetCursorName accepts the prepared state the spec permits
maltesander Jul 30, 2026
a29802f
fix: SQLMoreResults discards the result set it reports away
maltesander Jul 30, 2026
df5316c
fix: SQLGetTypeInfo refuses a second call while a cursor is open
maltesander Jul 30, 2026
1ba93ed
feat: a zero-row searched DML reports SQL_NO_DATA
maltesander Jul 30, 2026
321b214
fix: SQLExecute refuses to re-execute over an open cursor
maltesander Jul 30, 2026
126aa72
fix: SQLFetchScroll logs its own return value
maltesander Jul 30, 2026
fbab789
docs: record why cursor-name uniqueness is compared byte-exactly
maltesander Jul 30, 2026
a5cc0a8
fix: SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2 claims the concurrency it ac…
maltesander Jul 30, 2026
fff996c
fix: SQLDisconnect cancels an in-progress browse instead of 08003
maltesander Jul 30, 2026
e8a328f
feat: SQL_OV_ODBC2 is a legal ODBC version, not an HY024
maltesander Jul 30, 2026
dbec0bb
fix: SQLGetConnectAttr distinguishes HYC00 from HY092
maltesander Jul 30, 2026
ee96909
fix: a generous buffer is not an HY000 from SQLGetConnectAttr
maltesander Jul 30, 2026
993bff9
fix: a null SQL_ATTR_CURRENT_CATALOG is HY009, not a silent clear
maltesander Jul 30, 2026
697ec42
docs: SQLSetEnvAttr's HY010 is (DM) on both clauses
maltesander Jul 30, 2026
ea9c8f1
fix: an ordinary connect ends an abandoned browse sequence
maltesander Jul 30, 2026
5999cc4
docs: SQLDriverConnectW logs the parameters it parsed
maltesander Jul 30, 2026
41b1f35
fix: SQLNativeSql reports 01004 for a zero-length output buffer
maltesander Jul 30, 2026
5af3ab7
fix: a closing brace in a value cannot inject keywords
maltesander Jul 30, 2026
3ad8fc6
fix: ConfigDSNW never writes a DRIVER attribute into a DSN section
maltesander Jul 30, 2026
b4f3576
fix: a failed installer write makes ConfigDSNW return FALSE
maltesander Jul 30, 2026
6c8d5c4
fix: ODBC_CONFIG_DSN modifies a data source rather than recreating it
maltesander Jul 30, 2026
91cb53f
feat: SQLGetDiagField answers the statement-only header fields
maltesander Jul 30, 2026
1a8df01
fix: only character diagnostic fields reject a negative BufferLength
maltesander Jul 30, 2026
be5cb4a
fix: ConfigDSNW validates fRequest before anything else
maltesander Jul 30, 2026
6a2c1c5
feat!: a malformed attribute list fails ConfigDSNW
maltesander Jul 30, 2026
ecf946f
docs: ConfigDSNW says when it ignores a parent window handle
maltesander Jul 30, 2026
b2510d4
feat: the diagnostic origin fields answer from the SQLSTATE
maltesander Jul 30, 2026
32fb8cd
fix: a non-null zero-length buffer reports truncation
maltesander Jul 30, 2026
df889c3
test: the installer audit can see every FALSE-capable exit
maltesander Jul 30, 2026
5a64300
test: the spec's diagnostics tables are transcribed and checked
maltesander Jul 31, 2026
fab6e45
docs: the execute functions' diagnostics match their spec tables
maltesander Jul 31, 2026
1d10111
docs: the fetch functions' diagnostics match their spec tables
maltesander Jul 31, 2026
0b54706
docs: the parameter functions' diagnostics match their spec tables
maltesander Jul 31, 2026
39214d6
docs: the metadata functions' diagnostics match their spec tables
maltesander Jul 31, 2026
965f355
docs: the cursor functions' diagnostics match their spec tables
maltesander Jul 31, 2026
ba70632
docs: the connect functions' diagnostics match their spec tables
maltesander Jul 31, 2026
75bce7c
docs: the handle functions' diagnostics match their spec tables
maltesander Jul 31, 2026
9108e05
docs: the info, env, transaction and descriptor diagnostics match
maltesander Jul 31, 2026
d5971ab
test: every FFI entry point's diagnostics table is transcribed
maltesander Jul 31, 2026
42ad47e
docs: connect is called under the group lock, like every Backend method
maltesander Jul 31, 2026
7a1a7c6
fix: SQLAllocHandle reports HY014 when the handle registry is exhausted
maltesander Jul 31, 2026
58c54c0
docs: the README carries the Stackable header, badges and a Highlight…
maltesander Jul 31, 2026
56b540c
chore: remove maintained batch from readme -> took too much space
maltesander Jul 31, 2026
3a71421
refactor!: ChunkWrite gains the seal its neighbours already have
maltesander Jul 31, 2026
533212c
feat: sealed query types for the ten catalog backend hooks
maltesander Jul 31, 2026
077b7ee
refactor!: SQLTables' backend hook takes a TablesQuery
maltesander Jul 31, 2026
0ee85ad
refactor!: SQLColumns' backend hook takes a ColumnsQuery
maltesander Jul 31, 2026
0204eca
refactor!: the remaining eight catalog hooks take query types
maltesander Jul 31, 2026
d83956b
docs: the catalog hooks' argument contract is a typed query object
maltesander Jul 31, 2026
ea416a3
docs: the conformance module's link to info_group_inconsistencies res…
maltesander Jul 31, 2026
65c5513
chore: remove proptest docs before release
maltesander Jul 31, 2026
bedcb9c
ci: the cargo-doc hook checks the test-support surface too
maltesander Jul 31, 2026
ddaad15
test: the diagnostics-table guards are out of Miri's budget
maltesander Jul 31, 2026
b9ad568
docs: the README explains itself to someone who does not know ODBC
maltesander Jul 31, 2026
3be1e16
fix: the benchmark crate's Backend impl takes the catalog query types
maltesander Jul 31, 2026
534d0f3
docs: implementation plan for the 2026-07-31 audit remediation
adwk67 Jul 31, 2026
af5a030
bench: add FFI-level fetch and chunked SQLGetData benchmarks
adwk67 Jul 31, 2026
90baa56
fix: SQL_ATTR_ROW_BIND_OFFSET_PTR no longer offsets null data/indicat…
adwk67 Jul 31, 2026
128abaf
docs: satisfy markdownlint in the remediation plan
adwk67 Jul 31, 2026
45ecd39
fix: SQLCopyDesc phase one runs under a panic guard
adwk67 Jul 31, 2026
2b7f667
fix: a zero-length SQLGetData buffer reports truncation instead of co…
adwk67 Jul 31, 2026
b2813c5
fix: SQL_ATTR_PARAM_BIND_OFFSET_PTR is applied when reading bound par…
adwk67 Jul 31, 2026
d4dce4b
fix: SQL_C_BIT fetch conversion follows the spec's three-way range rule
adwk67 Aug 1, 2026
2a8fc0e
fix: text-to-integer fetch conversion is exact instead of via f64
adwk67 Aug 1, 2026
a919461
fix: pathological exponents are rejected before decimal expansion
adwk67 Aug 1, 2026
f98e304
fix: float-to-integer fetch conversion truncates before range-checking
adwk67 Aug 1, 2026
37fbfee
fix: character-to-datetime fetch conversion implements the spec's cro…
adwk67 Aug 1, 2026
dd25a22
fix: date parsing rejects impossible calendar days
adwk67 Aug 1, 2026
6d84411
feat: add the Backend::configure_dsn setup hook and its installer types
maltesander Aug 2, 2026
36234dc
feat: route ConfigDSNW through the driver's setup hook
maltesander Aug 2, 2026
bb5bac2
docs: changelog entry for the generic DSN setup hook
maltesander Aug 2, 2026
b27683a
fix: whole-digit truncation of a numeric fetch is 22003, not 01004
adwk67 Aug 2, 2026
814167b
fix: an over-long SQL_NTS input errors instead of executing a prefix
adwk67 Aug 2, 2026
b8ee51c
fix: a nonsense column count no longer rejects every valid ordinal
adwk67 Aug 2, 2026
43bf623
Merge branch 'scaffolding' into generic-dsn-setup
maltesander Aug 2, 2026
738fa33
fix: a timer-signalled cancellation reports HYT00, not HY008
adwk67 Aug 2, 2026
5bc0417
Merge branch 'scaffolding' into generic-dsn-setup
maltesander Aug 3, 2026
66033ff
fix: a float narrowing that overflows reports 22003 instead of writin…
adwk67 Aug 3, 2026
3224079
fix: MAX_NTS_SCAN no longer refuses statements every other driver exe…
adwk67 Aug 3, 2026
0c9d37c
docs: add Task 2.14 to the remediation plan
adwk67 Aug 3, 2026
95d3f55
Merge remote-tracking branch 'origin/scaffolding' into scaffolding
adwk67 Aug 3, 2026
0040c9e
fix: a float target reports only the diagnostics its spec row defines
adwk67 Aug 3, 2026
c0e7dea
fix: SQLGetDescRecW buffer and length are counted in characters per t…
adwk67 Aug 3, 2026
60afb11
docs: record why METADATA_ID identifier stripping is as it is
adwk67 Aug 3, 2026
b200010
fix: undocumented off-table SQLSTATEs are caught by the diagnostics g…
adwk67 Aug 3, 2026
61b12f3
docs: diagnostics doc comments state defensive guards honestly; SQLGe…
adwk67 Aug 3, 2026
04ceb2a
docs: whole-path SQLSTATE claims, uniqueness claims and driver citati…
adwk67 Aug 3, 2026
21fc564
docs: module headers and crate docs describe what the modules now con…
adwk67 Aug 3, 2026
afad4f6
docs: README, AGENTS and CHANGELOG counts re-derived from the source
adwk67 Aug 3, 2026
82c342f
test: the Backend::connect failure path is exercised
adwk67 Aug 3, 2026
80e11ee
test: every marshalling family has a deliberately misaligned-buffer test
adwk67 Aug 3, 2026
c16eaf0
test: error-path tests assert the SQLSTATE their names claim
adwk67 Aug 3, 2026
a168184
test: 22002, 01004 record content, wide catalog rows and huge ordinal…
adwk67 Aug 3, 2026
ba799f7
perf: chunked SQLGetData converts each value once instead of per chunk
adwk67 Aug 3, 2026
724bc33
perf: string fetch conversions stop allocating per value
adwk67 Aug 3, 2026
366c1aa
perf: sql_fetch builds its binding list once, in column order
adwk67 Aug 3, 2026
b1016b6
docs: record why the persistent query-timer thread was reverted
adwk67 Aug 3, 2026
d840a39
perf: small allocation wins on cold paths; logging threat model docum…
adwk67 Aug 3, 2026
183cc5b
fix: the Miri job runs, and runs clean
adwk67 Aug 3, 2026
d124109
docs: the README Backend sketch names all four associated types
maltesander Aug 4, 2026
5303110
fix: SQLColAttributeW answers HY091 for an undefined field identifier
maltesander Aug 4, 2026
4848220
fix: SQLGetData range-checks the column ordinal itself
maltesander Aug 4, 2026
04b8428
fix: an undefined negative parameter indicator is HY090, not SQL_NTS
maltesander Aug 4, 2026
218501d
fix: a float renders within the display size ODBC defines for it
maltesander Aug 4, 2026
661cb6e
feat: SQL_C_NUMERIC is a supported retrieval target
maltesander Aug 4, 2026
4b91829
feat: SQL_C_GUID is a supported retrieval target
maltesander Aug 4, 2026
d40530c
docs: record why SQLDriverConnect echoes the connection string verbatim
maltesander Aug 4, 2026
1d2732c
feat: a backend can raise 01S07 for precision it dropped itself
maltesander Aug 4, 2026
75d1bf6
chore: drop the committed plans folder and the scripts/ directory
maltesander Aug 4, 2026
4434b04
Merge driver-feedback-fixes: spec fixes from the Trino and SQLite dri…
maltesander Aug 4, 2026
6f4736e
docs: rewrite the changelog, README and agent guide for the first rel…
maltesander Aug 4, 2026
a94841e
docs: rewrite the doc comments across src/
maltesander Aug 4, 2026
0b3ac1a
docs: describe the 24000 rows the spec splits in prose rather than wi…
maltesander Aug 4, 2026
7d20167
test: share the handle helpers, drop 20 duplicated tests, assert the …
maltesander Aug 4, 2026
be90851
fix: accept the deprecated ODBC 2.x datetime codes in a descriptor
maltesander Aug 4, 2026
32e72d2
chore(release): drop the README version replacement
maltesander Aug 4, 2026
e401cba
docs: name setup.rs in the crate layout, drop the stale README claim
maltesander Aug 4, 2026
c254f4d
fix: SQL_C_DEFAULT on a GUID column selects SQL_C_GUID, not SQL_C_BINARY
maltesander Aug 4, 2026
4b671fe
fix: an undefined negative indicator on a binary parameter is HY090
maltesander Aug 4, 2026
d1eb859
fix: a parameter C type core cannot marshal is refused, not bound as …
maltesander Aug 4, 2026
be5acd3
feat: the SQL to C interval conversion tables
maltesander Aug 4, 2026
fa350c4
fix: a year-month interval writes every byte of SQL_INTERVAL_STRUCT
maltesander Aug 4, 2026
9517629
docs: updates to README
adwk67 Aug 4, 2026
67af626
minor rewrites
adwk67 Aug 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Check every text file out with LF endings on every platform.
#
# Windows git defaults to `core.autocrlf=true`, and GitHub's `windows-latest`
# runners ship that default — so without this line `actions/checkout` writes CRLF
# into the working tree even though the repository stores LF. That is not a
# cosmetic difference: `the_set_of_group_lock_acquisition_sites_is_closed`
# (`src/handles/registry.rs`) reads the source tree and splits each file on a
# pattern containing a newline, and CRLF made that pattern miss, so the audit
# counted the test modules and failed on Windows alone. The test normalises line
# endings itself now; this stops the next reader of a file from having to.
#
# `text=auto` still lets git detect and leave binary content alone, so the
# wildcard is safe for anything added later. Every file currently tracked is
# text — no images, and no `.bat`/`.cmd`/`.ps1`, which are the ones that would
# want CRLF kept.
* text=auto eol=lf
106 changes: 106 additions & 0 deletions .github/ISSUE_TEMPLATE/bug_report.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
name: Bug report
description: Something in stackable-odbc-core behaves differently from the ODBC spec, or from its own documentation.
labels: ["bug"]
body:
- type: markdown
attributes:
value: |
`stackable-odbc-core` is a **library**, not a loadable ODBC driver — it
is the database-independent half. A concrete driver crate implements
the `Backend` and `StatementBackend` traits and exports the C ABI.

If the wrong behaviour is in how a particular data source is queried,
it probably belongs in that driver's repository. If you are not sure
which side it falls on, file it here and say so.

- type: textarea
id: what-happened
attributes:
label: What happened
description: What the driver did, and what you expected instead.
validations:
required: true

- type: textarea
id: call-sequence
attributes:
label: ODBC call sequence
description: >
The calls that lead to it, in order, with the arguments that matter.
Most bugs in this crate are about a specific function under a specific
prior state, so the sequence is usually more useful than a stack trace.
placeholder: |
SQLAllocHandle(SQL_HANDLE_STMT, ...)
SQLExecDirectW(stmt, L"SELECT ...", SQL_NTS) -> SQL_SUCCESS
SQLFetch(stmt) -> SQL_ERROR, expected SQL_SUCCESS
validations:
required: true

- type: input
id: sqlstate
attributes:
label: SQLSTATE and message
description: >
From `SQLGetDiagRecW`, if the call returned `SQL_ERROR` or
`SQL_SUCCESS_WITH_INFO`. A wrong SQLSTATE is itself a bug worth
reporting, even when the call otherwise does the right thing.
placeholder: "07009 — Column number 3 out of range (have 5 columns)"

- type: input
id: spec-reference
attributes:
label: Spec reference
description: >
Link to the function's page on Microsoft Learn, and quote the row or
sentence you think is not being honoured. Optional, but it is what
makes a report immediately actionable — and pay attention to whether
the row carries a `(DM)` marker, which means the Driver Manager owes
it rather than the driver.
placeholder: "https://learn.microsoft.com/en-us/sql/odbc/reference/syntax/sqlfetch-function"

- type: input
id: version
attributes:
label: Version or commit
description: The `stackable-odbc-core` version, or the commit if building from source.
validations:
required: true

- type: input
id: driver
attributes:
label: Driver crate
description: Which driver is built on core here, and at what version.

- type: dropdown
id: driver-manager
attributes:
label: Driver Manager
description: >
The Windows Driver Manager is considerably stricter than unixODBC, and
several behaviours differ between them.
options:
- unixODBC
- Windows Driver Manager
- None (calling the exported entry points directly)
- Other / not sure
validations:
required: true

- type: input
id: platform
attributes:
label: Platform
description: OS and architecture, and the application if one is involved.
placeholder: "Ubuntu 24.04 x86_64, pyodbc 5.1 / isql"

- type: textarea
id: logs
attributes:
label: Driver log
description: >
Set `ODBC_LOG_LEVEL=trace` and `ODBC_LOG_FILE=/path/to/log`, reproduce,
and attach the relevant part. **Check it before posting** — a
connection string may appear in it. Passwords are redacted, but other
connection parameters are not.
render: text
11 changes: 11 additions & 0 deletions .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
blank_issues_enabled: true
contact_links:
- name: Question or discussion
url: https://github.com/orgs/stackabletech/discussions
about: For usage questions and anything that is not yet a specific defect.
- name: Community chat
url: https://discord.gg/7kZ3BNnCAF
about: Stackable's Discord, for a faster back-and-forth.
- name: Report a security vulnerability
url: https://github.com/stackabletech/stackable-odbc-core/security/advisories/new
about: Please report vulnerabilities privately rather than in an issue.
62 changes: 62 additions & 0 deletions .github/ISSUE_TEMPLATE/feature_request.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
name: Feature request
description: An ODBC function, attribute or info type that core does not implement yet, or a change to the Backend trait.
labels: ["enhancement"]
body:
- type: markdown
attributes:
value: |
Most additions here are driven by the ODBC spec rather than invented:
a function that is stubbed, an attribute that is accepted and ignored,
an info type answered with a default. Saying which one it is, and
quoting the spec, usually settles the design.

- type: textarea
id: what
attributes:
label: What is missing
description: What you need core to do that it does not do today.
validations:
required: true

- type: textarea
id: use-case
attributes:
label: What it unblocks
description: >
The application or driver that needs it, and what it does instead
today. A concrete blocked case is the strongest argument.
validations:
required: true

- type: input
id: spec-reference
attributes:
label: Spec reference
description: >
The relevant page on Microsoft Learn, if there is one. For an info
type or attribute, quote its description — the stated *purpose* often
decides the design, and has more than once here.
placeholder: "https://learn.microsoft.com/en-us/sql/odbc/reference/syntax/sqlgetinfo-function"

- type: dropdown
id: layer
attributes:
label: Which side should own it
description: >
Core holds no database-specific code. A capability only the data source
can answer belongs on a `Backend` method, so the compiler asks the
driver author rather than core guessing — a value core invents is wrong
for some real driver, and wrong silently.
options:
- Core owns it entirely (same answer for every driver)
- A new or changed Backend trait method (each driver answers)
- Not sure
validations:
required: true

- type: checkboxes
id: breaking
attributes:
label: Compatibility
options:
- label: This would change an existing public API or trait method (a breaking change for driver crates)
30 changes: 30 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
---
# Every `uses:` in this repository is pinned to a full commit SHA, which is only
# safe if something keeps those pins current. Without this file they freeze
# permanently, and Cargo.lock drifts toward advisories cargo-deny will start
# failing on with no PR available to fix them.
version: 2
updates:
- package-ecosystem: github-actions
directory: /
schedule:
interval: weekly
groups:
actions:
patterns: ["*"]

- package-ecosystem: cargo
directory: /
schedule:
interval: weekly
groups:
cargo:
patterns: ["*"]
update-types: ["minor", "patch"]

# fuzz/ is a separate Cargo workspace (libFuzzer needs nightly), so the root
# ecosystem entry above does not cover it.
- package-ecosystem: cargo
directory: /fuzz
schedule:
interval: monthly
47 changes: 47 additions & 0 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
<!-- markdownlint-disable-file MD041 -->
<!--
MD041 wants a top-level heading first. This file is not a document: its
content is pasted into a pull request body, where GitHub supplies the title,
so an H1 here would only duplicate it. The rule stays on everywhere else.

Delete any section that does not apply. The checklist is a reminder, not a
gate — CI enforces what it can, and the rest is what a reviewer would
otherwise have to ask for.
-->

## What this changes

<!-- What behaviour differs after this, and why. -->

## Spec basis

<!--
For anything touching an FFI entry point: link the function's page on Microsoft
Learn and quote the row or sentence this implements.

Two things worth stating explicitly, because both have caused rework here:
- whether a SQLSTATE's row carries a **(DM)** marker, which means the Driver
Manager owes it and the driver must not return it; and
- what the attribute or info type's description says its *purpose* is, which
has decided the design more than once.
-->

## Checklist

- [ ] `pre-commit run --all-files` passes — this is the single source of truth for what must pass.
- [ ] `CHANGELOG.md` has an entry under `## [Unreleased]`, if this is user-facing. Any change to a public type, trait method or exported FFI contract counts, since driver crates consume them.
- [ ] Doc comments on any FFI function touched list every SQLSTATE from its spec diagnostics table, saying for each whether the driver returns it or why not.
- [ ] New tests were checked by breaking the line they cover and watching them fail. A test that cannot fail reports coverage that does not exist.

### If it applies

- [ ] Miri, for anything touching raw pointers: `MIRIFLAGS="-Zmiri-disable-isolation" cargo +nightly miri test -p stackable-odbc-core --lib -- --skip proptest`
- [ ] loom, for anything touching handle locking: `RUSTFLAGS="--cfg loom" cargo test --lib loom_tests`
- [ ] Breaking changes for driver crates are called out above, so the drivers can be updated alongside.

## Notes for the reviewer

<!--
Anything you decided rather than derived — a spec sentence you read two ways,
a case left unhandled on purpose, a TODO(spec) you added.
-->
Loading
Loading