| 75 | ) |
| 76 | |
| 77 | func convertQueryAndBuildArgs(pattern string, args []types.NamedArg) (containsDDL bool, p string, ifs []interface{}, err error) { |
| 78 | if lower := strings.ToLower(pattern); strings.Contains(lower, "begin") || |
| 79 | strings.Contains(lower, "rollback") || strings.Contains(lower, "commit") { |
| 80 | return false, pattern, nil, nil |
| 81 | } |
| 82 | var ( |
| 83 | tokenizer = sqlparser.NewStringTokenizer(pattern) |
| 84 | queryParts []string |
| 85 | statements []sqlparser.Statement |
| 86 | i int |
| 87 | origQuery string |
| 88 | query string |
| 89 | ) |
| 90 | |
| 91 | if queryParts, statements, err = sqlparser.ParseMultiple(tokenizer); err != nil { |
| 92 | err = errors.Wrap(err, "parse sql failed") |
| 93 | return |
| 94 | } |
| 95 | |
| 96 | for i = range queryParts { |
| 97 | walkNodes := []sqlparser.SQLNode{statements[i]} |
| 98 | |
| 99 | switch stmt := statements[i].(type) { |
| 100 | case *sqlparser.Show: |
| 101 | origQuery = queryParts[i] |
| 102 | |
| 103 | switch stmt.Type { |
| 104 | case "table": |
| 105 | if stmt.ShowCreate { |
| 106 | query = fmt.Sprintf(`SELECT sql |
| 107 | FROM sqlite_master |
| 108 | WHERE type = "table" AND tbl_name = "%s" |
| 109 | AND tbl_name NOT LIKE "sqlite%%"`, |
| 110 | stmt.OnTable.Name.String()) |
| 111 | } else { |
| 112 | query = fmt.Sprintf(`PRAGMA table_info(%s)`, stmt.OnTable.Name.String()) |
| 113 | } |
| 114 | case "index": |
| 115 | query = fmt.Sprintf(`SELECT name |
| 116 | FROM sqlite_master |
| 117 | WHERE type = "index" AND tbl_name = "%s" |
| 118 | AND name NOT LIKE "sqlite%%"`, stmt.OnTable.Name.String()) |
| 119 | case "tables": |
| 120 | query = `SELECT name FROM sqlite_master WHERE type = "table" AND name NOT LIKE "sqlite%"` |
| 121 | } |
| 122 | |
| 123 | log.WithFields(log.Fields{ |
| 124 | "from": origQuery, |
| 125 | "to": query, |
| 126 | }).Debug("query translated") |
| 127 | |
| 128 | queryParts[i] = query |
| 129 | case *sqlparser.DDL: |
| 130 | containsDDL = true |
| 131 | if stmt.TableSpec != nil { |
| 132 | // walk table default values for invalid stateful expressions |
| 133 | for _, c := range stmt.TableSpec.Columns { |
| 134 | if c == nil || c.Type.Default == nil { |