internal static List <string> GetColumnList(char[] sql, Word wColumns) { List <string> columnList = new List <string>(); List <StrSpan> tokenList = StrUtil.Split(sql, wColumns.iLeft, wColumns.iRight, ','); char cLeft; char cRight; StrSpan s; for (int i = 0; i < tokenList.Count; i++) { s = tokenList[i]; if (s.isEmpty) { throw new SelectDataTableException("列名 不能 为空 。 ", sql, s.iLeft); } s = StrUtil.Trim(sql, s.iLeft, s.iRight, Parser._whiteSpaces); if (s.isEmpty) { throw new SelectDataTableException("列名 不能 为空 。 ", sql, s.iLeft); } cLeft = sql[s.iLeft]; if (s.iLeft == s.iRight && (cLeft == '[' || cLeft == ']')) { throw new SelectDataTableException("无效的 列名 \"" + cLeft + "\" 。 ", sql, s.iLeft); } cRight = sql[s.iRight]; if (cLeft == '[' && cRight == ']') { if (s.iLeft == s.iRight - 1) { throw new SelectDataTableException("列名 不能 为空 。 ", sql, s.iLeft); } s = StrUtil.Trim(sql, s.iLeft + 1, s.iRight - 1, Parser._whiteSpaces); if (s.isEmpty) { throw new SelectDataTableException("列名 不能 为空 。 ", sql, s.iLeft); } columnList.Add(new string(sql, s.iLeft, s.iRight - s.iLeft + 1)); } else if (cLeft == '[' && cRight != ']') { throw new SelectDataTableException("中括号 [] 未成对出现 。 ", sql, s.iLeft); } else if (cLeft != '[' && cRight == ']') { throw new SelectDataTableException("中括号 [] 未成对出现 。 ", sql, s.iRight); } else { s = StrUtil.Trim(sql, s.iLeft, s.iRight, Parser._whiteSpaces); columnList.Add(new string(sql, s.iLeft, s.iRight - s.iLeft + 1)); } } return(columnList); }
internal static Word GetKeyword(char[] sql, int beginIndex, int beginWordIndex, List <Word> wordList, string keyword, out int wordIndex, bool throwException) { //Word word = wordList[0]; //if ( word.Type != WordType.NonWrapped ) //{ // throw new Exception("Sql 语句 应以 select 关键字 开始。"); //} int i; int j; int iLeft = -1; int iRight = 0; Word w; wordIndex = beginWordIndex; for (i = beginWordIndex; i < wordList.Count; i++) { wordIndex = i; w = wordList[i]; if (w.type != WordType.NonWrapped) { continue; } if (beginIndex > w.iRight) { continue; } j = beginIndex < w.iLeft ? w.iLeft : beginIndex; iLeft = StrUtil.FindForward(sql, j, w.iRight, keyword); if (iLeft != -1) { iRight = iLeft + keyword.Length - 1; // 判断 关键字 的 两边 是否是 空格, 关键字 的 两边 应该是 空格 才是 合法的 关键字 // 但是, 如果 两边 和 包裹符号 () [] '' 相邻 的 话 , 也是 合法 的 关键字 // 因为 GetWordList() 是 按 是否 被 () [] '' 包裹 来 划分 Word 块 的 // 所以 如果 关键字 的 最左边 的 字符 就是 Word 块 的 最左边 字符 的话, 这是合法的, // 因为 这样 要么 是 sql 字符串 的 首字符(index == 0), // 要么 就是 左边相邻 的 Word 块 是 一个 被 () [] '' 包裹的 Word 块 (w.Type == WordType.Wrapped) // 右边 也 同样 。 if ( ( iLeft == w.iLeft || (iLeft > 0 && StrUtil.IsOneOf(sql[iLeft - 1], Parser._whiteSpaces)) ) && ( iRight == w.iRight || ((iRight < sql.Length - 1) && StrUtil.IsOneOf(sql[iRight + 1], Parser._whiteSpaces)) ) ) { break; } } } //if (iLeft == -1) // throw new Exception("找不到合法的 关键字 \"" + keyword + "\"。 注意 关键字 不能包含在 () [] '' 中。"); if (iLeft == -1) { if (throwException) { throw new Exception("找不到合法的 关键字 \"" + keyword + "\"。 注意 关键字 不能包含在 () [] '' 中。"); } else { return(null); } } return(new Word(iLeft, iRight, WordType.NonWrapped)); }
private static StrSpan GetContent小括号(char[] sql, StrSpan s) { char cLeft = sql[s.iLeft]; char cRight = sql[s.iRight]; if (s.iLeft == s.iRight) { throw new SelectDataTableException("无效的 小括号, 缺少 结束小括号 。 ", sql, s.iLeft); } if (s.iRight == s.iLeft + 1) { if (cRight == ')') { s = new StrSpan(s.iLeft, s.iRight); s.isEmpty = true; return(s); } else { throw new SelectDataTableException("无效的 小括号, 缺少 结束小括号 。 ", sql, s.iRight); } } int i = FindWrapperEnd小括号(sql, s.iLeft, s.iRight); if (i == -1) { throw new SelectDataTableException("无效的 小括号, 缺少 结束小括号 。 ", sql, s.iRight); } if (i < s.iRight) { throw new SelectDataTableException("语法错误。存在无效的字符 。 ", sql, i + 1); } s = StrUtil.Trim(sql, s.iLeft + 1, s.iRight - 1, _whiteSpaces); // 去掉 小括号 并 对 内容 Trim return(s); //if ( s.isEmpty ) //{ // s = new StrSpan(s.iLeft, s.iRight); // s.isEmpty = true; // return s; //} //i = s.iLeft; //int j = s.iRight; //while (true) //{ // if (sql[i] == '(' && sql[j] == ')') // { // if (i + 1 == j) // { // s = new StrSpan(i, j); // s.isEmpty = true; // return s; // } // if (i + 1 <= j - 1) // { // i++; // j--; // } // } // else // { // break; // } // //return GetContent小括号(sql, s); // 去掉 重复 括号 //} //return new StrSpan(s.iLeft, s.iRight); }
private static int FindWrapper(char[] sql, int beginIndex, int endIndex, char[] wrapperList) { return(StrUtil.FindForward(sql, beginIndex, endIndex, wrapperList)); }
public static Content GetContent(char[] sql, int beginIndex, int endIndex) { if (beginIndex > endIndex) { throw new SelectDataTableException("beginIndex 应 小于等于 endIndex 。 beginIndex : " + beginIndex + " endIndex : " + endIndex + " 。 ", sql, beginIndex); } StrSpan s = StrUtil.Trim(sql, beginIndex, endIndex, Parser._whiteSpaces); Content content; if (s.isEmpty) { content = new Content(s.iLeft, s.iRight, ContentType.None); content.isEmpty = true; return(content); } char cLeft = sql[s.iLeft]; char cRight = sql[s.iRight]; if (cLeft == '\'') { s = GetContent单引号(sql, s); content = new Content(s.iLeft, s.iRight, ContentType.String); if (s.isEmpty) { content.isEmpty = true; } return(content); } else if (cLeft == '[') { s = GetContent中括号(sql, s); } else if (cLeft == '(') { s = GetContent小括号(sql, s); content = new Content(s.iLeft, s.iRight, ContentType.Express); if (s.isEmpty) { content.isEmpty = true; } return(content); } if (StrUtil.IsNumber(sql[s.iLeft])) { return(new Content(s.iLeft, s.iRight, ContentType.Number)); } return(new Content(s.iLeft, s.iRight, ContentType.Column)); //throw new Exception("语法错误。 在 第 " + s.iLeft + " 个 字符 \"" + sql[s.iLeft] + "\" 。"); }