diff --git a/internal/stackql/astvisit/fragment_rewriting.go b/internal/stackql/astvisit/fragment_rewriting.go index a3bebbe6..201514be 100644 --- a/internal/stackql/astvisit/fragment_rewriting.go +++ b/internal/stackql/astvisit/fragment_rewriting.go @@ -905,6 +905,9 @@ func (v *standardFragmentRewriteAstVisitor) Visit(node sqlparser.SQLNode) error buf.WriteString(funcName) } buf.AstPrintf(node, "(%s%v)", distinct, node.Exprs) + if node.Over != nil { + buf.AstPrintf(node, " %v", node.Over) + } v.rewrittenQuery = buf.String() case *sqlparser.GroupConcatExpr: diff --git a/internal/stackql/astvisit/from_rewrite.go b/internal/stackql/astvisit/from_rewrite.go index 4db8ba71..b77af0cd 100644 --- a/internal/stackql/astvisit/from_rewrite.go +++ b/internal/stackql/astvisit/from_rewrite.go @@ -975,6 +975,9 @@ func (v *standardFromRewriteAstVisitor) Visit(node sqlparser.SQLNode) error { buf.WriteString(funcName) } buf.AstPrintf(node, "(%s%v)", distinct, node.Exprs) + if node.Over != nil { + buf.AstPrintf(node, " %v", node.Over) + } v.rewrittenQuery = buf.String() case *sqlparser.GroupConcatExpr: diff --git a/internal/stackql/astvisit/provider_string_extract.go b/internal/stackql/astvisit/provider_string_extract.go index 62cda611..ce7eab26 100644 --- a/internal/stackql/astvisit/provider_string_extract.go +++ b/internal/stackql/astvisit/provider_string_extract.go @@ -904,6 +904,9 @@ func (v *standardProviderStringAstVisitor) Visit(node sqlparser.SQLNode) error { buf.WriteString(funcName) } buf.AstPrintf(node, "(%s%v)", distinct, node.Exprs) + if node.Over != nil { + buf.AstPrintf(node, " %v", node.Over) + } // v.rewrittenQuery = buf.String() case *sqlparser.GroupConcatExpr: diff --git a/internal/stackql/parserutil/parser_util.go b/internal/stackql/parserutil/parser_util.go index f94f03d4..0ddf2f86 100644 --- a/internal/stackql/parserutil/parser_util.go +++ b/internal/stackql/parserutil/parser_util.go @@ -676,7 +676,14 @@ func inferColNameFromExpr( exprsDecorated = append(exprsDecorated, rv.DecoratedColumn) } } - decoratedColumn := fmt.Sprintf("%s(%s)", funcNameLowered, strings.Join(exprsDecorated, ", ")) + // Use astformat.String for window functions to include OVER clause, + // otherwise use the manually constructed decorated column for proper arg handling + var decoratedColumn string + if expr.Over != nil { + decoratedColumn = astformat.String(expr, formatter) + } else { + decoratedColumn = fmt.Sprintf("%s(%s)", funcNameLowered, strings.Join(exprsDecorated, ", ")) + } if retVal.Name != constants.SQLFuncJSONExtractPostgres { retVal.DecoratedColumn = getDecoratedColRendition(decoratedColumn, alias) }