@@ -66,7 +66,7 @@ func (conn *redshiftDataConn) QueryContext(ctx context.Context, query string, ar
6666
6767func (conn * redshiftDataConn ) ExecContext (ctx context.Context , query string , args []driver.NamedValue ) (driver.Result , error ) {
6868 params := & redshiftdata.ExecuteStatementInput {
69- Sql : nullif (query ),
69+ Sql : nullif (rewriteQuery ( query , len ( args )) ),
7070 Parameters : convertArgsToParameters (args ),
7171 }
7272 _ , output , err := conn .executeStatement (ctx , params )
@@ -76,6 +76,40 @@ func (conn *redshiftDataConn) ExecContext(ctx context.Context, query string, arg
7676 return newResult (output ), nil
7777}
7878
79+ func rewriteQuery (query string , paramsCount int ) string {
80+ if paramsCount == 0 {
81+ return query
82+ }
83+ runes := make ([]rune , 0 , len (query ))
84+ stack := make ([]rune , 0 )
85+ var exclamationCount int
86+ for _ , r := range query {
87+ if len (stack ) > 0 {
88+ if r == stack [len (stack )- 1 ] {
89+ stack = stack [:len (stack )- 1 ]
90+ runes = append (runes , r )
91+ continue
92+ }
93+ } else {
94+ switch r {
95+ case '?' :
96+ exclamationCount ++
97+ runes = append (runes , []rune (fmt .Sprintf (":%d" , exclamationCount ))... )
98+ continue
99+ case '$' :
100+ runes = append (runes , ':' )
101+ continue
102+ }
103+ }
104+ switch r {
105+ case '"' , '\'' :
106+ stack = append (stack , r )
107+ }
108+ runes = append (runes , r )
109+ }
110+ return string (runes )
111+ }
112+
79113func convertArgsToParameters (args []driver.NamedValue ) []types.SqlParameter {
80114 if len (args ) == 0 {
81115 return nil
0 commit comments