mirror of
https://github.com/featurebasedb/featurebase.git
synced 2026-10-09 04:17:51 +00:00
Implement SPACE() function for SQL3 (#2399)
FB-1861
(cherry picked from commit da74f0a312)
This commit is contained in:
parent
5e151eed0e
commit
2b9c13497e
4 changed files with 60 additions and 0 deletions
|
|
@ -1512,6 +1512,8 @@ func (n *callPlanExpression) Evaluate(currentRow []interface{}) (interface{}, er
|
|||
return n.EvaluateSuffix(currentRow)
|
||||
case "PREFIX":
|
||||
return n.EvaluatePrefix(currentRow)
|
||||
case "SPACE":
|
||||
return n.EvaluateSpace(currentRow)
|
||||
default:
|
||||
return nil, sql3.NewErrInternalf("unhandled function name '%s'", n.name)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -265,6 +265,8 @@ func (p *ExecutionPlanner) analyzeCallExpression(call *parser.Call, scope parser
|
|||
return p.analyseFunctionPrefixSuffix(call, scope)
|
||||
case "PREFIX":
|
||||
return p.analyseFunctionPrefixSuffix(call, scope)
|
||||
case "SPACE":
|
||||
return p.analyseFunctionSpace(call, scope)
|
||||
default:
|
||||
return nil, sql3.NewErrCallUnknownFunction(call.Name.NamePos.Line, call.Name.NamePos.Column, call.Name.Name)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -147,6 +147,21 @@ func (p *ExecutionPlanner) analyzeFunctionUpper(call *parser.Call, scope parser.
|
|||
return call, nil
|
||||
}
|
||||
|
||||
func (p *ExecutionPlanner) analyseFunctionSpace(call *parser.Call, scope parser.Statement) (parser.Expr, error) {
|
||||
//one argument
|
||||
if len(call.Args) != 1 {
|
||||
return nil, sql3.NewErrCallParameterCountMismatch(call.Rparen.Line, call.Rparen.Column, call.Name.Name, 1, len(call.Args))
|
||||
}
|
||||
|
||||
if !typeIsInteger(call.Args[0].DataType()) {
|
||||
return nil, sql3.NewErrIntExpressionExpected(call.Args[0].Pos().Line, call.Args[0].Pos().Column)
|
||||
}
|
||||
|
||||
call.ResultDataType = parser.NewDataTypeString()
|
||||
|
||||
return call, nil
|
||||
}
|
||||
|
||||
// Convert string to Upper case
|
||||
func (n *callPlanExpression) EvaluateUpper(currentRow []interface{}) (interface{}, error) {
|
||||
stringArgOne, err := evaluateStringArg(n.args[0], currentRow)
|
||||
|
|
@ -403,3 +418,18 @@ func (n *callPlanExpression) EvaluateSuffix(currentRow []interface{}) (interface
|
|||
|
||||
return stringArgOne[len(stringArgOne)-intArgTwo:], nil
|
||||
}
|
||||
|
||||
func (n *callPlanExpression) EvaluateSpace(currentRow []interface{}) (interface{}, error) {
|
||||
// Get the integer argument from the function call
|
||||
intArg, err := evaluateIntArg(n.args[0], currentRow)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
// Return a string containing a number of spaces equal to the integer value
|
||||
spaces := ""
|
||||
for i := 0; i < intArg; i++ {
|
||||
spaces += " "
|
||||
}
|
||||
return spaces, nil
|
||||
}
|
||||
|
|
|
|||
|
|
@ -466,5 +466,31 @@ var stringScalarFunctionsTests = TableTest{
|
|||
),
|
||||
ExpErr: "string expression expected",
|
||||
},
|
||||
{
|
||||
name: "SpaceZero",
|
||||
SQLs: sqls(
|
||||
"select space(0)",
|
||||
),
|
||||
ExpHdrs: hdrs(
|
||||
hdr("", fldTypeString),
|
||||
),
|
||||
ExpRows: rows(
|
||||
row(string("")),
|
||||
),
|
||||
Compare: CompareExactOrdered,
|
||||
},
|
||||
{
|
||||
name: "SpaceFive",
|
||||
SQLs: sqls(
|
||||
"select space(5)",
|
||||
),
|
||||
ExpHdrs: hdrs(
|
||||
hdr("", fldTypeString),
|
||||
),
|
||||
ExpRows: rows(
|
||||
row(string(" ")),
|
||||
),
|
||||
Compare: CompareExactOrdered,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue