mirror of
https://github.com/featurebasedb/featurebase.git
synced 2026-08-28 10:54:59 +00:00
Fb 1876 : Implement Replicate() func (#2410)
* fb-1876 : creating Replicate fun * fb-1876: creating string replicate func * Fb-1876: String Replicate func * Fb-1876: String Replicate func
This commit is contained in:
parent
d971cfc269
commit
2fccb87dcf
4 changed files with 93 additions and 3 deletions
|
|
@ -1518,6 +1518,8 @@ func (n *callPlanExpression) Evaluate(currentRow []interface{}) (interface{}, er
|
|||
return n.EvaluateSpace(currentRow)
|
||||
case "LEN":
|
||||
return n.EvaluateLen(currentRow)
|
||||
case "REPLICATE":
|
||||
return n.EvaluateReplicate(currentRow)
|
||||
default:
|
||||
return nil, sql3.NewErrInternalf("unhandled function name '%s'", n.name)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -264,13 +264,15 @@ func (p *ExecutionPlanner) analyzeCallExpression(call *parser.Call, scope parser
|
|||
case "LTRIM":
|
||||
return p.analyseFunctionTrim(call, scope)
|
||||
case "SUFFIX":
|
||||
return p.analyseFunctionPrefixSuffix(call, scope)
|
||||
return p.analyseFunctionPrefixSuffixReplicate(call, scope)
|
||||
case "PREFIX":
|
||||
return p.analyseFunctionPrefixSuffix(call, scope)
|
||||
return p.analyseFunctionPrefixSuffixReplicate(call, scope)
|
||||
case "SPACE":
|
||||
return p.analyseFunctionSpace(call, scope)
|
||||
case "LEN":
|
||||
return p.analyseFunctionLen(call, scope)
|
||||
case "REPLICATE":
|
||||
return p.analyseFunctionPrefixSuffixReplicate(call, scope)
|
||||
default:
|
||||
return nil, sql3.NewErrCallUnknownFunction(call.Name.NamePos.Line, call.Name.NamePos.Column, call.Name.Name)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -163,7 +163,7 @@ func (p *ExecutionPlanner) analyseFunctionTrim(call *parser.Call, scope parser.S
|
|||
return call, nil
|
||||
}
|
||||
|
||||
func (p *ExecutionPlanner) analyseFunctionPrefixSuffix(call *parser.Call, scope parser.Statement) (parser.Expr, error) {
|
||||
func (p *ExecutionPlanner) analyseFunctionPrefixSuffixReplicate(call *parser.Call, scope parser.Statement) (parser.Expr, error) {
|
||||
if len(call.Args) != 2 {
|
||||
return nil, sql3.NewErrCallParameterCountMismatch(call.Rparen.Line, call.Rparen.Column, call.Name.Name, 2, len(call.Args))
|
||||
}
|
||||
|
|
@ -612,3 +612,35 @@ func (n *callPlanExpression) EvaluateLen(currentRow []interface{}) (interface{},
|
|||
|
||||
return int64(len([]rune(stringArg))), nil
|
||||
}
|
||||
func (n *callPlanExpression) EvaluateReplicate(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)
|
||||
}
|
||||
|
||||
argEval, err = n.args[1].Evaluate(currentRow)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if argEval == nil {
|
||||
return nil, nil
|
||||
}
|
||||
intArg, ok := argEval.(int64)
|
||||
if !ok {
|
||||
return nil, sql3.NewErrInternalf("unexpected type converion %T", argEval)
|
||||
}
|
||||
|
||||
if intArg < 0 {
|
||||
return nil, sql3.NewErrValueOutOfRange(0, 0, intArg)
|
||||
}
|
||||
|
||||
return strings.Repeat(stringArg, int(intArg)), nil
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -766,5 +766,59 @@ var stringScalarFunctionsTests = TableTest{
|
|||
),
|
||||
Compare: CompareExactOrdered,
|
||||
},
|
||||
{
|
||||
name: "ReplicateString",
|
||||
SQLs: sqls(
|
||||
"select replicate('this',2)",
|
||||
),
|
||||
ExpHdrs: hdrs(
|
||||
hdr("", fldTypeString),
|
||||
),
|
||||
ExpRows: rows(
|
||||
row(string("thisthis")),
|
||||
),
|
||||
Compare: CompareExactOrdered,
|
||||
},
|
||||
{
|
||||
name: "ReplicateNull",
|
||||
SQLs: sqls(
|
||||
"select replicate(null,null)",
|
||||
),
|
||||
ExpHdrs: hdrs(
|
||||
hdr("", fldTypeString),
|
||||
),
|
||||
ExpRows: rows(
|
||||
row(nil),
|
||||
),
|
||||
Compare: CompareExactOrdered,
|
||||
},
|
||||
{
|
||||
name: "ReplicateincorrectArguments",
|
||||
SQLs: sqls(
|
||||
"select replicate('this',)",
|
||||
),
|
||||
ExpErr: "[1:25] 'replicate': count of formal parameters (2) does not match count of actual parameters (1)",
|
||||
},
|
||||
{
|
||||
name: "ReplicateincorrectTypeofArguments",
|
||||
SQLs: sqls(
|
||||
"select replicate(1,2)",
|
||||
),
|
||||
ExpErr: "[1:18] string expression expected",
|
||||
},
|
||||
{
|
||||
name: "ReplicateincorrectTypeofArguments",
|
||||
SQLs: sqls(
|
||||
"select replicate('this','this')",
|
||||
),
|
||||
ExpErr: "[1:25] integer expression expected",
|
||||
},
|
||||
{
|
||||
name: "ReplicateOutofRange",
|
||||
SQLs: sqls(
|
||||
"select replicate('this',-1)",
|
||||
),
|
||||
ExpErr: "[0:0] value '-1' out of range",
|
||||
},
|
||||
},
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue