{"record":{"id":"c381150b1f86cba7","repo":"golang-migrate/migrate","slug":"unable-to-parse-option-x-multi-statement-w","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/pgx.go","lineNumber":215,"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\tlockStrategy := purl.Query().Get(\"x-lock-strategy\")\n\tlockTable := purl.Query().Get(\"x-lock-table\")\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\tLockStrategy:          lockStrategy,\n\t\tLockTable:             lockTable,\n\t})\n\n\tif err != nil {","sourceCodeStart":197,"sourceCodeEnd":233,"githubUrl":"https://github.com/golang-migrate/migrate/blob/01a9643f1475e75bb6d6224ddeaf9d8e2434ca8a/database/pgx/pgx.go#L197-L233","documentation":"The `x-multi-statement` pgx DSN option enables multi-statement migration files (with `x-multi-statement-max-size` bounding the batch size). This error is wrapped from strconv.ParseBool when the option's value cannot be parsed as a Go boolean, and Open aborts before connecting to the database.","triggerScenarios":"Calling pgx.Open with a DSN containing `x-multi-statement=<invalid>`, e.g. `x-multi-statement=enable`, `x-multi-statement=1 ` with a trailing space, `x-multi-statement=yes`, or a value mangled by URL encoding/templating.","commonSituations":"Enabling multi-statement migrations for MySQL-style SQL files against Postgres and typing non-Go boolean values; env-var substitution inserting an empty or malformed value; copying examples from other tools that accept on/off or yes/no.","solutions":["Set the value to a strconv.ParseBool-accepted string: true/false, 1/0, t/f, T/F, TRUE/FALSE, True/False.","Remove the parameter if multi-statement support is not needed (defaults to false).","Log the final DSN after config substitution and confirm the parameter is intact (no spaces, correct URL encoding).","Normalize application-level booleans (yes/no/on/off) to Go booleans before composing the migrate URL."],"exampleFix":"// before\ndsn := \"postgres://user:pass@host/db?x-multi-statement=enable\"\n// after\ndsn := \"postgres://user:pass@host/db?x-multi-statement=true\"","handlingStrategy":"validation","validationCode":"u, err := url.Parse(dsn)\nif err != nil { return err }\nif v := u.Query().Get(\"x-multi-statement\"); v != \"\" {\n    if _, err := strconv.ParseBool(v); err != nil {\n        return fmt.Errorf(\"x-multi-statement must be a Go boolean, got %q\", v)\n    }\n}","typeGuard":"func isValidGoBool(s string) bool { _, err := strconv.ParseBool(s); return err == nil }","tryCatchPattern":"drv, err := pgx.Open(dsn)\nif err != nil && strings.Contains(err.Error(), \"unable to parse option x-multi-statement\") {\n    return fmt.Errorf(\"x-multi-statement accepts only true/false/1/0/t/f: %w\", err)\n}","preventionTips":["Never substitute on/off or yes/no booleans into Go-style DSN options","Construct DSN query params with url.Values{}.Encode() to avoid formatting drift","Test DSN composition with env vars unset to catch empty substitutions"],"tags":["postgresql","config","parsing","migrations"],"backgroundTag":"invalid-boolean-config-option","analyzedSha":"01a9643f1475e75bb6d6224ddeaf9d8e2434ca8a","analyzedAt":"2026-09-02T19:38:29.671Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-10T02:17:09.455Z"}