Take the 2-minute tour ×
Stack Overflow is a question and answer site for professional and enthusiast programmers. It's 100% free, no registration required.

I'm doing a select in Go using the database/sql package and the pq Postgres driver:

rows, err := db.Query("SELECT (name, age) FROM people WHERE id = 1")

I tried retrieving the values in the normal way:

rows.Next()
name := ""
age := 0
err = rows.Scan(&name, &age)

but I got the error:

sql: expected 1 destination arguments in Scan, not 2

The documentation for sql.(*Rows).Scan says that you can pass a byte slice pointer and it will be filled with the raw results. So I did this:

b := make([]byte, 1024*1024)
rows.Scan(&b)
fmt.Println(string(b))

which succeeded, printing:

(John,18)

So I looked at the source code for sql.(*Rows).Scan, and it turns out that the error is returned if the number of arguments doesn't match the number of results returned by the database driver (which makes sense). So, for some reason, the pq driver seems to be returning the result set as a single value. Why would this be?

share|improve this question
4  
Remove the parentheses around the columns in the select list. SELECT (name, age) returns a single record (an anonymous composite type), but SELECT name, age will return two columns –  a_horse_with_no_name Jan 6 at 22:45
    
Ooooooh thanks! –  joshlf13 Jan 6 at 23:38
    
Is this a Postgres-only feature? –  joshlf13 Jan 6 at 23:41
    
@joshlf13 You'd probably need to look into the standard to find out, and it's "fun" reading. I think the standard supports it for things like UPDATE ... SET (a, b) = (x, y), and PostgreSQL has just generalized that by treating (a,b) as shorthand for ROW(a,b). –  Craig Ringer Jan 7 at 0:15
    
Ahhhh ok. Cool. –  joshlf13 Jan 7 at 1:07
add comment

1 Answer

Thanks to a_horse_with_no_name for the right answer! I'm posting it here for ... posterity?

In Postgres, doing SELECT (a, b) with parentheses returns a single record, which is an anonymous composite type. Removing the parentheses will return the columns individually: Select a, b.

share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.