Skip to content

Get E2e Tests working in Windows - #149

Merged
Saurabh Singh (saurabh500) merged 7 commits into
mainfrom
dev/tkotian/E2eInWindows
Aug 4, 2026
Merged

Saurabh Singh (saurabh500) merged 7 commits into
mainfrom
dev/tkotian/E2eInWindows

Conversation

@Theekshna

@Theekshna ttk (Theekshna) commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Description

Summary

Expands the phase-1 mssql-odbc driver with the ODBC 3.x entry points the Windows Driver Manager requires during connection and statement setup, and aligns their behavior with the msodbcsql reference driver. All new handlers were verified against the msodbcsql source (headers + sqlcinfo.cpp/sqlcmisc.cpp) for constant values, bit-packing, and null-pointer semantics.

Changes

  • New API entry points: SQLConnectW, SQLGetFunctions, SQLGetInfoW, SQLGetEnvAttr/SQLSetEnvAttr, SQLGetStmtAttrW, SQLGetConnectAttrW, SQLGetDiagFieldW, and SQLGetDescFieldW (with a new desc descriptor handle type and the four implicit descriptors on StmtHandle).
  • msodbcsql parity fixes: SQLGetFunctions uses the reference's ODBC3 bit-packing (idx = id>>4, 1 << (id & 0xF), 250-word map) and reports a correct strict-subset of implemented functions (adds the previously-missing SQLConnect/SQLRowCount); SQLGetFunctions and SQLGetStmtAttrW now treat a null out-pointer as a benign SQL_SUCCESS no-op instead of returning HY009/SQL_ERROR.
  • Constants: ~80 new FFI constants in odbc_types.rs, all audited against sql.h/sqlext.h/sqlucode.h/sqlspi.h (fixed SQL_API_SQLCONNECT to 7); minor diagnostics/named-constant cleanups in get_diag.rs and get_info.rs.
  • E2E tests: added get_diag_field coverage, compareWith msodbcsql support in run_e2e.ps1, an optional UNICODE build toggle in CMake, and switched connection-less tests from GTEST_SKIP to a hard failure so missing config surfaces instead of silently passing.

Validation

Built clean and 343 lib tests pass under cargo +ms-stable. Note: local verification used +ms-stable rather than the pinned 1.95 toolchain (msrustup constraint), and coverage/nextest were substituted with cargo test/clippy — CI should re-confirm on the pinned toolchain.

Related Issues

closes AB#46564

Checklist

  • cargo bfmt passes
  • cargo bclippy passes
  • cargo btest passes
  • New/changed functionality has tests
  • Public API changes are documented

Theekshna Kotian and others added 2 commits July 24, 2026 03:31
SQL_DIAG_CLASS_ORIGIN and SQL_DIAG_SUBCLASS_ORIGIN are synthesized by the
Driver Manager, not the driver. unixODBC returns ODBC 3.0 for the 08001
connect error while the Windows DM returns ISO 9075, so the two tests only
passed when run against the Microsoft driver. The driver's own origin logic
is already covered by get_diag.rs unit tests.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Theekshna
ttk (Theekshna) marked this pull request as ready for review July 24, 2026 06:56
@Theekshna
ttk (Theekshna) requested a review from a team as a code owner July 24, 2026 06:56
Copilot AI review requested due to automatic review settings July 24, 2026 06:56

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds Windows Driver Manager compatibility for mssql-odbc and expands Windows E2E/parity testing.

Changes:

  • Adds required ODBC connection, metadata, environment, statement, and descriptor support.
  • Introduces implicit statement descriptors and diagnostic fields.
  • Adds Unicode Windows builds and msodbcsql parity runs.

Reviewed changes

Copilot reviewed 27 out of 27 changed files in this pull request and generated 13 comments.

