Index: Statement.cs =================================================================== --- Statement.cs (revision 8626) +++ Statement.cs (revision 8627) @@ -94,6 +94,8 @@ protected virtual void BindParameters() { + char parameterMarker = Parameters.ParameterMarker; + // tokenize the sql ArrayList tokenArray = TokenizeSql(ResolvedCommandText); @@ -115,7 +117,7 @@ stream = new MySqlStream(Driver.Encoding); continue; } - if (token[0] == Parameters.ParameterMarker) + if (token[0] == parameterMarker) { if (SerializeParameter(Parameters, stream, token)) continue; @@ -185,48 +187,49 @@ /// public ArrayList TokenizeSql(string sql) { - bool batch = Connection.Settings.AllowBatch & Driver.SupportsBatch; + bool batch = Connection.Settings.AllowBatch && Driver.SupportsBatch; + char parameterMarker = Connection.ParameterMarker; char delim = Char.MinValue; - StringBuilder sqlPart = new StringBuilder(); bool escaped = false; ArrayList tokens = new ArrayList(); - sql = sql.TrimStart(';').TrimEnd(';'); + sql = sql.Trim(';'); + + int startIndex = 0; for (int i = 0; i < sql.Length; i++) { char c = sql[i]; if (escaped) - escaped = !escaped; + escaped = false; else if (c == delim) delim = Char.MinValue; else if (c == ';' && !escaped && delim == Char.MinValue && !batch) { - tokens.Add(sqlPart.ToString()); + tokens.Add(sql.Substring(startIndex, i - startIndex)); tokens.Add(";"); - sqlPart.Remove(0, sqlPart.Length); + startIndex = i + 1; continue; } - else if ((c == '\'' || c == '\"' || c == '`') & !escaped & delim == Char.MinValue) + else if ((c == '\'' || c == '\"' || c == '`') && !escaped && delim == Char.MinValue) delim = c; else if (c == '\\') escaped = !escaped; - else if (c == Connection.ParameterMarker && delim == Char.MinValue && !escaped) + else if (c == parameterMarker && delim == Char.MinValue && !escaped) { - tokens.Add(sqlPart.ToString()); - sqlPart.Remove(0, sqlPart.Length); - } - else if (sqlPart.Length > 0 && sqlPart[0] == Connection.ParameterMarker && + tokens.Add(sql.Substring(startIndex, i - startIndex)); + startIndex = i; + } else if (i > startIndex && sql[startIndex] == parameterMarker && // sqlPart.Length > 0 && sqlPart[0] == parameterMarker !Char.IsLetterOrDigit(c) && c != '_' && c != '.' && c != '$' && - ((c != '@' && c != Connection.ParameterMarker) && - (c != '?' && c != Connection.ParameterMarker))) + ((c != '@' && c != parameterMarker) && + (c != '?' && c != parameterMarker))) { - tokens.Add(sqlPart.ToString()); - sqlPart.Remove(0, sqlPart.Length); + tokens.Add(sql.Substring(startIndex, i - startIndex)); + startIndex = i; } - sqlPart.Append(c); } - tokens.Add(sqlPart.ToString()); + + tokens.Add(sql.Substring(startIndex, sql.Length - startIndex)); return tokens; } }