(engine config.Engine, raw *ast.RawStmt, numbs map[int]bool, dollar bool)
| 79 | } |
| 80 | |
| 81 | func NamedParameters(engine config.Engine, raw *ast.RawStmt, numbs map[int]bool, dollar bool) (*ast.RawStmt, *named.ParamSet, []source.Edit) { |
| 82 | foundFunc := astutils.Search(raw, named.IsParamFunc) |
| 83 | foundSign := astutils.Search(raw, named.IsParamSign) |
| 84 | hasNamedParameterSupport := engine != config.EngineMySQL |
| 85 | allParams := named.NewParamSet(numbs, hasNamedParameterSupport) |
| 86 | |
| 87 | if len(foundFunc.Items)+len(foundSign.Items) == 0 { |
| 88 | return raw, allParams, nil |
| 89 | } |
| 90 | |
| 91 | var edits []source.Edit |
| 92 | node := astutils.Apply(raw, func(cr *astutils.Cursor) bool { |
| 93 | node := cr.Node() |
| 94 | switch { |
| 95 | case named.IsParamFunc(node): |
| 96 | fun := node.(*ast.FuncCall) |
| 97 | param, origText := paramFromFuncCall(fun) |
| 98 | argn := allParams.Add(param) |
| 99 | cr.Replace(&ast.ParamRef{ |
| 100 | Number: argn, |
| 101 | Location: fun.Location, |
| 102 | }) |
| 103 | |
| 104 | var replace string |
| 105 | if engine == config.EngineMySQL || engine == config.EngineSQLite || !dollar { |
| 106 | if param.IsSqlcSlice() { |
| 107 | // This sequence is also replicated in internal/codegen/golang.Field |
| 108 | // since it's needed during template generation for replacement |
| 109 | replace = fmt.Sprintf(`/*SLICE:%s*/?`, param.Name()) |
| 110 | } else { |
| 111 | if engine == config.EngineSQLite { |
| 112 | replace = fmt.Sprintf("?%d", argn) |
| 113 | } else { |
| 114 | replace = "?" |
| 115 | } |
| 116 | } |
| 117 | } else { |
| 118 | replace = fmt.Sprintf("$%d", argn) |
| 119 | } |
| 120 | |
| 121 | edits = append(edits, source.Edit{ |
| 122 | Location: fun.Location - raw.StmtLocation, |
| 123 | Old: origText, |
| 124 | New: replace, |
| 125 | }) |
| 126 | return false |
| 127 | |
| 128 | case isNamedParamSignCast(node): |
| 129 | expr := node.(*ast.A_Expr) |
| 130 | cast := expr.Rexpr.(*ast.TypeCast) |
| 131 | paramName, _ := flatten(cast.Arg) |
| 132 | param := named.NewParam(paramName) |
| 133 | |
| 134 | argn := allParams.Add(param) |
| 135 | cast.Arg = &ast.ParamRef{ |
| 136 | Number: argn, |
| 137 | Location: expr.Location, |
| 138 | } |
no test coverage detected