Show a summary per file
File Description
mssql-odbc/tests/e2e/tests/smoke_test.cpp Fails when live configuration is missing.
mssql-odbc/tests/e2e/tests/num_result_cols_test.cpp Requires live configuration.
mssql-odbc/tests/e2e/tests/more_results_test.cpp Requires live configuration.
mssql-odbc/tests/e2e/tests/execute_test.cpp Requires live configuration.
mssql-odbc/tests/e2e/tests/exec_direct_test.cpp Requires live configuration.
mssql-odbc/tests/e2e/tests/driver_connect_test.cpp Improves diagnostic-state lookup.
mssql-odbc/tests/e2e/tests/describe_col_test.cpp Requires live configuration.
mssql-odbc/tests/e2e/tests/alloc_stmt_test.cpp Requires live configuration.
mssql-odbc/tests/e2e/tests/alloc_env_test.cpp Requires live configuration.
mssql-odbc/tests/e2e/run_e2e.sh Adds configurable Unicode mode.
mssql-odbc/tests/e2e/run_e2e.ps1 Adds Windows parity execution and reporting.
mssql-odbc/tests/e2e/README.md Documents Windows parity and Unicode builds.
mssql-odbc/tests/e2e/CMakeLists.txt Configures platform-specific Unicode compilation.
mssql-odbc/src/handles/stmt.rs Owns four implicit descriptors.
mssql-odbc/src/handles/mod.rs Registers the descriptor module.
mssql-odbc/src/handles/desc.rs Defines implicit descriptor handles.
mssql-odbc/src/api/set_connect_attr.rs Accepts SQL_ATTR_ANSI_APP.
mssql-odbc/src/api/odbc_types.rs Adds ODBC constants and identifiers.
mssql-odbc/src/api/mod.rs Registers new API modules.
mssql-odbc/src/api/get_stmt_attr.rs Returns implicit descriptor handles.
mssql-odbc/src/api/get_info.rs Implements driver capability metadata.
mssql-odbc/src/api/get_functions.rs Reports implemented ODBC functions.
mssql-odbc/src/api/get_env_attr.rs Retrieves ODBC environment version.
mssql-odbc/src/api/get_diag.rs Expands diagnostic-field support.
mssql-odbc/src/api/exports.rs Exports the new ODBC entry points.
mssql-odbc/src/api/driver_connect.rs Exposes the shared connection core.
mssql-odbc/src/api/connect.rs Adds SQLConnectW.
Comments suppressed due to low confidence (2)

mssql-odbc/src/api/exports.rs:642

  • This exported FFI entry point bypasses crate::ffi_entry!, so a panic can unwind across the C ABI boundary. Delegate to a separately wrapped implementation instead of implementing the stub directly in exports.rs.
    super::odbc_types::SQL_ERROR

mssql-odbc/src/api/exports.rs:673

  • This exported descriptor entry point also lacks the mandatory crate::ffi_entry! panic boundary. Put the validation/error logic in a wrapped implementation and keep this export as a tracing-initializing delegate, otherwise a panic may unwind into the Driver Manager.
    super::odbc_types::SQL_ERROR

Comment thread mssql-odbc/src/api/connect.rs Outdated
Comment thread mssql-odbc/src/api/connect.rs Outdated
Comment thread mssql-odbc/src/api/get_info.rs
Comment thread mssql-odbc/src/api/get_info.rs
Comment thread mssql-odbc/src/handles/desc.rs
Comment thread mssql-odbc/src/api/get_diag.rs
Comment thread mssql-odbc/src/api/get_diag.rs
Comment thread mssql-odbc/tests/e2e/run_e2e.ps1 Outdated
Comment thread mssql-odbc/tests/e2e/run_e2e.ps1
Comment thread mssql-odbc/tests/e2e/run_e2e.ps1
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actions

github-actions Bot commented Jul 24, 2026

Copy link
Copy Markdown

📊 Code Coverage Report

🔥 Diff Coverage

84%

🎯 Overall Coverage

91.3%

📦 Project: mssql-tds + mssql-odbc + mssql-py-core
ℹ️ Note: diff coverage is reported, not enforced.


Diff Coverage

Diff: main...HEAD, staged and unstaged changes

  • mssql-odbc/src/api/connect.rs (83.0%): Missing lines 76,78-79,85-87,89,91,93-96,99-102,104
  • mssql-odbc/src/api/driver_connect.rs (100%)
  • mssql-odbc/src/api/exports.rs (38.0%): Missing lines 104-110,112-116,119,170-177,179-184,187,274-283,285-292,295,613-617,620,628,667-672,675,684
  • mssql-odbc/src/api/get_diag.rs (98.0%): Missing lines 433-435
  • mssql-odbc/src/api/get_env_attr.rs (79.2%): Missing lines 50-51,70-71,78-80,88-90
  • mssql-odbc/src/api/get_functions.rs (98.7%): Missing lines 72-73
  • mssql-odbc/src/api/get_info.rs (85.6%): Missing lines 94-95,114-119,121-126,148-159,162-167,169-174,184-189
  • mssql-odbc/src/api/set_connect_attr.rs (100%)
  • mssql-odbc/src/api/set_stmt_attr.rs (100%)
  • mssql-odbc/src/handles/desc.rs (83.3%): Missing lines 62-64
  • mssql-odbc/src/handles/stmt.rs (100%)
  • mssql-tds/src/connection/tds_client.rs (0.0%): Missing lines 416-418

Summary

  • Total: 929 lines
  • Missing: 144 lines
  • Coverage: 84%

mssql-odbc/src/api/connect.rs

  72 ) -> SqlReturn {
  73     if connection_handle.is_null() {
  74         error!("SQLConnectW: connection_handle is null");
  75         return SQL_INVALID_HANDLE;
! 76     }
  77 
! 78     let dbc = unsafe { handle_from_raw::<DbcHandle>(connection_handle) };
! 79     debug_assert_eq!(
  80         dbc.object_type,
  81         HandleType::Dbc,
  82         "SQLConnectW: handle is not a DBC"
  83     );

   81         HandleType::Dbc,
   82         "SQLConnectW: handle is not a DBC"
   83     );
   84 
!  85     let read = |ptr: *const SqlWChar, len: SqlSmallInt| -> Option<String> {
!  86         if ptr.is_null() {
!  87             None
   88         } else {
!  89             Some(unsafe { read_utf16(ptr, len) })
   90         }
!  91     };
   92 
!  93     let conn_str = build_connection_string(
!  94         read(server_name, name_length_1),
!  95         read(user_name, name_length_2),
!  96         read(authentication, name_length_3),
   97     );
   98 
!  99     sql_driver_connect_w_safe(
! 100         dbc,
! 101         conn_str,
! 102         std::ptr::null_mut(),
  103         0,
! 104         std::ptr::null_mut(),
  105         SQL_DRIVER_NOPROMPT,
  106     )
  107 }

mssql-odbc/src/api/exports.rs

  100 /// - `attribute` must be a valid connection attribute identifier.
  101 /// - `value_ptr` validity depends on the attribute type.
  102 /// - `string_length` is used only for string-type attributes.
  103 #[unsafe(no_mangle)]
! 104 pub unsafe extern "C" fn SQLSetConnectAttrW(
! 105     connection_handle: SqlHandle,
! 106     attribute: SqlInteger,
! 107     value_ptr: SqlPointer,
! 108     string_length: SqlInteger,
! 109 ) -> SqlReturn {
! 110     crate::init_tracing();
  111     unsafe {
! 112         super::set_connect_attr::sql_set_connect_attr_w(
! 113             connection_handle,
! 114             attribute,
! 115             value_ptr,
! 116             string_length,
  117         )
  118     }
! 119 }
  120 
  121 /// Retrieves a statement attribute.
  122 ///
  123 /// # Safety

  166 /// # Safety
  167 /// - `connection_handle` must be a valid DBC handle.
  168 /// - Output pointers must be valid and writable for the requested info type.
  169 #[unsafe(no_mangle)]
! 170 pub unsafe extern "C" fn SQLGetInfoW(
! 171     connection_handle: SqlHandle,
! 172     info_type: SqlUSmallInt,
! 173     info_value_ptr: SqlPointer,
! 174     buffer_length: SqlSmallInt,
! 175     string_length_ptr: *mut SqlSmallInt,
! 176 ) -> SqlReturn {
! 177     crate::init_tracing();
  178     unsafe {
! 179         super::get_info::sql_get_info_w(
! 180             connection_handle,
! 181             info_type,
! 182             info_value_ptr,
! 183             buffer_length,
! 184             string_length_ptr,
  185         )
  186     }
! 187 }
  188 
  189 // ---- Diagnostics -----------------------------------------------------------
  190 
  191 /// Retrieves a diagnostic record (SQLSTATE, native error, message) previously

  270 /// - `server_name`, `user_name`, and `authentication` (if non-null) must each point
  271 ///   to a valid UTF-16 buffer of the corresponding length (or be null-terminated
  272 ///   when the length is `SQL_NTS`).
  273 #[unsafe(no_mangle)]
