public final void addSQL()

in empire-db/src/main/java/org/apache/empire/db/expr/column/DBAbstractFuncExpr.java [274:343]


    public final void addSQL(DBSQLBuilder sql, String template, Object[] params, long context)
    {
        // parse template
        int pos=0, prev=0, len=template.length();
        while (pos<len)
        {
            char c = template.charAt(pos);
            // Expression
            if (c=='?') {
                if (prev<pos)
                    sql.append(template.substring(prev, pos));
                // expression
                expr.addSQL(sql, (context & ~CTX_ALIAS));
                // next
                prev = ++pos;
            }
            // Placeholder
            else if (c=='{') {
                if (prev<pos)
                    sql.append(template.substring(prev, pos));
                // find index
                int end = ++pos;
                for (;end<len;end++)
                {   // check digit
                    char digit = template.charAt(end);
                    if (digit<'0' || digit>'9')
                        break;
                }
                if (end>=len)
                    throw new InvalidArgumentException("template", template);
                // parse index
                int iParam = Integer.parseInt(template.substring(pos, end));
                if (iParam<0 || iParam>=params.length)
                    throw new InvalidArgumentException("params", params);
                // find end
                for (end=++pos;end<len;end++)
                {   // check terminator
                    if (template.charAt(end)=='}')
                        break;
                }
                if (end>=len)
                    throw new InvalidArgumentException("template", template);
                // DataType
                DataType paramDataType = expr.getDataType();
                if (template.charAt(pos)==':')
                {   // Yes, get the DataType name and look it up
                    String typeName = template.substring(pos+1, end);
                    if (StringUtils.isNotEmpty(typeName) && !typeName.equals("*"))
                        paramDataType = DataType.valueOf(typeName);
                    else if (typeName.equals("*") || params[iParam]==null || (params[iParam] instanceof DBExpr))
                        paramDataType = DataType.UNKNOWN;   /* use as literal */
                    else
                        paramDataType = DataType.fromJavaType(params[iParam].getClass());
                }
                // append value
                sql.appendValue(paramDataType, params[iParam], CTX_DEFAULT, ",");
                // next
                prev = pos = end+1;
            }
            else 
                pos++; // next
        }
        if (prev < len)
        {   // add the rest
            sql.append(template.substring(prev));
            // special case: Nothing added yet
            if (prev==0)
                log.warn("No Placeholder found in template {}", template);
        }
    }