net.sourceforge.jtds.jdbc
Class SQLParser

java.lang.Object
  |
  +--net.sourceforge.jtds.jdbc.SQLParser

class SQLParser
extends java.lang.Object

Process JDBC escape strings and parameter markers in the SQL string.

This code recognizes the following escapes:

  1. Date {d 'yyyy-mm-dd'}
  2. Time {t 'hh:mm:ss'}
  3. Timestamp {ts 'yyyy-mm-dd hh:mm:ss.nnn'}
  4. ESCAPE {escape 'x'}
  5. Function {fn xxxx([arg,arg...])} NB The concat(arg, arg) operator is converted to (arg + arg)
  6. OuterJoin {oj .....}
  7. Call {?=call proc [arg, arg...]} or {call proc [arg, arg...]}
Notes:
  1. This code is designed to be as efficient as possible and as result the validation done here is limited.
  2. SQL comments are parsed correctly thanks to code supplied by Joel Fouse.

Version:
$Id: SQLParser.java,v 1.19 2005/02/27 14:47:17 alin_sinpalean Exp $
Author:
Mike Hutchinson

Field Summary
private  ConnectionJDBC2 connection
          Connection object for server specific parsing.
private static java.util.HashMap cvMap
          Map of jdbc to server data types for convert
private  int d
          Current position in output buffer.
private static byte[] dateMask
          Syntax mask for date escape.
private static java.util.HashMap fnMap
          Map of jdbc to sybase function names.
private  char[] in
          Input buffer with SQL statement.
private  java.lang.String keyWord
          First SQL keyword or identifier in statement.
private  int len
          Length of input buffer.
private static java.util.HashMap msFnMap
          Map of jdbc to sql server function names.
private  char[] out
          Output buffer to contain parsed SQL.
private  java.util.ArrayList params
          Parameter list to be populated.
private  java.lang.String procName
          Procedure name in call escape.
private  int s
          Current position in input buffer.
private  java.lang.String tableName
          First table name in from clause
private  char terminator
          Current expected terminator character.
private static byte[] timeMask
          Syntax mask for time escape.
(package private) static byte[] timestampMask
          Syntax mask for timestamp escape.
 
Constructor Summary
(package private) SQLParser(java.lang.String sql, java.util.ArrayList paramList, ConnectionJDBC2 connection)
          Construct a new Parser object to process the supplied SQL.
 
Method Summary
(package private) static void ()
           
private  void callEscape()
          Process the JDBC {call procedure [(?,?,?)]} type escape.
private  java.lang.String copyKeyWord()
          Copy over possible SQL keyword eg 'SELECT'
private  void copyLiteral(java.lang.String txt)
          Insert a String literal in the output buffer.
private  void copyParam(java.lang.String name, int pos)
          Build a new parameter item.
private  java.lang.String copyParamName()
          Copy an embedded parameter name to the output buffer.
private  java.lang.String copyProcName()
          Copy an embedded stored procedure identifier over to the output buffer.
private  void copyString()
          Copy over an embedded string literal unchanged.
private  void dateEscape()
          Process the JDBC escape {d 'CCCC-MM-DD'}.
private  void escape()
          Process the JDBC escape sequences.
private  void functionEscape()
          Process the JDBC escape {fn function()}.
private  boolean getDateTimeField(byte[] mask)
          Utility routine to validate date and time escapes.
private  java.lang.String getTableName()
          Extract the first table name following the keyword FROM.
private  void likeEscape()
          Process the JDBC escape {escape 'X'}.
private  void mustbe(char c, boolean copy)
          Check that the next character is as expected.
private  void outerJoinEscape()
          Process the JDBC escape {oj left outer join etc}.
(package private)  java.lang.String[] parse(boolean extractTable)
          Parse the SQL statement processing JDBC escapes and parameter markers.
private  void skipMultiComments()
          Skip multi-line comments
private  void skipSingleComments()
          Skip single-line comments.
private  void skipWhiteSpace()
          Skip embedded white space.
private  void timeEscape()
          Process the JDBC escape {t 'HH:MM:SS'}.
private  void timestampEscape()
          Process the JDBC escape {ts 'CCCC-MM-DD HH:MM:SS[.NNN]'}.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, registerNatives, toString, wait, wait, wait
 

Field Detail

in

private char[] in
Input buffer with SQL statement.

s

private int s
Current position in input buffer.

len

private int len
Length of input buffer.

out

private char[] out
Output buffer to contain parsed SQL.

d

private int d
Current position in output buffer.

params

private java.util.ArrayList params
Parameter list to be populated.

terminator

private char terminator
Current expected terminator character.