! 274 pub unsafe extern "C" fn SQLConnectW(
! 275     connection_handle: SqlHandle,
! 276     server_name: *const SqlWChar,
! 277     name_length1: SqlSmallInt,
! 278     user_name: *const SqlWChar,
! 279     name_length2: SqlSmallInt,
! 280     authentication: *const SqlWChar,
! 281     name_length3: SqlSmallInt,
! 282 ) -> SqlReturn {
! 283     crate::init_tracing();
  284     unsafe {
! 285         super::connect::sql_connect_w(
! 286             connection_handle,
! 287             server_name,
! 288             name_length1,
! 289             user_name,
! 290             name_length2,
! 291             authentication,
! 292             name_length3,
  293         )
  294     }
! 295 }
  296 
  297 /// Establishes a connection to a data source.
  298 ///
  299 /// # Safety

  609 /// - `attribute` must be a valid connection attribute identifier.
  610 /// - Output pointers must be valid and writable.
  611 #[unsafe(no_mangle)]
  612 pub unsafe extern "C" fn SQLGetConnectAttrW(
! 613     connection_handle: SqlHandle,
! 614     attribute: SqlInteger,
! 615     value_ptr: SqlPointer,
! 616     buffer_length: SqlInteger,
! 617     string_length_ptr: *mut SqlInteger,
  618 ) -> SqlReturn {
  619     crate::init_tracing();
! 620     tracing::debug!(
  621         ?connection_handle,
  622         attribute,
  623         ?value_ptr,
  624         buffer_length,

  624         buffer_length,
  625         ?string_length_ptr,
  626         "SQLGetConnectAttrW called (stub)",
  627     );
! 628     super::odbc_types::SQL_ERROR
  629 }
  630 
  631 /// Sets a statement attribute.
  632 ///

  663 /// - `field_identifier` must be a valid field identifier.
  664 /// - Output pointers must be valid and writable.
  665 #[unsafe(no_mangle)]
  666 pub unsafe extern "C" fn SQLGetDescFieldW(
! 667     descriptor_handle: SqlHandle,
! 668     record_number: SqlSmallInt,
! 669     field_identifier: SqlSmallInt,
! 670     value_ptr: SqlPointer,
! 671     buffer_length: SqlInteger,
! 672     string_length_ptr: *mut SqlInteger,
  673 ) -> SqlReturn {
  674     crate::init_tracing();
! 675     tracing::debug!(
  676         ?descriptor_handle,
  677         record_number,
  678         field_identifier,
  679         ?value_ptr,

  680         buffer_length,
  681         ?string_length_ptr,
  682         "SQLGetDescFieldW called (stub)",
  683     );
! 684     super::odbc_types::SQL_ERROR
  685 }
  686 
  687 /// Cancels the processing of the statement.
  688 ///

