mirror of
https://github.com/featurebasedb/featurebase.git
synced 2026-08-28 02:44:59 +00:00
Fb:1787 - Clean up (#2339)
* Fb:1787 - Clean up
* fb-1787 : String upper function
* Formatting the files
(cherry picked from commit 57ce7c4c0e)
This commit is contained in:
parent
830b2ab4c8
commit
682f240b7b
4 changed files with 67 additions and 1 deletions
|
|
@ -1478,6 +1478,8 @@ func (n *callPlanExpression) Evaluate(currentRow []interface{}) (interface{}, er
|
|||
return n.EvaluateDatepart(currentRow)
|
||||
case "REVERSE":
|
||||
return n.EvaluateReverse(currentRow)
|
||||
case "UPPER":
|
||||
return n.EvaluateUpper(currentRow)
|
||||
case "SUBSTRING":
|
||||
return n.EvaluateSubstring(currentRow)
|
||||
default:
|
||||
|
|
|
|||
|
|
@ -243,6 +243,8 @@ func (p *ExecutionPlanner) analyzeCallExpression(call *parser.Call, scope parser
|
|||
return p.analyzeFunctionSubtable(call, scope)
|
||||
case "REVERSE":
|
||||
return p.analyseFunctionReverse(call, scope)
|
||||
case "UPPER":
|
||||
return p.analyzeFunctionUpper(call, scope)
|
||||
case "SUBSTRING":
|
||||
return p.analyseFunctionSubstring(call, scope)
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,9 @@
|
|||
package planner
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/molecula/featurebase/v3/sql3"
|
||||
"github.com/molecula/featurebase/v3/sql3/parser"
|
||||
|
|
@ -63,8 +65,40 @@ func (n *callPlanExpression) EvaluateReverse(currentRow []interface{}) (interfac
|
|||
return string(runes), nil
|
||||
}
|
||||
|
||||
func (p *ExecutionPlanner) analyzeFunctionUpper(call *parser.Call, scope parser.Statement) (parser.Expr, error) {
|
||||
//one argument for Upper Function
|
||||
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()) {
|
||||
return nil, sql3.NewErrStringExpressionExpected(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) {
|
||||
argOneEval, err := n.args[0].Evaluate(currentRow)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
stringArgOne, ok := argOneEval.(string)
|
||||
if !ok {
|
||||
return nil, sql3.NewErrInternalf("unexpected type converion %T", argOneEval)
|
||||
}
|
||||
// convert to Upper
|
||||
res := strings.ToUpper(stringArgOne)
|
||||
return fmt.Sprintf("%s", res), nil
|
||||
}
|
||||
|
||||
// Takes string, startIndex and length and returns the substring.
|
||||
func (n *callPlanExpression) EvaluateSubstring(currentRow []interface{}) (interface{}, error) {
|
||||
|
||||
argOneEval, err := n.args[0].Evaluate(currentRow)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
|
|
|||
|
|
@ -10,9 +10,10 @@ var stringScalarFunctionsTests = TableTest{
|
|||
srcHdr("a", fldTypeInt, "min 0", "max 1000"),
|
||||
srcHdr("b", fldTypeInt, "min 0", "max 1000"),
|
||||
srcHdr("ts", fldTypeTimestamp),
|
||||
srcHdr("a_string", fldTypeString),
|
||||
),
|
||||
srcRows(
|
||||
srcRow(int64(1), int64(10), int64(100), knownTimestamp()),
|
||||
srcRow(int64(1), int64(10), int64(100), knownTimestamp(), "hello"),
|
||||
),
|
||||
),
|
||||
SQLTests: []SQLTest{
|
||||
|
|
@ -107,5 +108,32 @@ var stringScalarFunctionsTests = TableTest{
|
|||
),
|
||||
Compare: CompareExactUnordered,
|
||||
},
|
||||
{
|
||||
name: "ConvertingStringtoUpper",
|
||||
SQLs: sqls(
|
||||
"select upper('this')",
|
||||
),
|
||||
ExpHdrs: hdrs(
|
||||
hdr("", fldTypeString),
|
||||
),
|
||||
ExpRows: rows(
|
||||
row(string("THIS")),
|
||||
),
|
||||
Compare: CompareExactOrdered,
|
||||
},
|
||||
{
|
||||
name: "IncorrectArgumentsforUpper",
|
||||
SQLs: sqls(
|
||||
"select upper('a','b')",
|
||||
),
|
||||
ExpErr: "'upper': count of formal parameters (1) does not match count of actual parameters (2)",
|
||||
},
|
||||
{
|
||||
name: "IncorrectInputforUpper",
|
||||
SQLs: sqls(
|
||||
"select upper(1)",
|
||||
),
|
||||
ExpErr: "string expression expected",
|
||||
},
|
||||
},
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue