Class SqlParseUtils


  • public class SqlParseUtils
    extends java.lang.Object
    Provides utility methods for parsing SQL scripts and statements. Various utility methods might used to parse SQL scripts or particular SQL statements. Supports syntax of all existing (February 2020) SQL standards.
    • Constructor Summary

      Constructors 
      Constructor Description
      SqlParseUtils()  
    • Method Summary

      All Methods Static Methods Concrete Methods 
      Modifier and Type Method Description
      static java.lang.String canonizeSql​(java.lang.String sql)
      Canonize SQL statement for compare (startsWith) E.g.
      private static java.lang.String extractClause​(javax.servlet.ServletConfig servletConfig, java.lang.String sql, java.lang.String clause)
      Extract particular clause value from SQL statement
      (package private) static boolean extractClauseAsBoolean​(javax.servlet.ServletConfig servletConfig, java.lang.String sql, java.lang.String clause)
      Extract particular clause value from SQL statement
      (package private) static java.lang.Integer extractClauseAsInt​(javax.servlet.ServletConfig servletConfig, java.lang.String sql, java.lang.String clause)
      Extract particular clause value from SQL statement
      (package private) static java.util.List<java.lang.Object> extractClauseAsList​(javax.servlet.ServletConfig servletConfig, java.lang.String sql, java.lang.String clause)
      Extract particular clause value from SQL statement
      (package private) static java.util.List<java.lang.String> extractClauseAsListOfStrings​(javax.servlet.ServletConfig servletConfig, java.lang.String sql, java.lang.String clause)
      Extract particular clause value from SQL statement
      static java.lang.String extractClauseAsString​(javax.servlet.ServletConfig servletConfig, java.lang.String sql, java.lang.String clause)
      Extract particular clause value from SQL statement
      static int indexOf​(java.lang.String sql, java.lang.String token)
      Returns the index within SQL string of the first occurrence of the specified token.
      static ParseStmtConnectTo.StmtConnectTo parseConnectStatement​(javax.servlet.ServletConfig servletConfig, java.lang.String sql)
      Parse CONNECT statement
      static void parseDeclareProcedureStatement​(javax.servlet.ServletConfig servletConfig, java.lang.String sql, java.util.Map<java.lang.String,​NonNativeProcedure> proceduresMap)
      Parse DECLARE PROCEDURE statement
      static ParseStmtDeclareStatement.StmtDeclareStatement parseExposeStatement​(javax.servlet.ServletConfig servletConfig, java.lang.String sql)
      Parse EXPOSE statement
      static java.util.Map<java.lang.String,​java.util.List<java.lang.Integer>> parseNamedPreparedStatement​(java.lang.String sql, java.lang.StringBuilder resultSQL)
      Parse named prepared statement and return parameter name to index map and replace host variables with '?' character to provide standard prepared statement form
      static void parseScheduleStatement​(javax.servlet.ServletConfig servletConfig, java.lang.String sql, java.util.Map<java.lang.String,​java.util.List<java.lang.String>> schedulersMap)
      Parse SCHEDULE statement
      private static void processIncludes​(java.nio.file.Path path, java.util.List<java.lang.String> list)
      Recursive method to process "INCLUDE SCRIPT FILE" statement
      private static void processInitSqlFile​(java.nio.file.Path path, java.util.Map<java.lang.String,​java.util.List<java.lang.String>> sqlStatementsMap, java.util.Map<java.lang.String,​java.lang.String> parentDirectoryMap)
      Read 'init.sql' file, process 'includes', iterate record by record and divide it by instance name to map
      static void processInitSqlFiles​(java.io.File file, java.util.Map<java.lang.String,​java.util.List<java.lang.String>> sqlStatementsMap, java.util.Map<java.lang.String,​java.lang.String> parentDirectoryMap)
      Iterate directory recursive, find 'init.sql' files, and process them.
      static java.lang.String processStatement​(java.lang.String sql)
      Process SQL statement
      private static void readSqlScriptToList​(java.lang.String sqlScript, java.util.List<java.lang.String> list)
      Parse SQL script by splitting it on SQL statements Standard semicolon character «;» is used as statement separator.
      private static void separateSqlFile​(java.nio.file.Path path, java.util.List<java.lang.String> list, java.util.Map<java.lang.String,​java.util.List<java.lang.String>> map, java.util.Map<java.lang.String,​java.lang.String> parentDirectoryMap)
      Read 'init.sql' file record by record and divide it by instance name to map
      private static java.lang.String stripBlockComments​(java.lang.String sql)
      Remove the comments from SQL statement, if exists.
      (package private) static java.lang.String stripComments​(java.lang.String sql)
      Remove the comments from SQL statement, if exists.
      private static java.lang.String stripLineComments​(java.lang.String sql)
      Remove the comments from SQL statement, if exists.
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Method Detail

      • indexOf

        public static int indexOf​(java.lang.String sql,
                                  java.lang.String token)
        Returns the index within SQL string of the first occurrence of the specified token. If a token with value token occurs in the character sequence represented by SQL string sql, then the index of the first such occurrence is returned. This index is the smallest value i such that:
         sql.charAt(i) == token[0]
         
        is true.
        Parameters:
        sql - a SQL string.
        token - to search
        Returns:
        the index of the first occurrence of the token in the SQL string, or -1 if the token does not occur.
      • parseConnectStatement

        public static ParseStmtConnectTo.StmtConnectTo parseConnectStatement​(javax.servlet.ServletConfig servletConfig,
                                                                             java.lang.String sql)
        Parse CONNECT statement
        Parameters:
        sql - - CONNECT statement
        info - - ConnectionInfo Transfer object
      • parseDeclareProcedureStatement

        public static void parseDeclareProcedureStatement​(javax.servlet.ServletConfig servletConfig,
                                                          java.lang.String sql,
                                                          java.util.Map<java.lang.String,​NonNativeProcedure> proceduresMap)
        Parse DECLARE PROCEDURE statement
        Parameters:
        sql - - DECLARE PROCEDURE statement
        proceduresMap - - procedures Map for specific stored procedure name
      • parseScheduleStatement

        public static void parseScheduleStatement​(javax.servlet.ServletConfig servletConfig,
                                                  java.lang.String sql,
                                                  java.util.Map<java.lang.String,​java.util.List<java.lang.String>> schedulersMap)
        Parse SCHEDULE statement
        Parameters:
        sql - - SCHEDULE statement
        schedulersMap - - Schedulers Map for specific SQL stored procedures
      • extractClauseAsList

        static java.util.List<java.lang.Object> extractClauseAsList​(javax.servlet.ServletConfig servletConfig,
                                                                    java.lang.String sql,
                                                                    java.lang.String clause)
        Extract particular clause value from SQL statement
        Parameters:
        sql - - source SQL statement (trimmed)
        clause - - clause to search (trimmed)
        Returns:
        - clause value
      • extractClauseAsListOfStrings

        static java.util.List<java.lang.String> extractClauseAsListOfStrings​(javax.servlet.ServletConfig servletConfig,
                                                                             java.lang.String sql,
                                                                             java.lang.String clause)
        Extract particular clause value from SQL statement
        Parameters:
        sql - - source SQL statement (trimmed)
        clause - - clause to search (trimmed)
        Returns:
        - clause value
      • extractClauseAsString

        public static java.lang.String extractClauseAsString​(javax.servlet.ServletConfig servletConfig,
                                                             java.lang.String sql,
                                                             java.lang.String clause)
        Extract particular clause value from SQL statement
        Parameters:
        sql - - source SQL statement (trimmed)
        clause - - clause to search (trimmed)
        Returns:
        - clause value
      • extractClauseAsInt

        static java.lang.Integer extractClauseAsInt​(javax.servlet.ServletConfig servletConfig,
                                                    java.lang.String sql,
                                                    java.lang.String clause)
        Extract particular clause value from SQL statement
        Parameters:
        sql - - source SQL statement (trimmed)
        clause - - clause to search (trimmed)
        Returns:
        - clause value
      • extractClauseAsBoolean

        static boolean extractClauseAsBoolean​(javax.servlet.ServletConfig servletConfig,
                                              java.lang.String sql,
                                              java.lang.String clause)
        Extract particular clause value from SQL statement
        Parameters:
        sql - - source SQL statement (trimmed)
        clause - - clause to search (trimmed)
        Returns:
        - clause value
      • extractClause

        private static java.lang.String extractClause​(javax.servlet.ServletConfig servletConfig,
                                                      java.lang.String sql,
                                                      java.lang.String clause)
        Extract particular clause value from SQL statement
        Parameters:
        sql - - source SQL statement (trimmed)
        clause - - clause to search (trimmed)
        Returns:
        - clause value
      • stripComments

        static java.lang.String stripComments​(java.lang.String sql)
        Remove the comments from SQL statement, if exists. Multiline line (block) comments (start: «/*», stop: «*​/») Single line comments (start: «--», stop: «\n»)
        Parameters:
        sql - a SQL string with comments.
        Returns:
        a SQL string without comments
      • stripLineComments

        private static java.lang.String stripLineComments​(java.lang.String sql)
        Remove the comments from SQL statement, if exists. Multiline line (block) comments (start: «/*», stop: «*​/») Single line comments (start: «--», stop: «\n»)
        Parameters:
        sql - a SQL string with comments.
        Returns:
        a SQL string without comments
      • stripBlockComments

        private static java.lang.String stripBlockComments​(java.lang.String sql)
        Remove the comments from SQL statement, if exists. Multiline line (block) comments (start: «/*», stop: «*​/») Single line comments (start: «--», stop: «\n»)
        Parameters:
        sql - a SQL string with comments.
        Returns:
        a SQL string without comments
      • processStatement

        public static java.lang.String processStatement​(java.lang.String sql)
        Process SQL statement
        Parameters:
        sql - - SQL statement
        Returns:
        - processed SQL statement
      • parseNamedPreparedStatement

        public static java.util.Map<java.lang.String,​java.util.List<java.lang.Integer>> parseNamedPreparedStatement​(java.lang.String sql,
                                                                                                                          java.lang.StringBuilder resultSQL)
        Parse named prepared statement and return parameter name to index map and replace host variables with '?' character to provide standard prepared statement form
        Parameters:
        sql - - named prepared statement
        resultSQL - - standard prepared statement
        Returns:
        map parameter name to index (indexes starts from 1)
      • readSqlScriptToList

        private static void readSqlScriptToList​(java.lang.String sqlScript,
                                                java.util.List<java.lang.String> list)
                                         throws java.io.IOException
        Parse SQL script by splitting it on SQL statements Standard semicolon character «;» is used as statement separator. This method also: - compress row(s) of each SQL statement by removing ambiguous trailing white spaces characters. - remove trailing statement separator «;»
        Parameters:
        sqlScript - - SQL script to parse
        list - - list of all presented in script SQL statements (output parameter)
        Throws:
        java.io.IOException
      • processIncludes

        private static void processIncludes​(java.nio.file.Path path,
                                            java.util.List<java.lang.String> list)
                                     throws java.io.IOException
        Recursive method to process "INCLUDE SCRIPT FILE" statement
        Parameters:
        path - - path to SQL script to parse
        list - - list of all presented in script SQL statements with injected includes (output parameter)
        Throws:
        java.io.IOException
      • separateSqlFile

        private static void separateSqlFile​(java.nio.file.Path path,
                                            java.util.List<java.lang.String> list,
                                            java.util.Map<java.lang.String,​java.util.List<java.lang.String>> map,
                                            java.util.Map<java.lang.String,​java.lang.String> parentDirectoryMap)
                                     throws java.io.IOException
        Read 'init.sql' file record by record and divide it by instance name to map
        Parameters:
        path -
        map -
        Throws:
        java.io.IOException
      • processInitSqlFiles

        public static void processInitSqlFiles​(java.io.File file,
                                               java.util.Map<java.lang.String,​java.util.List<java.lang.String>> sqlStatementsMap,
                                               java.util.Map<java.lang.String,​java.lang.String> parentDirectoryMap)
                                        throws java.io.IOException
        Iterate directory recursive, find 'init.sql' files, and process them.
        Parameters:
        path -
        sqlStatementsMap -
        Throws:
        java.io.IOException
      • processInitSqlFile

        private static void processInitSqlFile​(java.nio.file.Path path,
                                               java.util.Map<java.lang.String,​java.util.List<java.lang.String>> sqlStatementsMap,
                                               java.util.Map<java.lang.String,​java.lang.String> parentDirectoryMap)
                                        throws java.io.IOException
        Read 'init.sql' file, process 'includes', iterate record by record and divide it by instance name to map
        Parameters:
        path -
        sqlStatementsMap -
        Throws:
        java.io.IOException
      • canonizeSql

        public static java.lang.String canonizeSql​(java.lang.String sql)
        Canonize SQL statement for compare (startsWith) E.g. "connect to" - > "CONNECTTO"
        Parameters:
        sql -
        Returns: