Fix ? conversion to $x for having and join args

This commit is contained in:
Patrick O'brien 2016-08-13 03:59:50 +10:00
parent 4b27cea3a6
commit 7517ad3ced
3 changed files with 19 additions and 32 deletions

View file

@ -1 +1 @@
SELECT "videos".* FROM "videos" INNER JOIN (select id from users where deleted = ?) u on u.id = videos.user_id WHERE (videos.deleted = $2);
SELECT "videos".* FROM "videos" INNER JOIN (select id from users where deleted = $1) u on u.id = videos.user_id WHERE (videos.deleted = $2);

View file

@ -1 +1 @@
SELECT * FROM "a" WHERE (a=$1 or b=$2) AND (c=$3) GROUP BY id, name HAVING id <> ?, length(name, ?) > ?;
SELECT * FROM "a" WHERE (a=$1 or b=$2) AND (c=$3) GROUP BY id, name HAVING id <> $4, length(name, $5) > $6;

View file

@ -34,6 +34,7 @@ func buildQuery(q *Query) (string, []interface{}) {
func buildSelectQuery(q *Query) (*bytes.Buffer, []interface{}) {
buf := &bytes.Buffer{}
var args []interface{}
buf.WriteString("SELECT ")
@ -64,13 +65,17 @@ func buildSelectQuery(q *Query) (*bytes.Buffer, []interface{}) {
fmt.Fprintf(buf, " FROM %s", strings.Join(strmangle.IdentQuoteSlice(q.from), ", "))
var args []interface{}
for _, j := range q.joins {
if j.kind != JoinInner {
panic("only inner joins are supported")
if len(q.joins) > 0 {
argsLen := len(args)
joinBuf := &bytes.Buffer{}
for _, j := range q.joins {
if j.kind != JoinInner {
panic("only inner joins are supported")
}
fmt.Fprintf(joinBuf, " INNER JOIN %s", j.clause)
args = append(args, j.args...)
}
fmt.Fprintf(buf, " INNER JOIN %s", j.clause)
args = append(args, j.args...)
fmt.Fprintf(buf, convertQuestionMarks(joinBuf.String(), argsLen+1))
}
where, whereArgs := whereClause(q, len(args)+1)
@ -144,14 +149,17 @@ func writeModifiers(q *Query, buf *bytes.Buffer, args *[]interface{}) {
}
if len(q.having) != 0 {
fmt.Fprintf(buf, " HAVING ")
argsLen := len(*args)
havingBuf := &bytes.Buffer{}
fmt.Fprintf(havingBuf, " HAVING ")
for i, j := range q.having {
if i > 0 {
fmt.Fprintf(buf, ", ")
fmt.Fprintf(havingBuf, ", ")
}
fmt.Fprintf(buf, j.clause)
fmt.Fprintf(havingBuf, j.clause)
*args = append(*args, j.args...)
}
fmt.Fprintf(buf, convertQuestionMarks(havingBuf.String(), argsLen+1))
}
if len(q.orderBy) != 0 {
@ -244,27 +252,6 @@ func whereClause(q *Query, startAt int) (string, []interface{}) {
}
}
whereStr := buf.String()
paramBuf := &bytes.Buffer{}
paramIndex := 0
for counter := 1; ; counter++ {
if paramIndex >= len(whereStr) {
break
}
whereStr = whereStr[paramIndex:]
paramIndex = strings.IndexByte(whereStr, '?')
if paramIndex == -1 {
paramBuf.WriteString(whereStr)
break
}
paramBuf.WriteString(whereStr[:paramIndex] + fmt.Sprintf("$%d", counter))
paramIndex++
}
return convertQuestionMarks(buf.String(), startAt), args
}