QueryConn queries a SQL statement in a given connection.
(ctx context.Context, _ *sql.Conn, statement string, queryContext db.QueryContext)
| 110 | |
| 111 | // QueryConn queries a SQL statement in a given connection. |
| 112 | func (d *Driver) QueryConn(ctx context.Context, _ *sql.Conn, statement string, queryContext db.QueryContext) ([]*v1pb.QueryResult, error) { |
| 113 | // For BigQuery, interpret Explain as dry run (BigQuery doesn't support EXPLAIN) |
| 114 | if queryContext.Explain { |
| 115 | return d.dryRunQuery(ctx, statement, queryContext) |
| 116 | } |
| 117 | |
| 118 | statements, err := util.SanitizeSQL(statement) |
| 119 | if err != nil { |
| 120 | return nil, err |
| 121 | } |
| 122 | |
| 123 | var results []*v1pb.QueryResult |
| 124 | for _, statement := range statements { |
| 125 | startTime := time.Now() |
| 126 | queryResult, err := func() (*v1pb.QueryResult, error) { |
| 127 | if util.IsSelect(statement) { |
| 128 | if queryContext.Limit > 0 { |
| 129 | statement = getStatementWithResultLimit(statement, queryContext.Limit) |
| 130 | } |
| 131 | q := d.client.Query(statement) |
| 132 | if queryContext.OperatorEmail != "" { |
| 133 | q.Labels = map[string]string{"operator_email": encodeOperatorEmail(queryContext.OperatorEmail)} |
| 134 | } |
| 135 | q.DefaultDatasetID = d.databaseName |
| 136 | it, err := q.Read(ctx) |
| 137 | if err != nil { |
| 138 | return nil, err |
| 139 | } |
| 140 | |
| 141 | result := &v1pb.QueryResult{} |
| 142 | readOnce := false |
| 143 | var fieldTypes []bigquery.FieldType |
| 144 | for { |
| 145 | var values []bigquery.Value |
| 146 | err := it.Next(&values) |
| 147 | if err == iterator.Done { |
| 148 | break |
| 149 | } |
| 150 | if err != nil { |
| 151 | return nil, err |
| 152 | } |
| 153 | |
| 154 | // Get schema columns. |
| 155 | if !readOnce { |
| 156 | readOnce = true |
| 157 | for _, s := range it.Schema { |
| 158 | result.ColumnNames = append(result.ColumnNames, s.Name) |
| 159 | result.ColumnTypeNames = append(result.ColumnTypeNames, string(s.Type)) |
| 160 | fieldTypes = append(fieldTypes, s.Type) |
| 161 | } |
| 162 | } |
| 163 | |
| 164 | row := &v1pb.QueryRow{} |
| 165 | for i, v := range values { |
| 166 | row.Values = append(row.Values, convertValue(v, fieldTypes[i])) |
| 167 | } |
| 168 | result.Rows = append(result.Rows, row) |
| 169 | n := len(result.Rows) |
nothing calls this directly
no test coverage detected