Query executes a query that may return rows, such as a SELECT
(args []driver.Value)
| 226 | |
| 227 | // Query executes a query that may return rows, such as a SELECT |
| 228 | func (m *qlbStmt) Query(args []driver.Value) (driver.Rows, error) { |
| 229 | var err error |
| 230 | if len(args) > 0 { |
| 231 | m.query, err = queryArgsConvert(m.query, args) |
| 232 | if err != nil { |
| 233 | return nil, err |
| 234 | } |
| 235 | } |
| 236 | u.Debugf("query: %v", m.query) |
| 237 | |
| 238 | // Create a Job, which is Dag of Tasks that Run() |
| 239 | ctx := plan.NewContext(m.query) |
| 240 | ctx.Schema = m.conn.schema |
| 241 | job, err := BuildSqlJob(ctx) |
| 242 | if err != nil { |
| 243 | u.Warnf("return error? %v", err) |
| 244 | return nil, err |
| 245 | } |
| 246 | m.job = job |
| 247 | |
| 248 | // The only type of stmt that makes sense for Query is SELECT |
| 249 | // and we need list of columns that requires casing |
| 250 | sqlSelect, ok := job.Ctx.Stmt.(*rel.SqlSelect) |
| 251 | if !ok { |
| 252 | u.Warnf("ctx? %v", job.Ctx) |
| 253 | return nil, fmt.Errorf("We could not recognize that as a select query: %T", job.Ctx.Stmt) |
| 254 | } |
| 255 | |
| 256 | // Prepare a result writer, we manually append this task to end |
| 257 | // of job? |
| 258 | resultWriter := NewResultRows(ctx, sqlSelect.Columns.AliasedFieldNames()) |
| 259 | |
| 260 | job.RootTask.Add(resultWriter) |
| 261 | |
| 262 | job.Setup() |
| 263 | |
| 264 | // TODO: this can't run in parallel-buffered mode? |
| 265 | // how to open in go-routine and still be able to send error to rows? |
| 266 | go func() { |
| 267 | //u.Debugf("Start Job.Run") |
| 268 | err = job.Run() |
| 269 | //u.Debugf("After job.Run()") |
| 270 | if err != nil { |
| 271 | u.Errorf("error on Query.Run(): %v", err) |
| 272 | //resultWriter.ErrChan() <- err |
| 273 | //job.Close() |
| 274 | } |
| 275 | job.Close() |
| 276 | //u.Debugf("exiting Background Query") |
| 277 | }() |
| 278 | |
| 279 | return resultWriter, nil |
| 280 | } |
| 281 | |
| 282 | // driver.ColumnConverter Interface implementation. |
| 283 | // |
no test coverage detected