on 2010 Apr 17 11:01 PM
I notice that ISQL is able to get the line number that an error was found on when running bad SQL. What ODBC API calls does it use to achieve this?
With other databases you would use a combination of SQLGetDiagRec and SQLGetDiagField. This doesn't seem to be the case for SQL Anywhere.
Thanks,
Error message from Interactive SQL... How does it know that the error is on line 4 column 1
While DBISQL does parse its input to determine the rudiments of the input SQL syntax, DBISQL has no idea precisely where an error in a statement or procedure occurred - only the server does. There is no specific mechanism for the server to return a line number or statement offset when an SQL statement is rejected, short of the error message itself. This is true with both JDBC/ODBC and with jConnect.
What you're seeing in DBISQL V7 is an estimate from DBISQL as to where the error occurred. That estimate, in your case, is simply the last line of the input. If you connect the V7 DBISQL client to a Version 11 server, try the following statement:
SELECT
*
FLUM
dept
and you'll see that DBISQL again reports the error on line 4, column 1 (the last line of the input) but the server message (properly) says
Error -131: Syntax error near 'flum' on line 3
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
FLUM is ANSI-compliant, is it not? Is it planned for a future version?
@Breck: That's why they are introducing the "reserved_keywords" option... cf. Glenn's article http://iablog.sybase.com/paulley/2010/04/keywords-and-upgrades 🙂
If using the iAnywhere Type 1 driver, which uses ODBC underneath JDBC, DBISQL (eventually) causes the issuing of an ODBC SQLGetDiagRecW() call (the "W" denoting the unicode version) to get error information on a statement. You can see this sequence if using the Type 1 JDBC driver and enable ODBC tracing. Here is an example:
In a DBISQL window, I code the (erroneous) procedure
create procedure foo (in x integer, in y integer )
begin
declare z integer;
declare bar cursor for select * from ;
select z = 50;
end
and press F9. The error "Syntax error near ';' on line 4" is returned to DBISQL. The ODBC trace reveals:
DBISQLG 41ec-40ac ENTER SQLPrepareW
HSTMT 04C12B58
WCHAR * 0x03371800 [ 137] "create procedure foo (in x integer, in y integer )\\ abegin \\ a declare z integer;\\ a declare bar cursor for select * from ;\\ a select z = 50;\\ aend"
SDWORD 137
DBISQLG 41ec-40ac EXIT SQLPrepareW with return code -1 (SQL_ERROR)
HSTMT 04C12B58
WCHAR * 0x03371800 [ 137] "create procedure foo (in x integer, in y integer )\\ abegin \\ a declare z integer;\\ a declare bar cursor for select * from ;\\ a select z = 50;\\ aend"
SDWORD 137
DIAG [42000] [Sybase][ODBC Driver][Adaptive Server Anywhere]Syntax error near ';' on line 4 (-131)
DBISQLG 41ec-40ac ENTER SQLGetDiagRecW
SQLSMALLINT 3
SQLHANDLE 04C12B58
SQLSMALLINT 1
SQLWCHAR * 0x04B7F28C (NYI)
SQLINTEGER * 0x04B7F288
SQLWCHAR * 0x04B7F29C (NYI)
SQLSMALLINT 1024
SQLSMALLINT * 0x04B7F298
DBISQLG 41ec-40ac EXIT SQLGetDiagRecW with return code 0 (SQL_SUCCESS)
SQLSMALLINT 3
SQLHANDLE 04C12B58
SQLSMALLINT 1
SQLWCHAR * 0x04B7F28C (NYI)
SQLINTEGER * 0x04B7F288 (-131)
SQLWCHAR * 0x04B7F29C (NYI)
SQLSMALLINT 1024
SQLSMALLINT * 0x04B7F298 (78)
DBISQLG 41ec-40ac ENTER SQLGetDiagRecW
SQLSMALLINT 3
SQLHANDLE 04C12B58
SQLSMALLINT 2
SQLWCHAR * 0x04B7F28C (NYI)
SQLINTEGER * 0x04B7F288
SQLWCHAR * 0x04B7F29C (NYI)
SQLSMALLINT 1024
SQLSMALLINT * 0x04B7F298
DBISQLG 41ec-40ac EXIT SQLGetDiagRecW with return code 100 (SQL_NO_DATA_FOUND)
SQLSMALLINT 3
SQLHANDLE 04C12B58
SQLSMALLINT 2
SQLWCHAR * 0x04B7F28C (NYI)
SQLINTEGER * 0x04B7F288
SQLWCHAR * 0x04B7F29C (NYI)
SQLSMALLINT 1024
SQLSMALLINT * 0x04B7F298
DBISQLG 41ec-40ac ENTER SQLFreeStmt
HSTMT 04C12B58
UWORD 3 <SQL_RESET_PARAMS>
The SQLGetDiagRecW() call returns the complete error message in the first call. The error message itself is generated by the server - there is no separate parameter returned that indicates the line number the error occurred on.
Note the (NYI) seemingly returned by ODBC is a result of using the unicode variant of SQLGetDiagRec() - the ODBC trace can't handle unicode arguments, so the output tends to get garbled in the trace.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
I see in newer version of SQL Anywhere that the line number is in the error message. I currently parse the error message to get this information. While testing on SQL Anywhere 7, I noticed that the line number was not in the error message. ISQL is still able to get the line number. This tells me that there is another way to get it. Maybe an SQL Anywhere function (not an ODBC function call).
User | Count |
---|---|
62 | |
10 | |
9 | |
6 | |
6 | |
6 | |
5 | |
5 | |
5 | |
4 |
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.