From 7f328975cd101c8c8b992860d5a917546a47adaf Mon Sep 17 00:00:00 2001 From: Francisco Obispo Date: Wed, 9 Nov 2016 17:05:21 -0800 Subject: [PATCH] When using the LogMode(true), the SQL produced during the log message, places the bounded variables in the wrong location, this is due to the fact that the current implementation splits the values with a regex similar to: ($\d+)|?. That works well for ? placeholders because they should be replaced in order. However, the numeric placeholders should be replaced based on their value, for instance: SELECT name,last FROM contact WHERE name=$2 and age=$1 Should NOT be replaced in order, because it will yield an incorrectly formed SQL command, which is not very useful for debugging. Fixes issue: #1249 --- logger.go | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/logger.go b/logger.go index 2c4ccbbc..4f312087 100644 --- a/logger.go +++ b/logger.go @@ -12,8 +12,9 @@ import ( ) var ( - defaultLogger = Logger{log.New(os.Stdout, "\r\n", 0)} - sqlRegexp = regexp.MustCompile(`(\$\d+)|\?`) + defaultLogger = Logger{log.New(os.Stdout, "\r\n", 0)} + sqlRegexp = regexp.MustCompile(`\?`) + numericPlaceHolderRegexp = regexp.MustCompile(`\$\d+`) ) type logger interface { @@ -71,11 +72,21 @@ func (logger Logger) Print(values ...interface{}) { } } - var formattedValuesLength = len(formattedValues) - for index, value := range sqlRegexp.Split(values[3].(string), -1) { - sql += value - if index < formattedValuesLength { - sql += formattedValues[index] + // differentiate between $n placeholders or else treat like ? + if numericPlaceHolderRegexp.MatchString(values[3].(string)) { + sql = values[3].(string) + for index, value := range formattedValues { + placeholder := fmt.Sprintf(`\$%d`, index+1) + subre := regexp.MustCompile(placeholder) + sql = subre.ReplaceAllString(sql, value) + } + } else { + var formattedValuesLength = len(formattedValues) + for index, value := range sqlRegexp.Split(values[3].(string), -1) { + sql += value + if index < formattedValuesLength { + sql += formattedValues[index] + } } }