MCPcopy Create free account
hub / github.com/dolthub/doltgresql / nodeLimit

Function nodeLimit

server/ast/limit.go:28–80  ·  view source on GitHub ↗

nodeLimit handles *tree.Limit nodes.

(ctx *Context, node *tree.Limit)

Source from the content-addressed store, hash-verified

26
27// nodeLimit handles *tree.Limit nodes.
28func nodeLimit(ctx *Context, node *tree.Limit) (*vitess.Limit, error) {
29 if node == nil || ((node.Count == nil || node.Count == tree.NullLiteral{}) && (node.Offset == nil || node.Offset == tree.NullLiteral{})) {
30 return nil, nil
31 }
32 var count vitess.Expr
33 if !node.LimitAll {
34 var err error
35 count, err = nodeExpr(ctx, node.Count)
36 if err != nil {
37 return nil, err
38 }
39 }
40 offset, err := nodeExpr(ctx, node.Offset)
41 if err != nil {
42 return nil, err
43 }
44 // GMS is hardcoded to expect vitess.SQLVal for expressions such as `LIMIT 1 OFFSET 1`.
45 // We need to remove the hard dependency, but for now, we'll just convert our literals to a vitess.SQLVal.
46 if injectedExpr, ok := count.(vitess.InjectedExpr); ok {
47 if literal, ok := injectedExpr.Expression.(*expression.Literal); ok {
48 l := literal.Value()
49 limitValue, err := int64ValueForLimit(l)
50 if err != nil {
51 return nil, err
52 }
53
54 if limitValue < 0 {
55 return nil, errors.Errorf("LIMIT must be greater than or equal to 0")
56 }
57
58 count = pgexprs.ToVitessLiteral(literal)
59 }
60 }
61 if injectedExpr, ok := offset.(vitess.InjectedExpr); ok {
62 if literal, ok := injectedExpr.Expression.(*expression.Literal); ok {
63 o := literal.Value()
64 offsetVal, err := int64ValueForLimit(o)
65 if err != nil {
66 return nil, err
67 }
68
69 if offsetVal < 0 {
70 return nil, errors.Errorf("OFFSET must be greater than or equal to 0")
71 }
72
73 offset = pgexprs.ToVitessLiteral(literal)
74 }
75 }
76 return &vitess.Limit{
77 Offset: offset,
78 Rowcount: count,
79 }, nil
80}
81
82// int64ValueForLimit converts a literal value to an int64
83func int64ValueForLimit(l any) (int64, error) {

Callers 3

nodeUpdateFunction · 0.85
nodeDeleteFunction · 0.85
nodeSelectFunction · 0.85

Calls 4

nodeExprFunction · 0.85
int64ValueForLimitFunction · 0.85
ErrorfMethod · 0.65
ValueMethod · 0.45

Tested by

no test coverage detected