Skip to Content.
Sympa Menu

freetds - Re: [freetds] ct-lib error handling

freetds AT lists.ibiblio.org

Subject: FreeTDS Development Group

List archive

Chronological Thread  
  • From: Frediano Ziglio <freddy77 AT gmail.com>
  • To: FreeTDS Development Group <freetds AT lists.ibiblio.org>
  • Subject: Re: [freetds] ct-lib error handling
  • Date: Thu, 16 Jul 2015 19:07:57 +0100

Sybase is quite different. It use dbrpc token which returns done and not
done proc. Status is returned even in case of error. Also cs_cmd_done is
returned in any case after cs_cmd_success (procedure exists) or cs_cmd_fail.
Il 14/Lug/2015 19:44, "Frediano Ziglio" <freddy77 AT gmail.com> ha scritto:

> 2015-07-13 14:39 GMT+01:00 Fergus Smith <fergus_smith111 AT hotmail.com>:
> > Hi,
> > Thanks very much for your help.I had said TDS Version 4.2 - as that's
> what tsql -c returns.When I look at the dump files, I see the versions you
> suggest.It's getting set to 8.0 in freetds.conf !
>
> Please do not use 8.0, see
> http://www.freetds.org/userguide/choosingtdsprotocol.htm. I plan to
> remove "8.0" support on next version.
>
> > Sybase;net.c:202:Connecting to xx.xx.xx.xx port 4115 (TDS version 5.0)
> > MS SQL;net.c:202:Connecting to xx.xx.xx.xx port 1603 (TDS version 7.1)
> > I've made the change you suggest to src/ctlib/ct.cIn initial testing
> it's working exactly as I'd hoped.
> > Here's the extract from the MSSQL dump file
> now;------------------------------------------------------------------------------------token.c:2075:tds_process_end:
> more_results = 0 was_cancelled = 0 error = 1
> done_count_valid = 0token.c:2092: rows_affected =
> 0token.c:2095:tds_process_end() state set to TDS_IDLEutil.c:165:Changed
> query state from READING to IDLEutil.c:83:logic error: cannot change query
> state from IDLE to PENDINGutil.c:165:Changed query state from IDLE to
> IDLEct.c:1186:ct_results() process_result_tokens returned 0 (type 4053)
> ct.c:4192:ct_diag(00847F30, 37, 4701, -99999,
> 0026AA20)ct.c:4488:ct_diag_countmsg(00847238, 4701,
> 0026AA20)ct.c:4192:ct_diag(00847F30, 33, 4701, 1,
> 0026B37C)ct.c:4423:ct_diag_getservermsg(00847238, 1,
> 0026B37C)ct.c:4192:ct_diag(00847F30, 33, 4701, 2,
> 0026B37C)ct.c:4423:ct_diag_getservermsg(00847238, 2,
> 0026B37C)ct.c:4192:ct_diag(00847F30, 35, 4701, -99999,
> 00000000)ct.c:4452:_ct_diag_clearmsg(00847238, 4701)ct.c:1867:ct_cl
> > ose(00847F30, 301)query.c:3761:tds_disconnect()
> ------------------------------------------------------------------------------------I'll
> let you know if I run into any problems with it.
>
> My tests seems to work with mssql (all ctlib) however I would like to
> test against some Sybase products and also check how Sybase ctlib
> library behave.
>
> Frediano
>
> > Thanks a million,Fergus
> >> Date: Sun, 5 Jul 2015 17:16:14 +0100
> >> From: freddy77 AT gmail.com
> >> To: freetds AT lists.ibiblio.org
> >> Subject: Re: [freetds] ct-lib error handling
> >>
> >> 2015-07-01 15:25 GMT+01:00 Fergus Smith <fergus_smith111 AT hotmail.com>:
> >> > Hi,
> >> >
> >> >
> >> >
> >> > I've come across this same problem in every version of FreeTDS I've
> tried.
> >> >
> >> > https://lists.ibiblio.org/sympa/arc/freetds/2007q3/022165.html
> >> > Running against MSSQL the error isn't trapped.
> >> > I think the ct-lib error handler isn't working properly.
> >> >
> >> >
> >> >
> >> > The test environments are;
> >> >
> >> > TDS version: 4.2
> >> >
> >>
> >> I hope you are not really using this version :)
> >> At least 5.0 (Sybase) or 7.1 (mssql)
> >>
> >> > Version: freetds vdev.0.96.85
> >> >
> >> > Windows 7 SP1
> >> >
> >> > Sybase ASE 12.5.4
> >> >
> >> > Microsoft SQL Server 2012 (SP1)
> >> >
> >> >
> >> >
> >> >
> >> >
> >> > Running on windows against sybase this is the relevant part of the
> dump file;
> >> >
> >> >
> ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
> >> >
> >> > ct.c:994:ct_send() succeeded
> >> >
> >> > ct.c:1129:ct_results(0058B5C0, 0031A910)
> >> >
> >> > token.c:549:tds_process_tokens(00588068, 0031A768, 0031A75C, 0x6914)
> >> >
> >> > util.c:165:Changed query state from PENDING to READING
> >> >
> >> > packet.c:639:Received packet
> >> >
> >> > 0000 04 01 00 dd 00 00 00 00-e5 c9 00 fc 0a 00 00 05 |........
> ........|
> >> >
> >> > 0010 10 05 5a 5a 5a 5a 5a 00-01 00 ae 00 53 74 6f 72 |..ZZZZZ.
> ....Stor|
> >> >
> >> > 0020 65 64 20 70 72 6f 63 65-64 75 72 65 20 27 63 75 |ed proce dure
> 'cu|
> >> >
> >> > 0030 73 74 6f 6d 65 72 64 62-5f 74 73 74 2e 2e 73 70 |stomerdb
> _tst..sp|
> >> >
> >> > 0040 44 6f 65 73 4e 6f 74 45-78 69 73 74 27 20 6e 6f |DoesNotE xist'
> no|
> >> >
> >> > 0050 74 20 66 6f 75 6e 64 2e-20 53 70 65 63 69 66 79 |t found.
> Specify|
> >> >
> >> > 0060 20 6f 77 6e 65 72 2e 6f-62 6a 65 63 74 6e 61 6d | owner.o
> bjectnam|
> >> >
> >> > 0070 65 20 6f 72 20 75 73 65-20 73 70 5f 68 65 6c 70 |e or use
> sp_help|
> >> >
> >> > 0080 20 74 6f 20 63 68 65 63-6b 20 77 68 65 74 68 65 | to chec k
> whethe|
> >> >
> >> > 0090 72 20 74 68 65 20 6f 62-6a 65 63 74 20 65 78 69 |r the ob ject
> exi|
> >> >
> >> > 00a0 73 74 73 20 28 73 70 5f-68 65 6c 70 20 6d 61 79 |sts (sp_ help
> may|
> >> >
> >> > 00b0 20 70 72 6f 64 75 63 65-20 6c 6f 74 73 20 6f 66 | produce lots
> of|
> >> >
> >> > 00c0 20 6f 75 74 70 75 74 29-2e 0a 06 61 73 65 63 64 | output)
> ...asecd|
> >> >
> >> > 00d0 74 00 01 00 fd 02 00 02-00 00 00 00 00 |t....... .....|
> >> >
> >> >
> >> >
> >> > token.c:564:processing result tokens. marker is e5(EED)
> >> >
> >> > token.c:115:tds_process_default_tokens() marker is e5(EED)
> >> >
> >> > token.c:2339:tds_process_msg() reading message 2812 from server
> >> >
> >> > token.c:2411:tds_process_msg() calling client msg handler
> >> >
> >> > ctutil.c:142:_ct_handle_server_message(005872A0, 00588068, 0031A660)
> >> >
> >> > ct.c:4330:ct_diag_storeservermsg(005871D8, 00587ED0, 0031A0F4)
> >> >
> >> > token.c:2424:tds_process_msg() returning TDS_SUCCESS
> >> >
> >> > token.c:564:processing result tokens. marker is fd(DONE)
> >> >
> >> > token.c:2075:tds_process_end: more_results = 0
> >> >
> >> > was_cancelled = 0
> >> >
> >> > error = 1
> >> >
> >> > done_count_valid = 0
> >> >
> >> > token.c:2092: rows_affected = 0
> >> >
> >> > token.c:2095:tds_process_end() state set to TDS_IDLE
> >> >
> >> > util.c:165:Changed query state from READING to IDLE
> >> >
> >> > util.c:83:logic error: cannot change query state from IDLE to PENDING
> >> >
> >> > util.c:165:Changed query state from IDLE to IDLE
> >> >
> >> > ct.c:1186:ct_results() process_result_tokens returned 0 (type 4052)
> >> >
> >> > ct.c:1292:ct_results() results state = 0
> >> >
> >> > ct.c:1293:ct_results() command type = 148
> >> >
> >> > ct.c:1294:ct_results() dynamic cmd = 0
> >> >
> >> >
> ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
> >> >
> >> >
> >> >
> >> > On windows against MS SQL this is the same part of the dump file;
> >> >
> >> >
> ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
> >> >
> >> > ct.c:994:ct_send() succeeded
> >> >
> >> > ct.c:1129:ct_results(0084C658, 0032AB00)
> >> >
> >> > token.c:549:tds_process_tokens(00847FD0, 0032A958, 0032A94C, 0x6914)
> >> >
> >> > util.c:165:Changed query state from PENDING to READING
> >> >
> >> > packet.c:639:Received packet
> >> >
> >> > 0000 04 01 00 c8 00 3d 01 00-aa b4 00 fc 0a 00 00 3e |.....=..
> .......>|
> >> >
> >> > 0010 10 45 00 43 00 6f 00 75-00 6c 00 64 00 20 00 6e |.E.C.o.u .l.d.
> .n|
> >> >
> >> > 0020 00 6f 00 74 00 20 00 66-00 69 00 6e 00 64 00 20 |.o.t. .f
> .i.n.d. |
> >> >
> >>
> >> Good, surely you are not using 4.2 here!
> >>
> >> > 0030 00 73 00 74 00 6f 00 72-00 65 00 64 00 20 00 70 |.s.t.o.r .e.d.
> .p|
> >> >
> >> > 0040 00 72 00 6f 00 63 00 65-00 64 00 75 00 72 00 65 |.r.o.c.e
> .d.u.r.e|
> >> >
> >> > 0050 00 20 00 27 00 62 00 69-00 6c 00 6c 00 69 00 6e |. .'.b.i
> .l.l.i.n|
> >> >
> >> > 0060 00 67 00 5f 00 64 00 65-00 76 00 2e 00 2e 00 73 |.g._.d.e
> .v.....s|
> >> >
> >> > 0070 00 70 00 52 00 75 00 61-00 69 00 72 00 69 00 50 |.p.R.u.a
> .i.r.i.P|
> >> >
> >> > 0080 00 50 00 47 00 65 00 74-00 44 00 65 00 66 00 61 |.P.G.e.t
> .D.e.f.a|
> >> >
> >> > 0090 00 75 00 6c 00 74 00 73-00 27 00 2e 00 0f 41 00 |.u.l.t.s
> .'....A.|
> >> >
> >> > 00a0 4c 00 50 00 2d 00 4d 00-41 00 54 00 52 00 49 00 |L.P.-.M.
> A.T.R.I.|
> >> >
> >> > 00b0 58 00 53 00 51 00 4c 00-53 00 56 00 00 01 00 fe |X.S.Q.L.
> S.V.....|
> >> >
> >> > 00c0 02 00 e0 00 00 00 00 00- |........|
> >> >
> >> >
> >> >
> >> > token.c:564:processing result tokens. marker is aa(ERROR)
> >> >
> >> > token.c:115:tds_process_default_tokens() marker is aa(ERROR)
> >> >
> >> > token.c:2339:tds_process_msg() reading message 2812 from server
> >> >
> >> > token.c:2411:tds_process_msg() calling client msg handler
> >> >
> >> > ctutil.c:142:_ct_handle_server_message(008472A0, 00847FD0, 0032A850)
> >> >
> >> > ct.c:4330:ct_diag_storeservermsg(008471D8, 00847ED0, 0032A2E4)
> >> >
> >> > token.c:2424:tds_process_msg() returning TDS_SUCCESS
> >> >
> >> > token.c:564:processing result tokens. marker is fe(DONEPROC)
> >> >
> >> > token.c:2075:tds_process_end: more_results = 0
> >> >
> >> > was_cancelled = 0
> >> >
> >> > error = 1
> >> >
> >> > done_count_valid = 0
> >> >
> >> > token.c:2092: rows_affected = 0
> >> >
> >> > token.c:2095:tds_process_end() state set to TDS_IDLE
> >> >
> >> > util.c:165:Changed query state from READING to IDLE
> >> >
> >> > util.c:83:logic error: cannot change query state from IDLE to PENDING
> >> >
> >> > util.c:165:Changed query state from IDLE to IDLE
> >> >
> >> > ct.c:1186:ct_results() process_result_tokens returned 0 (type 4053)
> >> >
> >> > token.c:549:tds_process_tokens(00847FD0, 0032A958, 0032A94C, 0x6914)
> >> >
> >> > token.c:552:tds_process_tokens() state is COMPLETED
> >> >
> >> > ct.c:1186:ct_results() process_result_tokens returned 1 (type 4052)
> >> >
> >> > ct.c:235:ct_describe_cmd_state(3)
> >> >
> >> > ct.c:235:ct_describe_cmd_state(2)
> >> >
> >> > ct.c:223:setting command state to READY (from SENT)
> >> >
> >> >
> ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
> >> >
> >> >
> >> >
> >> >
> >> >
> >> > I was wondering has anyone made an attempt to fix this?
> >> >
> >> >
> >> >
> >> > Thanks a million,
> >> >
> >> > Fergus
> >> >
> >>
> >> I actually cannot test if everything is ok, but in src/ctlib/ct.c
> >> there are these lines
> >>
> >>
> >>
> >> case TDS_DONEPROC_RESULT:
> >>
> >> /*
> >> * A DONEPROC result means the end of a logical
> >> * command only if it was one of the commands
> >> * directly sent from ct_send, not as a result
> >> * of a nested stored procedure call. We know
> >> * if this is the case if a STATUS_RESULT was
> >> * received immediately prior to the DONE_PROC
> >> */
> >>
> >> if (cmd->results_state == _CS_RES_STATUS) {
> >> if (done_flags & TDS_DONE_ERROR)
> >> *result_type = CS_CMD_FAIL;
> >> else
> >> *result_type = CS_CMD_SUCCEED;
> >> cmd->results_state = _CS_RES_CMD_DONE;
> >> return CS_SUCCEED;
> >> } else {
> >> if (cmd->command_type == CS_DYNAMIC_CMD) {
> >> *result_type = CS_CMD_SUCCEED;
> >> cmd->results_state = _CS_RES_CMD_DONE;
> >> return CS_SUCCEED;
> >> }
> >> }
> >>
> >> break;
> >>
> >>
> >>
> >> which seems to me broken! There are some types of commands:
> >> - LANG
> >> - RPC
> >> - SEND_DATA
> >> - SEND_BULK
> >> - CUR
> >> - DYNAMIC
> >> Now for LANG, SEND_DATA and SEND_BULK DONEPROC is not send back, you
> >> are using RPC which should be returning some data, DYNAMIC is handled
> >> by code above but error is not detected and if cursors probably are
> >> using RPCs (for instance using mssql, I don't know Sybase but if they
> >> are not using RPC they are not returning DONEPROC) should be handled.
> >> So I would change the code to (much easier)
> >>
> >>
> >>
> >> case TDS_DONEPROC_RESULT:
> >>
> >> if (done_flags & TDS_DONE_ERROR)
> >> *result_type = CS_CMD_FAIL;
> >> else
> >> *result_type = CS_CMD_SUCCEED;
> >> cmd->results_state = _CS_RES_CMD_DONE;
> >> return CS_SUCCEED;
> >>
> >>
> >>
> >> I don't agree with the comment to check status as for instance in your
> >> example status is not returned (as is returned when you call an RPC
> >> but if the RPC does not exists status is not returned). Can you try if
> >> this code solve the problem for you? I'll need to do some additional
> >> tests (for instance with cursors, dynamic and so on).
> >>
> >> Frediano
> >> _______________________________________________
> >> FreeTDS mailing list
> >> FreeTDS AT lists.ibiblio.org
> >> http://lists.ibiblio.org/mailman/listinfo/freetds
> >
> > _______________________________________________
> > FreeTDS mailing list
> > FreeTDS AT lists.ibiblio.org
> > http://lists.ibiblio.org/mailman/listinfo/freetds
>




Archive powered by MHonArc 2.6.24.

Top of Page