diff --git a/src/consts.jl b/src/consts.jl index aa44ff4..f96b443 100644 --- a/src/consts.jl +++ b/src/consts.jl @@ -282,7 +282,6 @@ const C_TYPES = Dict( # success codes const SQL_SUCCESS = Int16(0) const SQL_SUCCESS_WITH_INFO = Int16(1) -const SQL_STILL_EXECUTING = Int16(2) # error codes const SQL_ERROR = Int16(-1) @@ -295,7 +294,10 @@ const SQL_NO_DATA = Int16(100) const RETURN_VALUES = Dict(SQL_ERROR => "SQL_ERROR", SQL_NO_DATA => "SQL_NO_DATA", - SQL_INVALID_HANDLE => "SQL_INVALID_HANDLE", - SQL_STILL_EXECUTING => "SQL_STILL_EXECUTING") + SQL_SUCCESS => "SQL_SUCCESS", + SQL_NTS => "SQL_NTS", + SQL_STILL_EXECUTING => "SQL_STILL_EXECUTING", + SQL_INVALID_HANDLE => "SQL_INVALID_HANDLE", + SQL_SUCCESS_WITH_INFO => "SQL_SUCCESS_WITH_INFO") const SQL_NO_NULLS = Int16(0) diff --git a/src/dbinterface.jl b/src/dbinterface.jl index a790788..d1220f2 100644 --- a/src/dbinterface.jl +++ b/src/dbinterface.jl @@ -388,7 +388,13 @@ function Base.iterate(x::Cursor{false}, st=1) while status == API.SQL_STILL_EXECUTING status = API.SQLFetchScroll(API.getptr(x.stmt), API.SQL_FETCH_NEXT, 0) end - status == API.SQL_SUCCESS || status == API.SQL_SUCCESS_WITH_INFO || return nothing + + status == API.SQL_NO_DATA && return nothing + status == API.SQL_NTS && return nothing + status == API.SQL_SUCCESS_WITH_INFO && @warn(API.diagnostics(x.stmt)) + status == API.SQL_ERROR && error(API.diagnostics(x.stmt)) + status == API.SQL_INVALID_HANDLE && error(API.diagnostics(x.stmt)) + x.current_rownumber = st for (i, binding) in enumerate(x.bindings) getdata(x.stmt, i, binding) diff --git a/test/runtests.jl b/test/runtests.jl index 9636024..9647fcc 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -85,6 +85,12 @@ expected = ( Senior = Union{Missing, Bool}[true, true, false, true], ) + +# Validate that iteration of results throws runtime Error on DivisionByZero +@test_throws ErrorException DBInterface.execute( + conn, "SELECT a, b, a/b FROM (VALUES (2,1),(1,0),(2,1)) AS t(a,b)" +) |> columntable + cursor = DBInterface.execute(conn, "select * from Employee") @test eltype(cursor) == ODBC.Row @test Tables.istable(cursor)