Sample Custom Scalar Function


Following is the Java source code for the SUBSTRING scalar function. To implement a custom scalar function, follow the pattern in this sample:

 

package com.basis.sql.scalarfunction;

import com.basis.sql.codes.*;
import com.basis.sql.expression.*;
import java.sql.*;
import java.util.*;

public class SUBSTRING extends ScalarFunction
{
    // This function is responsible for checking the validity of the arguments passed
    // into this function. At this time, no values are know for the arguments, but
    // we do know the data types of each argument. This function should check for the
    // correct number of arguments and the type of each argument.
    public void isValid(List p_argumentList) throws SQLException
    {
        if (p_argumentList.size() != 3)
        {
            throw new SQLException("Invalid number of arguments. 3 arguments expected.",
                                   SqlState.GENERAL_WARNING,
                                   VendorCode.GENERAL_WARNING);
        }

        if (!((Expression)p_argumentList.get(0)).isCharacter() ||
            !((Expression)p_argumentList.get(1)).isNumeric() ||
            !((Expression)p_argumentList.get(2)).isNumeric())
        {
            throw new SQLException("Invalid argument type.",
                                   SqlState.GENERAL_WARNING,
                                   VendorCode.GENERAL_WARNING);
        }
    }

    
// The evaluate function actually evaluates the scalar function based on the values
// of the arguments.
    public LiteralExpression evaluate() throws SQLException
    {
        // Gets the string value of the first argument
        String              value1 = getArgument(0).getString();
        // Gets the integer value of the second argument
        int                 value2 = getArgument(1).getInt() - 1;
        // Gets the integer value of the third argument
        int                 value3 = getArgument(2).getInt();

        if (value2 < 0)
        {
            value2 = 0;
        }
        if (value2 > value1.length())
        {
            value2 = value1.length();
        }
        if (value2 + value3 >= value1.length())
        {
            value3 = value1.length() - value2;
            if (value3 < 0)
            {
                value3 = 0;
            }
        }

        // Creates a new LiteralExpression object that contains the specified 
        // substring based on the values retrieved from the arguments.
        return new LiteralExpression(value1.substring(value2, value2 + value3));
    }

    // Returns the SQL type that this scalar function should return.
    public int getReturnType()
    {
        return Types.VARCHAR;
    }

    // Returns the maximum size that the scalar function value can be. NOTE: for
    // scalar functions returning numeric values, this should be 0.
    public int getMaxSize()
    {
        return 255;
    }

    // For scalar functions returning string values, this function should be implemented.
    // For numeric functions, the public Boolean canReturnNumeric(), returning true, 
    // should be implemented instead.
    public boolean canReturnString ()
    {
        return true;
    }
}



______________________________________________________________________________________

Copyright BASIS International Ltd. BBj®, Visual PRO/5®, PRO/5®, and BBx® are registered trademarks.