(raw *ast.RawStmt, query string, failfast bool)
| 123 | } |
| 124 | |
| 125 | func (c *Compiler) _analyzeQuery(raw *ast.RawStmt, query string, failfast bool) (*analysis, error) { |
| 126 | errors := make([]error, 0) |
| 127 | check := func(err error) error { |
| 128 | if failfast { |
| 129 | return err |
| 130 | } |
| 131 | if err != nil { |
| 132 | errors = append(errors, err) |
| 133 | } |
| 134 | return nil |
| 135 | } |
| 136 | |
| 137 | numbers, dollar, err := validate.ParamRef(raw) |
| 138 | if err := check(err); err != nil { |
| 139 | return nil, err |
| 140 | } |
| 141 | |
| 142 | raw, namedParams, edits := rewrite.NamedParameters(c.conf.Engine, raw, numbers, dollar) |
| 143 | |
| 144 | var table *ast.TableName |
| 145 | switch n := raw.Stmt.(type) { |
| 146 | case *ast.InsertStmt: |
| 147 | var err error |
| 148 | table, err = ParseTableName(n.Relation) |
| 149 | if err := check(err); err != nil { |
| 150 | return nil, err |
| 151 | } |
| 152 | if err := check(validate.InsertStmt(c.catalog, table, n)); err != nil { |
| 153 | return nil, err |
| 154 | } |
| 155 | } |
| 156 | |
| 157 | if err := check(validate.FuncCall(c.catalog, c.combo, raw)); err != nil { |
| 158 | return nil, err |
| 159 | } |
| 160 | |
| 161 | if err := check(validate.In(c.catalog, raw)); err != nil { |
| 162 | return nil, err |
| 163 | } |
| 164 | rvs := rangeVars(raw.Stmt) |
| 165 | refs, errs := findParameters(raw.Stmt) |
| 166 | if len(errs) > 0 { |
| 167 | if failfast { |
| 168 | return nil, errs[0] |
| 169 | } |
| 170 | errors = append(errors, errs...) |
| 171 | } |
| 172 | refs = uniqueParamRefs(refs, dollar) |
| 173 | if c.conf.Engine == config.EngineMySQL || !dollar { |
| 174 | sort.Slice(refs, func(i, j int) bool { return refs[i].ref.Location < refs[j].ref.Location }) |
| 175 | } else { |
| 176 | sort.Slice(refs, func(i, j int) bool { return refs[i].ref.Number < refs[j].ref.Number }) |
| 177 | } |
| 178 | raw, embeds := rewrite.Embeds(raw) |
| 179 | qc, err := c.buildQueryCatalog(c.catalog, raw.Stmt, embeds) |
| 180 | if err := check(err); err != nil { |
| 181 | return nil, err |
| 182 | } |
no test coverage detected