From de93953303db3a8cadcde8f09289a81e6576d7b8 Mon Sep 17 00:00:00 2001 From: 王彬 Date: Fri, 25 Dec 2020 19:18:54 +0800 Subject: [PATCH] fix a bug about core sql split --- src/main/java/com/taover/repository/UtilsSql.java | 113 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------------------- 1 file changed, 69 insertions(+), 44 deletions(-) diff --git a/src/main/java/com/taover/repository/UtilsSql.java b/src/main/java/com/taover/repository/UtilsSql.java index 154da98..79d4d78 100644 --- a/src/main/java/com/taover/repository/UtilsSql.java +++ b/src/main/java/com/taover/repository/UtilsSql.java @@ -2,6 +2,7 @@ package com.taover.repository; import java.util.HashMap; import java.util.Map; +import java.util.Stack; import org.springframework.util.StringUtils; @@ -9,62 +10,80 @@ public class UtilsSql { public static String[] splitCoreSql(String coreSql) throws Exception { //去除''内的信息 - String coreSqlRemoveQuate = replaceSelectAndFromBetweenTopCornerMark(coreSql.toUpperCase()); - int fromIndex = calcFromIndex(coreSqlRemoveQuate); + int fromIndex = calcFromIndex(coreSql); if(fromIndex > -1) { return new String[] {coreSql.substring(0, fromIndex), coreSql.substring(fromIndex, coreSql.length())}; }else { throw new Exception("未找到FROM子句"); } } - - private static int calcFromIndex(String coreSqlUpper) { - //计算位置 - int selectSubSqlNum = 0; - int currWindowIndex = 0; - for(currWindowIndex=0; (currWindowIndex+6) operStack = new Stack(); + String coreSqlUpperCase = coreSql.toUpperCase(); + int sqlLen = coreSqlUpperCase.length(); + int currIndex = 0; + while(currIndex < sqlLen) { + String originContainBlank = subFirstStrEndWithBlank(coreSqlUpperCase, currIndex); + String itemWithoutBlank = originContainBlank.trim(); + if("".equals(itemWithoutBlank)) { + currIndex += originContainBlank.length(); + continue; } - ++currWindowIndex; + if(operStack.isEmpty() && "FROM".equals(itemWithoutBlank)) { + return currIndex; + } + dealCoupleMark(itemWithoutBlank, operStack); + currIndex += originContainBlank.length(); } return -1; } - - private static String replaceSelectAndFromBetweenTopCornerMark(String sql) { - StringBuffer result = new StringBuffer(); - boolean isBetweenMark = false; - int iMark = 0; - int currIndex = 0; - for(currIndex=0; currIndex operStack) { + char preChar = ' '; + for(int i=0; i -1) { - result.append(sql.substring(iMark, currIndex)); - } - return result.toString(); } - + + private static String subFirstStrEndWithBlank(String coreSqlUpperCase, int startIndex) { + boolean startWithBlank = coreSqlUpperCase.charAt(startIndex)==' '; + int endIndex = startIndex; + int sqlLen = coreSqlUpperCase.length(); + char preChar = '0'; + for(int i=startIndex; i