{"record":{"id":"f2b8aa09ae1e84e1","repo":"golang-migrate/migrate","slug":"unable-to-parse-option-x-multi-statement-w-f2b8aa","errorCode":null,"errorMessage":"unable to parse option x-multi-statement: %w","messagePattern":"unable to parse option x-multi-statement: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"database/pgx/v5/pgx.go","lineNumber":191,"sourceCode":"\t\t}\n\t}\n\n\tmultiStatementMaxSize := DefaultMultiStatementMaxSize\n\tif s := purl.Query().Get(\"x-multi-statement-max-size\"); len(s) > 0 {\n\t\tmultiStatementMaxSize, err = strconv.Atoi(s)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif multiStatementMaxSize <= 0 {\n\t\t\tmultiStatementMaxSize = DefaultMultiStatementMaxSize\n\t\t}\n\t}\n\n\tmultiStatementEnabled := false\n\tif s := purl.Query().Get(\"x-multi-statement\"); len(s) > 0 {\n\t\tmultiStatementEnabled, err = strconv.ParseBool(s)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"unable to parse option x-multi-statement: %w\", err)\n\t\t}\n\t}\n\n\tpx, err := WithInstance(db, &Config{\n\t\tDatabaseName:          purl.Path,\n\t\tMigrationsTable:       migrationsTable,\n\t\tMigrationsTableQuoted: migrationsTableQuoted,\n\t\tStatementTimeout:      time.Duration(statementTimeout) * time.Millisecond,\n\t\tMultiStatementEnabled: multiStatementEnabled,\n\t\tMultiStatementMaxSize: multiStatementMaxSize,\n\t})\n\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn px, nil\n}","sourceCodeStart":173,"sourceCodeEnd":209,"githubUrl":"https://github.com/golang-migrate/migrate/blob/01a9643f1475e75bb6d6224ddeaf9d8e2434ca8a/database/pgx/v5/pgx.go#L173-L209","documentation":"The x-multi-statement URL option for the pgx/v5 driver enables multiple SQL statements per migration. Its value is parsed with strconv.ParseBool, and Open fails with this error if the value is not a recognized boolean literal. Purely a client-side URL validation failure.","triggerScenarios":"Opening a pgx/v5 connection with a URL like postgres://user:pass@host/db?x-multi-statement=yes, =1.0, or any non-boolean string in x-multi-statement.","commonSituations":"Copying the option name but inventing the value ('yes', 'on'), templating engines injecting an empty or malformed value, or accidental duplication of the query parameter producing a concatenated string.","solutions":["Use a valid ParseBool value: true/false (or 1/0, t/f, T/F, TRUE/FALSE)","Remove x-multi-statement from the URL if multi-statement behavior is not needed (it defaults to false)","Trim whitespace around the value — ' true' is not parseable","Inspect the wrapped strconv error for the exact offending string"],"exampleFix":"// before\ndsn := \"postgres://u:p@host/db?x-multi-statement=on\"\n// after\ndsn := \"postgres://u:p@host/db?x-multi-statement=true\"","handlingStrategy":"validation","validationCode":"u, _ := url.Parse(dsn)\nif v := u.Query().Get(\"x-multi-statement\"); v != \"\" {\n    if _, err := strconv.ParseBool(v); err != nil {\n        return fmt.Errorf(\"invalid x-multi-statement %q: %w\", v, err)\n    }\n}","typeGuard":"func isValidBool(v string) bool {\n    _, err := strconv.ParseBool(v)\n    return err == nil\n}","tryCatchPattern":"if err := m.Up(); err != nil {\n    if strings.Contains(err.Error(), \"unable to parse option x-multi-statement\") {\n        log.Fatalf(\"DSN x-multi-statement must be a boolean literal: %v\", err)\n    }\n    panic(err)\n}","preventionTips":["Use true/false, never yes/on/enabled, for Go DSN boolean options","Centralize DSN construction in a helper that appends validated options","Validate all x-* options before handing the DSN to migrate"],"tags":["configuration","url-parameters","postgres","parsing"],"backgroundTag":"invalid-url-option-value","analyzedSha":"01a9643f1475e75bb6d6224ddeaf9d8e2434ca8a","analyzedAt":"2026-09-02T19:38:29.671Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-10T02:17:09.455Z"}