{"record":{"id":"e2ffbe6a618b1919","repo":"OrchardCMS/OrchardCore","slug":"unsupported-default-parameter-value-type","errorCode":null,"errorMessage":"Unsupported default parameter value type","messagePattern":"Unsupported default parameter value type","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/OrchardCore.Modules/OrchardCore.Queries/Sql/SqlParser.cs","lineNumber":261,"sourceCode":"            }\n\n            for (var i = 1; i < node.Parts.Count; i++)\n            {\n                parts.Add(Quote(node.Parts[i].Value));\n            }\n\n            return node with { Parts = parts };\n        }\n\n        protected override SqlNode VisitParameter(ParameterExpression node)\n        {\n            if (parameters is not null && !parameters.ContainsKey(node.Name))\n            {\n                parameters[node.Name] = node.DefaultValue switch\n                {\n                    LiteralExpression { Value: bool or string or decimal or long } literal => literal.Value,\n                    null => throw new InvalidOperationException($\"Missing parameter: {node.Name}\"),\n                    _ => throw new InvalidOperationException(\"Unsupported default parameter value type\"),\n                };\n            }\n\n            return node;\n        }\n\n        protected override SqlNode VisitOrderByItem(OrderByItem node)\n        {\n            var rewritten = (OrderByItem)base.VisitOrderByItem(node);\n\n            return rewritten.Expression is FunctionCallExpression\n                {\n                    Name.Value: var name,\n                    Arguments.Count: 0,\n                } function\n                && name.Equals(\"random\", StringComparison.OrdinalIgnoreCase)\n                    ? rewritten with\n                    {","sourceCodeStart":243,"sourceCodeEnd":279,"githubUrl":"https://github.com/OrchardCMS/OrchardCore/blob/4306c0717fe573f6fca1b4955909ddab6a192807/src/OrchardCore.Modules/OrchardCore.Queries/Sql/SqlParser.cs#L243-L279","documentation":"The SQL query parser only accepts default parameter values that are literal bool, string, decimal, or long expressions. If a @Parameter has a default of another type (e.g. a nested expression, date, or numeric form the parser doesn't classify) it throws this InvalidOperationException.","triggerScenarios":"Declaring a default for a SQL query parameter using a literal type outside {bool, string, decimal, long} — e.g. SET @Date = 2024-01-01 (parsed as something other than a supported literal) or a non-literal expression.","commonSituations":"See trigger scenarios.","solutions":["Rewrite the default as a simple quoted string, decimal, long, or boolean literal","Cast/convert within the SQL body instead of relying on the default value","Supply the value via the parameters dictionary at execution time"],"exampleFix":"// before\nSET @Published = yes\n// after\nSET @Published = true","handlingStrategy":"validation","validationCode":"// Only pass bool/string/decimal/long literals as defaults; verify at parse time\nif (defaultValue is not (bool or string or decimal or long)) throw new ArgumentException(\"Default must be bool, string, decimal, or long\");","typeGuard":null,"tryCatchPattern":"try { result = parser.Parse(sql, parameters); } catch (InvalidOperationException ex) when (ex.Message.Contains(\"Unsupported default parameter\")) { /* rewrite the query default */ }","preventionTips":["Use only simple literals (quoted strings, plain numbers, true/false) for parameter defaults","Test queries with defaults before deploying recipes","Do dates/times as strings and cast in SQL"],"tags":["sql","queries","parameters"],"backgroundTag":"invalid-argument-value","analyzedSha":"4306c0717fe573f6fca1b4955909ddab6a192807","analyzedAt":"2026-09-13T17:41:05.024Z","contentChangedAt":"2026-09-13T17:41:05.024Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}