mirror of
https://github.com/featurebasedb/featurebase.git
synced 2026-08-28 02:44:59 +00:00
FB-1827: Implement Len() (#2406)
(cherry picked from commit f99be656df)
This commit is contained in:
parent
adbad90fe1
commit
fc1b8fdfb8
4 changed files with 75 additions and 0 deletions
|
|
@ -1516,6 +1516,8 @@ func (n *callPlanExpression) Evaluate(currentRow []interface{}) (interface{}, er
|
|||
return n.EvaluatePrefix(currentRow)
|
||||
case "SPACE":
|
||||
return n.EvaluateSpace(currentRow)
|
||||
case "LEN":
|
||||
return n.EvaluateLen(currentRow)
|
||||
default:
|
||||
return nil, sql3.NewErrInternalf("unhandled function name '%s'", n.name)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -269,6 +269,8 @@ func (p *ExecutionPlanner) analyzeCallExpression(call *parser.Call, scope parser
|
|||
return p.analyseFunctionPrefixSuffix(call, scope)
|
||||
case "SPACE":
|
||||
return p.analyseFunctionSpace(call, scope)
|
||||
case "LEN":
|
||||
return p.analyseFunctionLen(call, scope)
|
||||
default:
|
||||
return nil, sql3.NewErrCallUnknownFunction(call.Name.NamePos.Line, call.Name.NamePos.Column, call.Name.Name)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -195,6 +195,18 @@ func (p *ExecutionPlanner) analyseFunctionSpace(call *parser.Call, scope parser.
|
|||
return call, nil
|
||||
}
|
||||
|
||||
func (p *ExecutionPlanner) analyseFunctionLen(call *parser.Call, scope parser.Statement) (parser.Expr, error) {
|
||||
if len(call.Args) != 1 {
|
||||
return nil, sql3.NewErrCallParameterCountMismatch(call.Rparen.Line, call.Rparen.Column, call.Name.Name, 1, len(call.Args))
|
||||
}
|
||||
|
||||
if !typeIsString(call.Args[0].DataType()) && !typeIsVoid(call.Args[0].DataType()) {
|
||||
return nil, sql3.NewErrStringExpressionExpected(call.Args[0].Pos().Line, call.Args[0].Pos().Column)
|
||||
}
|
||||
call.ResultDataType = parser.NewDataTypeInt()
|
||||
return call, nil
|
||||
}
|
||||
|
||||
// reverses the string
|
||||
func (n *callPlanExpression) EvaluateReverse(currentRow []interface{}) (interface{}, error) {
|
||||
argEval, err := n.args[0].Evaluate(currentRow)
|
||||
|
|
@ -264,6 +276,10 @@ func (n *callPlanExpression) EvaluateChar(currentRow []interface{}) (interface{}
|
|||
if !ok {
|
||||
return 0, sql3.NewErrInternalf("unexpected type converion %T", argEval)
|
||||
}
|
||||
// ascii range is [0-255]
|
||||
if intArg < 0 || intArg > 255 {
|
||||
return nil, sql3.NewErrValueOutOfRange(0, 0, intArg)
|
||||
}
|
||||
|
||||
// Return the character that corresponds to the integer value
|
||||
return string(rune(intArg)), nil
|
||||
|
|
@ -580,3 +596,19 @@ func (n *callPlanExpression) EvaluateSpace(currentRow []interface{}) (interface{
|
|||
}
|
||||
return spaces, nil
|
||||
}
|
||||
|
||||
func (n *callPlanExpression) EvaluateLen(currentRow []interface{}) (interface{}, error) {
|
||||
argEval, err := n.args[0].Evaluate(currentRow)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if argEval == nil {
|
||||
return nil, nil
|
||||
}
|
||||
stringArg, ok := argEval.(string)
|
||||
if !ok {
|
||||
return nil, sql3.NewErrInternalf("unexpected type converion %T", argEval)
|
||||
}
|
||||
|
||||
return int64(len([]rune(stringArg))), nil
|
||||
}
|
||||
|
|
|
|||
|
|
@ -727,5 +727,44 @@ var stringScalarFunctionsTests = TableTest{
|
|||
),
|
||||
Compare: CompareExactOrdered,
|
||||
},
|
||||
{
|
||||
name: "LenNull",
|
||||
SQLs: sqls(
|
||||
"select len(null)",
|
||||
),
|
||||
ExpHdrs: hdrs(
|
||||
hdr("", fldTypeInt),
|
||||
),
|
||||
ExpRows: rows(
|
||||
row(nil),
|
||||
),
|
||||
Compare: CompareExactOrdered,
|
||||
},
|
||||
{
|
||||
name: "LenString",
|
||||
SQLs: sqls(
|
||||
"select len(' length ')",
|
||||
),
|
||||
ExpHdrs: hdrs(
|
||||
hdr("", fldTypeInt),
|
||||
),
|
||||
ExpRows: rows(
|
||||
row(int64(9)),
|
||||
),
|
||||
Compare: CompareExactOrdered,
|
||||
},
|
||||
{
|
||||
name: "LenChar",
|
||||
SQLs: sqls(
|
||||
"select len(char(114))",
|
||||
),
|
||||
ExpHdrs: hdrs(
|
||||
hdr("", fldTypeInt),
|
||||
),
|
||||
ExpRows: rows(
|
||||
row(int64(1)),
|
||||
),
|
||||
Compare: CompareExactOrdered,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue