drill-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "ASF GitHub Bot (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (DRILL-5419) Calculate return string length for literals & some string functions
Date Fri, 05 May 2017 12:31:04 GMT

    [ https://issues.apache.org/jira/browse/DRILL-5419?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15998271#comment-15998271
] 

ASF GitHub Bot commented on DRILL-5419:
---------------------------------------

Github user arina-ielchiieva commented on a diff in the pull request:

    https://github.com/apache/drill/pull/819#discussion_r114963380
  
    --- Diff: exec/java-exec/src/main/java/org/apache/drill/exec/expr/fn/DrillStringLeftRightFuncHolder.java
---
    @@ -0,0 +1,72 @@
    +/*
    + * Licensed to the Apache Software Foundation (ASF) under one or more
    + * contributor license agreements.  See the NOTICE file distributed with
    + * this work for additional information regarding copyright ownership.
    + * The ASF licenses this file to you under the Apache License, Version 2.0
    + * (the "License"); you may not use this file except in compliance with
    + * the License.  You may obtain a copy of the License at
    + *
    + * http://www.apache.org/licenses/LICENSE-2.0
    + *
    + * Unless required by applicable law or agreed to in writing, software
    + * distributed under the License is distributed on an "AS IS" BASIS,
    + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    + * See the License for the specific language governing permissions and
    + * limitations under the License.
    + */
    +package org.apache.drill.exec.expr.fn;
    +
    +import org.apache.drill.common.expression.LogicalExpression;
    +import org.apache.drill.common.expression.ValueExpressions;
    +import org.apache.drill.common.types.TypeProtos;
    +import org.apache.drill.common.types.Types;
    +import org.apache.drill.exec.expr.fn.impl.StringFunctionHelpers;
    +
    +import java.util.List;
    +
    +/**
    + * Function holder for functions with function scope set as
    + * {@link org.apache.drill.exec.expr.annotations.FunctionTemplate.FunctionScope#STRING_LEFT_RIGHT}.
    + */
    +public class DrillStringLeftRightFuncHolder extends DrillSimpleFuncHolder  {
    +
    +  public DrillStringLeftRightFuncHolder(FunctionAttributes functionAttributes, FunctionInitializer
initializer) {
    +    super(functionAttributes, initializer);
    +  }
    +
    +  /**
    +   * Defines function return type and calculates output precision.
    +   *
    +   * Target length calculation logic for left and right functions is the same,
    +   * they substring string the same way, just from different sides of the string.
    +   *
    +   * <b>left(source, length)</b>
    +   * <b>right(source, length)</b>
    +   *
    +   * <ul>If length is positive, target length is given length.</ul>
    +   * <ul>If length is negative, target length is source length minus given length.
    +   * If after substraction length is negative, target length is 0.</ul>
    +   * <ul>If length is 0, target length is 0.<ul/>
    +   *
    +   * @param logicalExpressions logical expressions
    +   * @return return type
    +   */
    +  @Override
    +  public TypeProtos.MajorType getReturnType(List<LogicalExpression> logicalExpressions)
{
    +    TypeProtos.MajorType.Builder builder = TypeProtos.MajorType.newBuilder()
    +        .setMinorType(getReturnType().getMinorType())
    +        .setMode(getReturnTypeDataMode(logicalExpressions));
    +
    +    int sourceLength = logicalExpressions.get(0).getMajorType().hasPrecision() ?
    --- End diff --
    
    I have excluded substring / substr / left / right functions length calculation from this
PR. Jira DRILL-5476 is created to address length calculation logic for these functions later.


> Calculate return string length for literals & some string functions
> -------------------------------------------------------------------
>
>                 Key: DRILL-5419
>                 URL: https://issues.apache.org/jira/browse/DRILL-5419
>             Project: Apache Drill
>          Issue Type: Bug
>    Affects Versions: 1.9.0
>            Reporter: Arina Ielchiieva
>            Assignee: Arina Ielchiieva
>         Attachments: version_with_cast.JPG
>
>
> Though Drill is schema-less and cannot determine in advance what the length of the column
should be but if query has an explicit type/length specified, Drill should return correct
column length.
> For example, JDBC / ODBC Driver is ALWAYS returning 64K as the length of a varchar or
char even if casts are applied.
> Changes:
> *LITERALS*
> String literals length is the same as actual literal length.
> Example: for 'aaa' return length is 3.
> *CAST*
> Return length is the one indicated in cast expression. This also applies when user has
created view where each string columns was casted to varchar with some specific length.
> This length will be returned to the user without need to apply cast one more time. Below
mentioned functions can take leverage of underlying varchar length and calculate return length.
> *LOWER, UPPER, INITCAP, REVERSE, FIRST_VALUE, LAST_VALUE* 
> Return length is underlying column length, i.e. if column is known, the same length will
be returned.
> Example:
> lower(cast(col as varchar(30))) will return 30.
> lower(col) will return max varchar length, since we don't know actual column length.
> *LAG, LEAD*
> Return length is underlying column length but column type will be nullable.
> *LPAD, RPAD*
> Pads the string to the length specified. Return length is this specified length. 
> *CONCAT, CONCAT OPERATOR (||)*
> Return length is sum of underlying columns length. If length is greater then varchar
max length,  varchar max length is returned.
> *IF EXPRESSIONS (CASE STATEMENT, COALESCE), UNION OPERATOR*
> When combining string columns with different length, return length is max from source
columns.



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

Mime
View raw message