database/sql: check NumInput on Stmt.Exec

Fixes #3678.

R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/6460087
diff --git a/src/pkg/database/sql/sql.go b/src/pkg/database/sql/sql.go
index e7c7780..31fc830 100644
--- a/src/pkg/database/sql/sql.go
+++ b/src/pkg/database/sql/sql.go
@@ -369,16 +369,7 @@
 	}
 	defer sti.Close()
 
-	dargs, err := driverArgs(sti, args)
-	if err != nil {
-		return nil, err
-	}
-
-	resi, err := sti.Exec(dargs)
-	if err != nil {
-		return nil, err
-	}
-	return result{resi}, nil
+	return resultFromStatement(sti, args...)
 }
 
 // Query executes a query that returns rows, typically a SELECT.
@@ -608,16 +599,7 @@
 	}
 	defer sti.Close()
 
-	dargs, err := driverArgs(sti, args)
-	if err != nil {
-		return nil, err
-	}
-
-	resi, err := sti.Exec(dargs)
-	if err != nil {
-		return nil, err
-	}
-	return result{resi}, nil
+	return resultFromStatement(sti, args...)
 }
 
 // Query executes a query that returns rows, typically a SELECT.
@@ -682,6 +664,10 @@
 	}
 	defer releaseConn(nil)
 
+	return resultFromStatement(si, args...)
+}
+
+func resultFromStatement(si driver.Stmt, args ...interface{}) (Result, error) {
 	// -1 means the driver doesn't know how to count the number of
 	// placeholders, so we won't sanity check input here and instead let the
 	// driver deal with errors.