procName

private java.lang.String procName
Procedure name in call escape.

keyWord

private java.lang.String keyWord
First SQL keyword or identifier in statement.

tableName

private java.lang.String tableName
First table name in from clause

connection

private ConnectionJDBC2 connection
Connection object for server specific parsing.

timeMask

private static final byte[] timeMask
Syntax mask for time escape.

dateMask

private static final byte[] dateMask
Syntax mask for date escape.

timestampMask

static final byte[] timestampMask
Syntax mask for timestamp escape.

fnMap

private static java.util.HashMap fnMap
Map of jdbc to sybase function names.

msFnMap

private static java.util.HashMap msFnMap
Map of jdbc to sql server function names.

cvMap

private static java.util.HashMap cvMap
Map of jdbc to server data types for convert
Constructor Detail

SQLParser

SQLParser(java.lang.String sql,
          java.util.ArrayList paramList,
          ConnectionJDBC2 connection)
Construct a new Parser object to process the supplied SQL.
Parameters:
sql - The SQL statement to parse.
paramList - The Parameter list array to populate.
Method Detail

copyLiteral

private void copyLiteral(java.lang.String txt)
Insert a String literal in the output buffer.
Parameters:
txt - The text to insert.

copyString

private void copyString()
Copy over an embedded string literal unchanged.

copyKeyWord

private java.lang.String copyKeyWord()
Copy over possible SQL keyword eg 'SELECT'

copyParam

private void copyParam(java.lang.String name,
                       int pos)
Build a new parameter item.
Parameters:
name - Optional parameter name or null.
pos - The parameter marker position in the output buffer.

copyProcName

private java.lang.String copyProcName()
                               throws java.sql.SQLException
Copy an embedded stored procedure identifier over to the output buffer.
Returns:
The identifier as a String.

copyParamName

private java.lang.String copyParamName()
Copy an embedded parameter name to the output buffer.
Returns:
The identifier as a String.

mustbe

private void mustbe(char c,
                    boolean copy)
             throws java.sql.SQLException
Check that the next character is as expected.
Parameters:
c - The expected character.
copy - True if found character should be copied.
Throws:
java.sql.SQLException - if expected characeter not found.

skipWhiteSpace

private void skipWhiteSpace()
Skip embedded white space.

skipSingleComments

private void skipSingleComments()
Skip single-line comments.

skipMultiComments

private void skipMultiComments()
Skip multi-line comments

callEscape

private void callEscape()
                 throws java.sql.SQLException
Process the JDBC {call procedure [(?,?,?)]} type escape.
Throws:
java.sql.SQLException -  

getDateTimeField

private boolean getDateTimeField(byte[] mask)
Utility routine to validate date and time escapes.
Parameters:
mask - The validation mask
Returns:
True if the escape was valid and processed OK.

timeEscape

private void timeEscape()
                 throws java.sql.SQLException
Process the JDBC escape {t 'HH:MM:SS'}.
Throws:
java.sql.SQLException -  

dateEscape

private void dateEscape()
                 throws java.sql.SQLException
Process the JDBC escape {d 'CCCC-MM-DD'}.
Throws:
java.sql.SQLException -  

timestampEscape

private void timestampEscape()
                      throws java.sql.SQLException
Process the JDBC escape {ts 'CCCC-MM-DD HH:MM:SS[.NNN]'}.
Throws:
java.sql.SQLException -  

outerJoinEscape

private void outerJoinEscape()
                      throws java.sql.SQLException
Process the JDBC escape {oj left outer join etc}.
Throws:
java.sql.SQLException -  

static void ()

functionEscape

private void functionEscape()
                     throws java.sql.SQLException
Process the JDBC escape {fn function()}.
Throws:
java.sql.SQLException -  

likeEscape

private void likeEscape()
                 throws java.sql.SQLException
Process the JDBC escape {escape 'X'}.
Throws:
java.sql.SQLException -  

escape

private void escape()
             throws java.sql.SQLException
Process the JDBC escape sequences.
Throws:
java.sql.SQLException -  

getTableName

private java.lang.String getTableName()
Extract the first table name following the keyword FROM.
Returns:
the table name as a String

parse

java.lang.String[] parse(boolean extractTable)
                   throws java.sql.SQLException
Parse the SQL statement processing JDBC escapes and parameter markers.
Parameters:
extractTable - true to return the first table name in the FROM clause of a select
Returns:
The processed SQL statement, any procedure name, the first SQL keyword and (optionally) the first table name as elements 0 1, 2 and 3 of the returned String[].
Throws:
java.sql.SQLException -  


Generated on April 15 2005