@@ -36,6 +36,12 @@ function quoteIdent(ident: string): string {
3636 return `"${ ident . replace ( / " / g, "\"\"" ) } "` ;
3737}
3838
39+ function quoteLiteral ( value : string ) : string {
40+ // Single-quote and escape embedded quotes by doubling.
41+ // This is used where Postgres grammar requires a literal (e.g., CREATE/ALTER ROLE PASSWORD).
42+ return `'${ value . replace ( / ' / g, "''" ) } '` ;
43+ }
44+
3945export function maskConnectionString ( dbUrl : string ) : string {
4046 // Hide password if present (postgresql://user:pass@host/db).
4147 try {
@@ -308,21 +314,20 @@ export async function buildInitPlan(params: {
308314
309315 const qRole = quoteIdent ( monitoringUser ) ;
310316 const qDb = quoteIdent ( database ) ;
317+ const qPw = quoteLiteral ( params . monitoringPassword ) ;
311318
312319 const steps : InitStep [ ] = [ ] ;
313320
314321 // Role creation/update is done in two alternative steps. Caller decides by checking role existence.
315322 if ( params . roleExists === false ) {
316323 steps . push ( {
317324 name : "create monitoring user" ,
318- sql : `create user ${ qRole } with password $1;` ,
319- params : [ params . monitoringPassword ] ,
325+ sql : `create user ${ qRole } with password ${ qPw } ;` ,
320326 } ) ;
321327 } else if ( params . roleExists === true ) {
322328 steps . push ( {
323329 name : "update monitoring user password" ,
324- sql : `alter user ${ qRole } with password $1;` ,
325- params : [ params . monitoringPassword ] ,
330+ sql : `alter user ${ qRole } with password ${ qPw } ;` ,
326331 } ) ;
327332 } else {
328333 // Unknown: caller will rebuild after probing role existence.
0 commit comments