mssql-odbc/src/api/get_diag.rs

  429                 HandleType::Desc,
  430                 "with_locked_diag_records: handle is not DESC"
  431             );
  432             let guard = h.inner.lock().map_err(|_| {
! 433                 error!("with_locked_diag_records: DESC mutex poisoned");
! 434                 SQL_ERROR
! 435             })?;
  436             Ok(f(guard.diag_records()))
  437         }
  438         _ => {
  439             error!(

mssql-odbc/src/api/get_env_attr.rs

  46     value_ptr: SqlPointer,
  47     string_length_ptr: *mut SqlInteger,
  48 ) -> SqlReturn {
  49     if environment_handle.is_null() {
! 50         error!("SQLGetEnvAttr: environment_handle is null");
! 51         return SQL_INVALID_HANDLE;
  52     }
  53 
  54     let env = unsafe { handle_from_raw::<EnvHandle>(environment_handle) };
  55     debug_assert_eq!(

  66     value_ptr: SqlPointer,
  67     string_length_ptr: *mut SqlInteger,
  68 ) -> SqlReturn {
  69     let Ok(mut state) = env.inner.lock() else {
! 70         error!("SQLGetEnvAttr: env mutex poisoned");
! 71         return SQL_ERROR;
  72     };
  73     free_errors(&mut state);
  74 
  75     match attribute {

  74 
  75     match attribute {
  76         SQL_ATTR_ODBC_VERSION => {
  77             let v = match state.odbc_version {
! 78                 OdbcVersion::Unset => 0u32,
! 79                 OdbcVersion::Odbc2 => crate::api::odbc_types::SQL_OV_ODBC2,
! 80                 OdbcVersion::Odbc3 => crate::api::odbc_types::SQL_OV_ODBC3,
  81                 OdbcVersion::Odbc3_80 => crate::api::odbc_types::SQL_OV_ODBC3_80,
  82             };
  83             unsafe { write_if_some(value_ptr as *mut u32, v) };
  84             unsafe { write_if_some(string_length_ptr, std::mem::size_of::<u32>() as i32) };

  84             unsafe { write_if_some(string_length_ptr, std::mem::size_of::<u32>() as i32) };
  85             SQL_SUCCESS
  86         }
  87         _ => {
! 88             error!(attribute, "SQLGetEnvAttr: unsupported env attribute");
! 89             post_diag(&mut state, ERR_INVALID_ATTRIBUTE_IDENTIFIER);
! 90             SQL_ERROR
  91         }
  92     }
  93 }

mssql-odbc/src/api/get_functions.rs

  68     function_id: SqlUSmallInt,
  69     supported_ptr: *mut SqlUSmallInt,
  70 ) -> SqlReturn {
  71     let Ok(mut state) = dbc.inner.lock() else {
! 72         error!("SQLGetFunctions: dbc mutex poisoned");
! 73         return SQL_ERROR;
  74     };
  75     free_errors(&mut state);
  76 
  77     // Matches msodbcsql (sqlcinfo.cpp): a null SupportedPtr is a benign no-op

mssql-odbc/src/api/get_info.rs

  90     buffer_length: SqlSmallInt,
  91     string_length_ptr: *mut SqlSmallInt,
  92 ) -> SqlReturn {
  93     let Ok(mut state) = dbc.inner.lock() else {
! 94         error!("SQLGetInfoW: dbc mutex poisoned");
! 95         return SQL_ERROR;
  96     };
  97     free_errors(&mut state);
  98 
  99     unsafe { write_if_some(string_length_ptr, 0) };

  110             buffer_length,
  111             string_length_ptr,
  112             driver_name(),
  113         ),
! 114         SQL_DRIVER_VER => write_wide_str(
! 115             &mut state,
! 116             info_value_ptr,
! 117             buffer_length,
! 118             string_length_ptr,
! 119             "18.6.2.1",
  120         ),
! 121         SQL_DRIVER_ODBC_VER | SQL_ODBC_VER => write_wide_str(
! 122             &mut state,
! 123             info_value_ptr,
! 124             buffer_length,
! 125             string_length_ptr,
! 126             "03.80",
  127         ),
  128         SQL_ODBC_API_CONFORMANCE => write_u16(info_value_ptr, SQL_OAC_LEVEL2, string_length_ptr),
  129         SQL_ODBC_SQL_CONFORMANCE => write_u16(info_value_ptr, SQL_OSC_CORE, string_length_ptr),
  130         SQL_CURSOR_COMMIT_BEHAVIOR => write_u16(info_value_ptr, SQL_CB_CLOSE, string_length_ptr),

  144         SQL_DBMS_VER => {
  145             // ODBC reports SQL_DBMS_VER as "##.##.####" (major.minor.build).
  146             // Use the version negotiated at login; fall back to a neutral
  147             // placeholder when the connection has no reported version yet.
! 148             let version = state
! 149                 .client
! 150                 .as_ref()
! 151                 .and_then(|c| c.server_version())
! 152                 .map(|v| format!("{:02}.{:02}.{:04}", v.major, v.minor, v.build))
! 153                 .unwrap_or_else(|| "00.00.0000".to_string());
! 154             write_wide_str(
! 155                 &mut state,
! 156                 info_value_ptr,
! 157                 buffer_length,
! 158                 string_length_ptr,
! 159                 &version,
  160             )
  161         }
! 162         SQL_IDENTIFIER_QUOTE_CHAR => write_wide_str(
! 163             &mut state,
! 164             info_value_ptr,
! 165             buffer_length,
! 166             string_length_ptr,
! 167             "\"",
  168         ),
! 169         SQL_NEED_LONG_DATA_LEN => write_wide_str(
! 170             &mut state,
! 171             info_value_ptr,
! 172             buffer_length,
! 173             string_length_ptr,
! 174             "N",
  175         ),
  176         SQL_ASYNC_DBC_FUNCTIONS => {
  177             write_u32(info_value_ptr, SQL_ASYNC_DBC_NOT_CAPABLE, string_length_ptr)
  178         }

  180             info_value_ptr,
  181             SQL_ASYNC_NOTIFICATION_NOT_CAPABLE,
  182             string_length_ptr,
  183         ),
! 184         SQL_DM_VER => write_wide_str(
! 185             &mut state,
! 186             info_value_ptr,
! 187             buffer_length,
! 188             string_length_ptr,
! 189             "03.80.0000",
  190         ),
  191         _ => {
  192             error!(info_type, "SQLGetInfoW: unsupported info type");
  193             post_diag(&mut state, ERR_INVALID_INFO_TYPE);

mssql-odbc/src/handles/desc.rs

  58 impl HasDiagnostics for DescState {
  59     fn diag_records(&self) -> &[DiagRecord] {
  60         &self.diag_records
  61     }
! 62     fn diag_records_mut(&mut self) -> &mut Vec<DiagRecord> {
! 63         &mut self.diag_records
! 64     }
  65 }

mssql-tds/src/connection/tds_client.rs

  412     }
  413 
  414     /// Returns the SQL Server version reported in the `LOGINACK` token, if the
  415     /// server sent one during login.
! 416     pub fn server_version(&self) -> Option<crate::core::Version> {
! 417         self.negotiated_settings.login_ack_server_version
! 418     }
  419 
  420     /// Returns `true` if the connection is known to be dead.
  421     ///
  422     /// This surfaces the connection's last-known liveness status, updated


🔗 Quick Links

View Azure DevOps Build · Coverage Report

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Comment thread mssql-odbc/tests/e2e/tests/driver_connect_test.cpp
Resolve conflicts from main's unified execute + SQLRowCount work:
- exports.rs / mod.rs: keep both new module sets; single SQLGetStmtAttrW
- stmt.rs: keep desc-handle and odbc_types imports from both sides
- set_stmt_attr.rs: fold the four implicit-descriptor arms into main's
  combined SQLGetStmtAttr, drop the redundant get_stmt_attr module
- odbc_types.rs: remove duplicate descriptor attribute constants

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 3b4d2d23-4805-4c06-97fd-0ea460a812ca
- Dispatch SQLGetDiagRec/FieldW for SQL_HANDLE_DESC so the implicit
  descriptor handles returned by SQLGetStmtAttrW report diagnostics
  instead of SQL_INVALID_HANDLE.
- Report SQL_DBMS_VER from the version negotiated in the LOGINACK token
  via a new TdsClient::server_version() accessor, replacing the hardcoded
  value.
- Correct the e2e README: connected tests now fail (not skip) when no
  connection is configured.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 3b4d2d23-4805-4c06-97fd-0ea460a812ca
@saurabh500
Saurabh Singh (saurabh500) enabled auto-merge (squash) August 4, 2026 11:42
@saurabh500

Copy link
Copy Markdown
Contributor

Another followup PR will be sent to report true Windows Code Coverage.

@saurabh500
Saurabh Singh (saurabh500) merged commit 7fa3007 into main Aug 4, 2026
18 of 19 checks passed
@saurabh500
Saurabh Singh (saurabh500) deleted the dev/tkotian/E2eInWindows branch August 4, 2026 14:25
Saurabh Singh (saurabh500) added a commit that referenced this pull request Aug 4, 2026
…149 squash conflicts)

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 3b4d2d23-4805-4c06-97fd-0ea460a812ca
Vahid (Vahid-b) added a commit that referenced this pull request Aug 4, 2026
Two conflicts from #149:

- exports.rs: main still had the SQLGetConnectAttrW stub returning SQL_ERROR;
  this branch implements it, so the implementation is kept.
- set_connect_attr.rs: main added SQL_ATTR_ANSI_APP to the accept-and-ignore
  arm. That arm is kept with SQL_ATTR_ANSI_APP, minus SQL_ATTR_LOGIN_TIMEOUT,
  which this branch handles in its own arm above; leaving it in both would be
  an unreachable pattern.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants