<!DOCTYPE html>
<!--
 | Generated by Apache Maven Doxia at 2017-09-14
 | Rendered using Apache Maven Fluido Skin 1.3.0
-->
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta name="Date-Revision-yyyymmdd" content="20170914" />
    <meta http-equiv="Content-Language" content="en" />
    <title>AsterixDB &#x2013; Builtin Functions</title>
    <link rel="stylesheet" href="../css/apache-maven-fluido-1.3.0.min.css" />
    <link rel="stylesheet" href="../css/site.css" />
    <link rel="stylesheet" href="../css/print.css" media="print" />

      
    <script type="text/javascript" src="../js/apache-maven-fluido-1.3.0.min.js"></script>

                          
        

          
            </head>
        <body class="topBarDisabled">
          
                
                    
    
        <div class="container-fluid">
          <div id="banner">
        <div class="pull-left">
                                                  <a href=".././" id="bannerLeft">
                                                                                                <img src="../images/asterixlogo.png"  alt="AsterixDB"/>
                </a>
                      </div>
        <div class="pull-right">  </div>
        <div class="clear"><hr/></div>
      </div>

      <div id="breadcrumbs">
        <ul class="breadcrumb">
                
                    
                  <li id="publishDate">Last Published: 2017-09-14</li>
                      
                
                    
                 <li id="projectVersion" class="pull-right">Version: 0.9.2</li>
      
                                            <li class="divider pull-right">|</li>
                        
    <li class="pull-right">              <a href="../index.html" title="Documentation Home">
        Documentation Home</a>
  </li>

                        </ul>
      </div>

            
      <div class="row-fluid">
        <div id="leftColumn" class="span3">
          <div class="well sidebar-nav">
                
                    
                <ul class="nav nav-list">
                    <li class="nav-header">Get Started - Installation</li>
                                
      <li>
    
                          <a href="../ncservice.html" title="Option 1: using NCService">
          <i class="none"></i>
        Option 1: using NCService</a>
            </li>
                  
      <li>
    
                          <a href="../ansible.html" title="Option 2: using Ansible">
          <i class="none"></i>
        Option 2: using Ansible</a>
            </li>
                  
      <li>
    
                          <a href="../aws.html" title="Option 3: using Amazon Web Services">
          <i class="none"></i>
        Option 3: using Amazon Web Services</a>
            </li>
                  
      <li>
    
                          <a href="../yarn.html" title="Option 4: using YARN">
          <i class="none"></i>
        Option 4: using YARN</a>
            </li>
                  
      <li>
    
                          <a href="../install.html" title="Option 5: using Managix (deprecated)">
          <i class="none"></i>
        Option 5: using Managix (deprecated)</a>
            </li>
                              <li class="nav-header">AsterixDB Primer</li>
                                
      <li>
    
                          <a href="../sqlpp/primer-sqlpp.html" title="Option 1: using SQL++">
          <i class="none"></i>
        Option 1: using SQL++</a>
            </li>
                  
      <li>
    
                          <a href="../aql/primer.html" title="Option 2: using AQL">
          <i class="none"></i>
        Option 2: using AQL</a>
            </li>
                              <li class="nav-header">Data Model</li>
                                
      <li>
    
                          <a href="../datamodel.html" title="The Asterix Data Model">
          <i class="none"></i>
        The Asterix Data Model</a>
            </li>
                              <li class="nav-header">Queries - SQL++</li>
                                
      <li>
    
                          <a href="../sqlpp/manual.html" title="The SQL++ Query Language">
          <i class="none"></i>
        The SQL++ Query Language</a>
            </li>
                  
      <li>
    
                          <a href="../sqlpp/builtins.html" title="Builtin Functions">
          <i class="none"></i>
        Builtin Functions</a>
            </li>
                              <li class="nav-header">Queries - AQL</li>
                                
      <li>
    
                          <a href="../aql/manual.html" title="The Asterix Query Language (AQL)">
          <i class="none"></i>
        The Asterix Query Language (AQL)</a>
            </li>
                  
      <li class="active">
    
            <a href="#"><i class="none"></i>Builtin Functions</a>
          </li>
                              <li class="nav-header">API/SDK</li>
                                
      <li>
    
                          <a href="../api.html" title="HTTP API">
          <i class="none"></i>
        HTTP API</a>
            </li>
                  
      <li>
    
                          <a href="../csv.html" title="CSV Output">
          <i class="none"></i>
        CSV Output</a>
            </li>
                              <li class="nav-header">Advanced Features</li>
                                
      <li>
    
                          <a href="../aql/fulltext.html" title="Support of Full-text Queries">
          <i class="none"></i>
        Support of Full-text Queries</a>
            </li>
                  
      <li>
    
                          <a href="../aql/externaldata.html" title="Accessing External Data">
          <i class="none"></i>
        Accessing External Data</a>
            </li>
                  
      <li>
    
                          <a href="../feeds/tutorial.html" title="Support for Data Ingestion">
          <i class="none"></i>
        Support for Data Ingestion</a>
            </li>
                  
      <li>
    
                          <a href="../udf.html" title="User Defined Functions">
          <i class="none"></i>
        User Defined Functions</a>
            </li>
                  
      <li>
    
                          <a href="../aql/filters.html" title="Filter-Based LSM Index Acceleration">
          <i class="none"></i>
        Filter-Based LSM Index Acceleration</a>
            </li>
                  
      <li>
    
                          <a href="../aql/similarity.html" title="Support of Similarity Queries">
          <i class="none"></i>
        Support of Similarity Queries</a>
            </li>
            </ul>
                
                    
                
          <hr class="divider" />

           <div id="poweredBy">
                            <div class="clear"></div>
                            <div class="clear"></div>
                            <div class="clear"></div>
                                                                                                                         <a href=".././" title="AsterixDB" class="builtBy">
        <img class="builtBy"  alt="AsterixDB" src="../images/asterixlogo.png"    />
      </a>
                      </div>
          </div>
        </div>
        
                
        <div id="bodyColumn"  class="span9" >
                                  
            <!-- ! 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.
 ! --><h1>Builtin Functions</h1>
<div class="section">
<h2><a name="Table_of_Contents"></a><a name="toc" id="toc">Table of Contents</a></h2>

<ul>
  
<li><a href="#NumericFunctions">Numeric Functions</a></li>
  
<li><a href="#StringFunctions">String Functions</a></li>
  
<li><a href="#BinaryFunctions">Binary Functions</a></li>
  
<li><a href="#SpatialFunctions">Spatial Functions</a></li>
  
<li><a href="#SimilarityFunctions">Similarity Functions</a></li>
  
<li><a href="#TokenizingFunctions">Tokenizing Functions</a></li>
  
<li><a href="#TemporalFunctions">Temporal Functions</a></li>
  
<li><a href="#ObjectFunctions">Object Functions</a></li>
  
<li><a href="#AggregateFunctions">Aggregate Functions (Array Functions)</a></li>
  
<li><a href="#ComparisonFunctions">Comparison Functions</a></li>
  
<li><a href="#TypeFunctions">Type Functions</a></li>
  
<li><a href="#ConditionalFunctions">Conditional Functions</a></li>
  
<li><a href="#MiscFunctions">Miscellaneous Functions</a></li>
</ul>
<p>The system provides various classes of functions to support operations on numeric, string, spatial, and temporal data. This document explains how to use these functions. <!-- ! 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.
 ! --></p></div>
<div class="section">
<h2><a name="Numeric_Functions"></a><a name="NumericFunctions" id="NumericFunctions">Numeric Functions</a></h2>
<div class="section">
<h3><a name="abs"></a>abs</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>abs(numeric_value)
</pre></div></div></li>
  
<li>
<p>Computes the absolute value of the argument.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>numeric_value</tt>: a <tt>tinyint</tt>/<tt>smallint</tt>/<tt>integer</tt>/<tt>bigint</tt>/<tt>float</tt>/<tt>double</tt> value.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>The absolute value of the argument with the same type as the input argument,</li>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if the argument is a <tt>null</tt> value,</li>
    
<li>any other non-numeric input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: abs(2013), &quot;v2&quot;: abs(-4036), &quot;v3&quot;: abs(0), &quot;v4&quot;: abs(float(&quot;-2013.5&quot;)), &quot;v5&quot;: abs(double(&quot;-2013.593823748327284&quot;)) };
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: 2013, &quot;v2&quot;: 4036, &quot;v3&quot;: 0, &quot;v4&quot;: 2013.5, &quot;v5&quot;: 2013.5938237483274 }
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="acos"></a>acos</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>acos(numeric_value)
</pre></div></div></li>
  
<li>
<p>Computes the arc cosine value of the argument.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>numeric_value</tt>: a <tt>tinyint</tt>/<tt>smallint</tt>/<tt>integer</tt>/<tt>bigint</tt>/<tt>float</tt>/<tt>double</tt> value.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>the <tt>double</tt> arc cosine in radians for the argument,  if the argument is in the range of -1 (inclusive) to 1 (inclusive),</li>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if the argument is a <tt>null</tt> value,</li>
    
<li>any other non-numeric input value will cause a type error,</li>
    
<li>&#x201c;NaN&#x201d; for other legitimate numeric values.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: acos(1), &quot;v2&quot;: acos(2), &quot;v3&quot;: acos(0), &quot;v4&quot;: acos(float(&quot;0.5&quot;)), &quot;v5&quot;: acos(double(&quot;-0.5&quot;)) };
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: 0.0, &quot;v2&quot;: &quot;NaN&quot;, &quot;v3&quot;: 1.5707963267948966, &quot;v4&quot;: 1.0471975511965979, &quot;v5&quot;: 2.0943951023931957 }
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="asin"></a>asin</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>asin(numeric_value)
</pre></div></div></li>
  
<li>
<p>Computes the arc sine value of the argument.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>numeric_value</tt>: a <tt>tinyint</tt>/<tt>smallint</tt>/<tt>integer</tt>/<tt>bigint</tt>/<tt>float</tt>/<tt>double</tt> value.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>the <tt>double</tt> arc sin in radians for the argument,  if the argument is in the range of -1 (inclusive) to 1 (inclusive),</li>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if the argument is a <tt>null</tt> value,</li>
    
<li>any other non-numeric input value will cause a type error,</li>
    
<li>&#x201c;NaN&#x201d; for other legitimate numeric values.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: asin(1), &quot;v2&quot;: asin(2), &quot;v3&quot;: asin(0), &quot;v4&quot;: asin(float(&quot;0.5&quot;)), &quot;v5&quot;: asin(double(&quot;-0.5&quot;)) };
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: 1.5707963267948966, &quot;v2&quot;: &quot;NaN&quot;, &quot;v3&quot;: 0.0, &quot;v4&quot;: 0.5235987755982989, &quot;v5&quot;: -0.5235987755982989 }
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="atan"></a>atan</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>atan(numeric_value)
</pre></div></div></li>
  
<li>
<p>Computes the arc tangent value of the argument.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>numeric_value</tt>: a <tt>tinyint</tt>/<tt>smallint</tt>/<tt>integer</tt>/<tt>bigint</tt>/<tt>float</tt>/<tt>double</tt> value.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>the <tt>double</tt> arc tangent in radians for the argument,</li>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if the argument is a <tt>null</tt> value,</li>
    
<li>any other non-numeric input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: atan(1), &quot;v2&quot;: atan(2), &quot;v3&quot;: atan(0), &quot;v4&quot;: atan(float(&quot;0.5&quot;)), &quot;v5&quot;: atan(double(&quot;1000&quot;)) };
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: 0.7853981633974483, &quot;v2&quot;: 1.1071487177940904, &quot;v3&quot;: 0.0, &quot;v4&quot;: 0.4636476090008061, &quot;v5&quot;: 1.5697963271282298 }
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="atan2"></a>atan2</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>atan2(numeric_value1, numeric_value2)
</pre></div></div></li>
  
<li>
<p>Computes the arc tangent value of numeric_value2/numeric_value1.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>numeric_value1</tt>: a <tt>tinyint</tt>/<tt>smallint</tt>/<tt>integer</tt>/<tt>bigint</tt>/<tt>float</tt>/<tt>double</tt> value,</li>
    
<li><tt>numeric_value2</tt>: a <tt>tinyint</tt>/<tt>smallint</tt>/<tt>integer</tt>/<tt>bigint</tt>/<tt>float</tt>/<tt>double</tt> value.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>the <tt>double</tt> arc tangent in radians for <tt>numeric_value1</tt> and <tt>numeric_value2</tt>,</li>
    
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>any other non-numeric input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: atan2(1, 2), &quot;v2&quot;: atan2(0, 4), &quot;v3&quot;: atan2(float(&quot;0.5&quot;), double(&quot;-0.5&quot;)) };
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: 0.4636476090008061, &quot;v2&quot;: 0.0, &quot;v3&quot;: 2.356194490192345 }
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="ceil"></a>ceil</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>ceil(numeric_value)
</pre></div></div></li>
  
<li>
<p>Computes the smallest (closest to negative infinity) number with no fractional part that is not less than the value of the argument. If the argument is already equal to mathematical integer, then the result is the same as the argument.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>numeric_value</tt>: a <tt>tinyint</tt>/<tt>smallint</tt>/<tt>integer</tt>/<tt>bigint</tt>/<tt>float</tt>/<tt>double</tt> value.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>The ceiling value for the given number in the same type as the input argument,</li>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if the argument is a <tt>null</tt> value,</li>
    
<li>any other non-numeric input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{
  &quot;v1&quot;: ceil(2013),
  &quot;v2&quot;: ceil(-4036),
  &quot;v3&quot;: ceil(0.3),
  &quot;v4&quot;: ceil(float(&quot;-2013.2&quot;)),
  &quot;v5&quot;: ceil(double(&quot;-2013.893823748327284&quot;))
};
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: 2013, &quot;v2&quot;: -4036, &quot;v3&quot;: 1.0, &quot;v4&quot;: -2013.0, &quot;v5&quot;: -2013.0 }
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="cos"></a>cos</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>cos(numeric_value)
</pre></div></div></li>
  
<li>
<p>Computes the cosine value of the argument.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>numeric_value</tt>: a <tt>tinyint</tt>/<tt>smallint</tt>/<tt>integer</tt>/<tt>bigint</tt>/<tt>float</tt>/<tt>double</tt> value.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>the <tt>double</tt> cosine value for the argument,</li>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if the argument is a <tt>null</tt> value,</li>
    
<li>any other non-numeric input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: cos(1), &quot;v2&quot;: cos(2), &quot;v3&quot;: cos(0), &quot;v4&quot;: cos(float(&quot;0.5&quot;)), &quot;v5&quot;: cos(double(&quot;1000&quot;)) };
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: 0.5403023058681398, &quot;v2&quot;: -0.4161468365471424, &quot;v3&quot;: 1.0, &quot;v4&quot;: 0.8775825618903728, &quot;v5&quot;: 0.562379076290703 }
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="exp"></a>exp</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>exp(numeric_value)
</pre></div></div></li>
  
<li>
<p>Computes e<sup>numeric_value</sup>.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>numeric_value</tt>: a <tt>tinyint</tt>/<tt>smallint</tt>/<tt>integer</tt>/<tt>bigint</tt>/<tt>float</tt>/<tt>double</tt> value.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>e<sup>numeric_value</sup>,</li>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if the argument is a <tt>null</tt> value,</li>
    
<li>any other non-numeric input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: exp(1), &quot;v2&quot;: exp(2), &quot;v3&quot;: exp(0), &quot;v4&quot;: exp(float(&quot;0.5&quot;)), &quot;v5&quot;: exp(double(&quot;1000&quot;)) };
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: 2.718281828459045, &quot;v2&quot;: 7.38905609893065, &quot;v3&quot;: 1.0, &quot;v4&quot;: 1.6487212707001282, &quot;v5&quot;: &quot;Infinity&quot; }
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="floor"></a>floor</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>floor(numeric_value)
</pre></div></div></li>
  
<li>
<p>Computes the largest (closest to positive infinity) number with no fractional part that is not greater than the value.  If the argument is already equal to mathematical integer, then the result is the same as the argument.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>numeric_value</tt>: a <tt>tinyint</tt>/<tt>smallint</tt>/<tt>integer</tt>/<tt>bigint</tt>/<tt>float</tt>/<tt>double</tt> value.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>The floor value for the given number in the same type as the input argument,</li>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if the argument is a <tt>null</tt> value,</li>
    
<li>any other non-numeric input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{
  &quot;v1&quot;: floor(2013),
  &quot;v2&quot;: floor(-4036),
  &quot;v3&quot;: floor(0.8),
  &quot;v4&quot;: floor(float(&quot;-2013.2&quot;)),
  &quot;v5&quot;: floor(double(&quot;-2013.893823748327284&quot;))
};
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: 2013, &quot;v2&quot;: -4036, &quot;v3&quot;: 0.0, &quot;v4&quot;: -2014.0, &quot;v5&quot;: -2014.0 }
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="ln"></a>ln</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>ln(numeric_value)
</pre></div></div></li>
  
<li>
<p>Computes log<sub>e</sub>numeric_value.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>numeric_value</tt>: a <tt>tinyint</tt>/<tt>smallint</tt>/<tt>integer</tt>/<tt>bigint</tt>/<tt>float</tt>/<tt>double</tt> value.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>log<sub>e</sub>numeric_value,</li>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if the argument is a <tt>null</tt> value,</li>
    
<li>any other non-numeric input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: ln(1), &quot;v2&quot;: ln(2), &quot;v3&quot;: ln(0), &quot;v4&quot;: ln(float(&quot;0.5&quot;)), &quot;v5&quot;: ln(double(&quot;1000&quot;)) };
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: 0.0, &quot;v2&quot;: 0.6931471805599453, &quot;v3&quot;: &quot;-Infinity&quot;, &quot;v4&quot;: -0.6931471805599453, &quot;v5&quot;: 6.907755278982137 }
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="log"></a>log</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>log(numeric_value)
</pre></div></div></li>
  
<li>
<p>Computes log<sub>10</sub>numeric_value.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>numeric_value</tt>: a <tt>tinyint</tt>/<tt>smallint</tt>/<tt>integer</tt>/<tt>bigint</tt>/<tt>float</tt>/<tt>double</tt> value.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>log<sub>10</sub>numeric_value,</li>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if the argument is a <tt>null</tt> value,</li>
    
<li>any other non-numeric input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: log(1), &quot;v2&quot;: log(2), &quot;v3&quot;: log(0), &quot;v4&quot;: log(float(&quot;0.5&quot;)), &quot;v5&quot;: log(double(&quot;1000&quot;)) };
</pre></div></div></li>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: 0.0, &quot;v2&quot;: 0.3010299956639812, &quot;v3&quot;: &quot;-Infinity&quot;, &quot;v4&quot;: -0.3010299956639812, &quot;v5&quot;: 3.0 }
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="power"></a>power</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>power(numeric_value1, numeric_value2)
</pre></div></div></li>
  
<li>
<p>Computes numeric_value1<sup>numeric_value2</sup>.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>numeric_value1</tt>: a <tt>tinyint</tt>/<tt>smallint</tt>/<tt>integer</tt>/<tt>bigint</tt>/<tt>float</tt>/<tt>double</tt> value,</li>
    
<li><tt>numeric_value2</tt>: a <tt>tinyint</tt>/<tt>smallint</tt>/<tt>integer</tt>/<tt>bigint</tt>/<tt>float</tt>/<tt>double</tt> value.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>numeric_value1<sup>numeric_value2</sup>,</li>
    
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>any other non-numeric input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: power(1, 2), &quot;v3&quot;: power(0, 4), &quot;v4&quot;: power(float(&quot;0.5&quot;), double(&quot;-0.5&quot;)) };
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: 1, &quot;v3&quot;: 0, &quot;v4&quot;: 1.4142135623730951 }
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="round"></a>round</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>round(numeric_value)
</pre></div></div></li>
  
<li>
<p>Computes the number with no fractional part that is closest (and also closest to positive infinity) to the argument.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>numeric_value</tt>: a <tt>tinyint</tt>/<tt>smallint</tt>/<tt>integer</tt>/<tt>bigint</tt>/<tt>float</tt>/<tt>double</tt> value.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>The rounded value for the given number in the same type as the input argument,</li>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if the argument is a <tt>null</tt> value,</li>
    
<li>any other non-numeric input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{
  &quot;v1&quot;: round(2013),
  &quot;v2&quot;: round(-4036),
  &quot;v3&quot;: round(0.8),
  &quot;v4&quot;: round(float(&quot;-2013.256&quot;)),
  &quot;v5&quot;: round(double(&quot;-2013.893823748327284&quot;))
};
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: 2013, &quot;v2&quot;: -4036, &quot;v3&quot;: 1.0, &quot;v4&quot;: -2013.0, &quot;v5&quot;: -2014.0 }
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="sign"></a>sign</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>sign(numeric_value)
</pre></div></div></li>
  
<li>
<p>Computes the sign of the argument.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>numeric_value</tt>: a <tt>tinyint</tt>/<tt>smallint</tt>/<tt>integer</tt>/<tt>bigint</tt>/<tt>float</tt>/<tt>double</tt> value.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>the sign (a <tt>tinyint</tt>) of the argument, -1 for negative values, 0 for 0, and 1 for positive values,</li>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if the argument is a <tt>null</tt> value,</li>
    
<li>any other non-numeric input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: sign(1), &quot;v2&quot;: sign(2), &quot;v3&quot;: sign(0), &quot;v4&quot;: sign(float(&quot;0.5&quot;)), &quot;v5&quot;: sign(double(&quot;-1000&quot;)) };
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: 1, &quot;v2&quot;: 1, &quot;v3&quot;: 0, &quot;v4&quot;: 1, &quot;v5&quot;: -1 }
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="sin"></a>sin</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>sin(numeric_value)
</pre></div></div></li>
  
<li>
<p>Computes the sine value of the argument.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>numeric_value</tt>: a <tt>tinyint</tt>/<tt>smallint</tt>/<tt>integer</tt>/<tt>bigint</tt>/<tt>float</tt>/<tt>double</tt> value.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>the <tt>double</tt> sine value for the argument,</li>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if the argument is a <tt>null</tt> value,</li>
    
<li>any other non-numeric input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: sin(1), &quot;v2&quot;: sin(2), &quot;v3&quot;: sin(0), &quot;v4&quot;: sin(float(&quot;0.5&quot;)), &quot;v5&quot;: sin(double(&quot;1000&quot;)) };
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: 0.8414709848078965, &quot;v2&quot;: 0.9092974268256817, &quot;v3&quot;: 0.0, &quot;v4&quot;: 0.479425538604203, &quot;v5&quot;: 0.8268795405320025 }
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="sqrt"></a>sqrt</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>sqrt(numeric_value)
</pre></div></div></li>
  
<li>
<p>Computes the square root of the argument.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>numeric_value</tt>: a <tt>tinyint</tt>/<tt>smallint</tt>/<tt>integer</tt>/<tt>bigint</tt>/<tt>float</tt>/<tt>double</tt> value.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>the <tt>double</tt> square root value for the argument,</li>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if the argument is a <tt>null</tt> value,</li>
    
<li>any other non-numeric input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: sqrt(1), &quot;v2&quot;: sqrt(2), &quot;v3&quot;: sqrt(0), &quot;v4&quot;: sqrt(float(&quot;0.5&quot;)), &quot;v5&quot;: sqrt(double(&quot;1000&quot;)) };
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: 1.0, &quot;v2&quot;: 1.4142135623730951, &quot;v3&quot;: 0.0, &quot;v4&quot;: 0.7071067811865476, &quot;v5&quot;: 31.622776601683793 }
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="tan"></a>tan</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>tan(numeric_value)
</pre></div></div></li>
  
<li>
<p>Computes the tangent value of the argument.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>numeric_value</tt>: a <tt>tinyint</tt>/<tt>smallint</tt>/<tt>integer</tt>/<tt>bigint</tt>/<tt>float</tt>/<tt>double</tt> value.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>the <tt>double</tt> tangent value for the argument,</li>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if the argument is a <tt>null</tt> value,</li>
    
<li>any other non-numeric input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: tan(1), &quot;v2&quot;: tan(2), &quot;v3&quot;: tan(0), &quot;v4&quot;: tan(float(&quot;0.5&quot;)), &quot;v5&quot;: tan(double(&quot;1000&quot;)) };
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: 1.5574077246549023, &quot;v2&quot;: -2.185039863261519, &quot;v3&quot;: 0.0, &quot;v4&quot;: 0.5463024898437905, &quot;v5&quot;: 1.4703241557027185 }
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="trunc"></a>trunc</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>trunc(numeric_value, number_digits)
</pre></div></div></li>
  
<li>
<p>Truncates the number to the given number of integer digits to the right of the decimal point (left if digits is negative). Digits is 0 if not given.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>numeric_value</tt>: a <tt>tinyint</tt>/<tt>smallint</tt>/<tt>integer</tt>/<tt>bigint</tt>/<tt>float</tt>/<tt>double</tt> value,</li>
    
<li><tt>number_digits</tt>: a <tt>tinyint</tt>/<tt>smallint</tt>/<tt>integer</tt>/<tt>bigint</tt> value.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>the <tt>double</tt> tangent value for the argument,</li>
    
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is <tt>missing</tt>,</li>
    
<li>a type error will be raised if:
    
<ul>
      
<li>the first argument is any other non-numeric value,</li>
      
<li>the second argument is any other non-tinyint, non-smallint, non-integer, and non-bigint value.</li>
    </ul></li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: trunc(1, 1), &quot;v2&quot;: trunc(2, -2), &quot;v3&quot;: trunc(0.122, 2), &quot;v4&quot;: trunc(float(&quot;11.52&quot;), -1), &quot;v5&quot;: trunc(double(&quot;1000.5252&quot;), 3) };
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: 1, &quot;v2&quot;: 2, &quot;v3&quot;: 0.12, &quot;v4&quot;: 10.0, &quot;v5&quot;: 1000.525 }
</pre></div></div></li>
</ul>
<!-- ! 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.
 ! --></div>
<div class="section">
<h3><a name="round_half_to_even"></a>round_half_to_even</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>round_half_to_even(numeric_value, [precision])
</pre></div></div></li>
  
<li>
<p>Computes the closest numeric value to <tt>numeric_value</tt> that is a multiple of ten to the power of minus <tt>precision</tt>.  <tt>precision</tt> is optional and by default value <tt>0</tt> is used.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>numeric_value</tt>: a <tt>tinyint</tt>/<tt>smallint</tt>/<tt>integer</tt>/<tt>bigint</tt>/<tt>float</tt>/<tt>double</tt> value.</li>
    
<li><tt>precision</tt>: an optional <tt>tinyint</tt>/<tt>smallint</tt>/<tt>integer</tt>/<tt>bigint</tt> field representing the  number of digits in the fraction of the the result</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>The rounded value for the given number in the same type as the input argument,</li>
    
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>a type error will be raised if:
    
<ul>
      
<li>the first argument is any other non-numeric value,</li>
      
<li>or, the second argument is any other non-tinyint, non-smallint, non-integer, or non-bigint value.</li>
    </ul></li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{
  &quot;v1&quot;: round_half_to_even(2013),
  &quot;v2&quot;: round_half_to_even(-4036),
  &quot;v3&quot;: round_half_to_even(0.8),
  &quot;v4&quot;: round_half_to_even(float(&quot;-2013.256&quot;)),
  &quot;v5&quot;: round_half_to_even(double(&quot;-2013.893823748327284&quot;)),
  &quot;v6&quot;: round_half_to_even(double(&quot;-2013.893823748327284&quot;), 2),
  &quot;v7&quot;: round_half_to_even(2013, 4),
  &quot;v8&quot;: round_half_to_even(float(&quot;-2013.256&quot;), 5)
};
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: 2013, &quot;v2&quot;: -4036, &quot;v3&quot;: 1.0, &quot;v4&quot;: -2013.0, &quot;v5&quot;: -2014.0, &quot;v6&quot;: -2013.89, &quot;v7&quot;: 2013, &quot;v8&quot;: -2013.256 }
</pre></div></div></li>
</ul>
<!-- ! 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.
 ! --></div></div>
<div class="section">
<h2><a name="String_Functions"></a><a name="StringFunctions" id="StringFunctions">String Functions</a></h2>
<div class="section">
<h3><a name="concat"></a>concat</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>concat(string1, string2, ...)
</pre></div></div></li>
  
<li>
<p>Returns a concatenated string from arguments.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>string1</tt>: a string value,</li>
    
<li><tt>string2</tt>: a string value,</li>
    
<li>&#x2026;.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a concatenated string from arguments,</li>
    
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>any other non-string input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>concat(&quot;test &quot;, &quot;driven &quot;, &quot;development&quot;);
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>&quot;test driven development&quot;
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="contains"></a>contains</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>contains(string, substring_to_contain)
</pre></div></div></li>
  
<li>
<p>Checks whether the string <tt>string</tt> contains the string <tt>substring_to_contain</tt></p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>string</tt> : a <tt>string</tt> that might contain the given substring,</li>
    
<li><tt>substring_to_contain</tt> : a target <tt>string</tt> that might be contained.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>boolean</tt> value, <tt>true</tt> if <tt>string</tt> contains <tt>substring_to_contain</tt>,</li>
    
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>any other non-string input value will cause a type error,</li>
    
<li><tt>false</tt> otherwise.</li>
  </ul></li>
  
<li>
<p>Note: an <a href="similarity.html#UsingIndexesToSupportSimilarityQueries">n_gram index</a> can be utilized for this function.</p></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: contains(&quot;I like x-phone&quot;, &quot;phone&quot;), &quot;v2&quot;: contains(&quot;one&quot;, &quot;phone&quot;) };
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: true, &quot;v2&quot;: false }
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="ends_with"></a>ends_with</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>ends_with(string, substring_to_end_with)
</pre></div></div></li>
  
<li>
<p>Checks whether the string <tt>string</tt> ends with the string <tt>substring_to_end_with</tt>.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>string</tt> : a <tt>string</tt> that might end with the given string,</li>
    
<li><tt>substring_to_end_with</tt> : a <tt>string</tt> that might be contained as the ending substring.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>boolean</tt> value, <tt>true</tt> if <tt>string</tt> contains <tt>substring_to_contain</tt>,</li>
    
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>any other non-string input value will cause a type error,</li>
    
<li><tt>false</tt> otherwise.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{
  &quot;v1&quot;: ends_with(&quot; love product-b its shortcut_menu is awesome:)&quot;, &quot;:)&quot;),
  &quot;v2&quot;: ends_with(&quot; awsome:)&quot;, &quot;:-)&quot;)
};
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: true, &quot;v2&quot;: false }
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="initcap_or_title"></a>initcap (or title)</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>initcap(string)
</pre></div></div></li>
  
<li>
<p>Converts a given string <tt>string</tt> so that the first letter of each word is uppercase and  every other letter is lowercase. The function has an alias called &#x201c;title&#x201d;.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>string</tt> : a <tt>string</tt> to be converted.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>string</tt> as the title form of the given <tt>string</tt>,</li>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if the argument is a <tt>null</tt> value,</li>
    
<li>any other non-string input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: initcap(&quot;ASTERIXDB is here!&quot;), &quot;v2&quot;: title(&quot;ASTERIXDB is here!&quot;) };
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: &quot;Asterixdb Is Here!&quot;, &quot;v2&quot;: &quot;Asterixdb Is Here!&quot; }
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="length"></a>length</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>length(string)
</pre></div></div></li>
  
<li>
<p>Returns the length of the string <tt>string</tt>.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>string</tt> : a <tt>string</tt> or <tt>null</tt> that represents the string to be checked.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>an <tt>bigint</tt> that represents the length of <tt>string</tt>,</li>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if the argument is a <tt>null</tt> value,</li>
    
<li>any other non-string input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>length(&quot;test string&quot;);
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>11
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="lower"></a>lower</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>lower(string)
</pre></div></div></li>
  
<li>
<p>Converts a given string <tt>string</tt> to its lowercase form.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>string</tt> : a <tt>string</tt> to be converted.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>string</tt> as the lowercase form of the given <tt>string</tt>,</li>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if the argument is a <tt>null</tt> value,</li>
    
<li>any other non-string input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>lower(&quot;ASTERIXDB&quot;);
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>&quot;asterixdb&quot;
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="ltrim"></a>ltrim</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>ltrim(string[, chars]);
</pre></div></div></li>
  
<li>
<p>Returns a new string with all leading characters that appear in <tt>chars</tt> removed.  By default, white space is the character to trim.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>string</tt> : a <tt>string</tt> to be trimmed,</li>
    
<li><tt>chars</tt> : a <tt>string</tt> that contains characters that are used to trim.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a trimmed, new <tt>string</tt>,</li>
    
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>any other non-string input value will cause a type error.</li>
  </ul></li>
</ul>

<ul>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>ltrim(&quot;me like x-phone&quot;, &quot;eml&quot;);
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>&quot; like x-phone&quot;
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="position"></a>position</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>position(string, string_pattern)
</pre></div></div></li>
  
<li>
<p>Returns the first position of <tt>string_pattern</tt> within <tt>string</tt>.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>string</tt> : a <tt>string</tt> that might contain the pattern,</li>
    
<li><tt>string_pattern</tt> : a pattern <tt>string</tt> to be matched.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>the first position that <tt>string_pattern</tt> appears within <tt>string</tt>,  or -1 if it does not appear,</li>
    
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>any other non-string input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{
  &quot;v1&quot;: position(&quot;ppphonepp&quot;, &quot;phone&quot;),
  &quot;v2&quot;: position(&quot;hone&quot;, &quot;phone&quot;)
};
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: 3, &quot;v2&quot;: -1 }
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="regexp_contains"></a>regexp_contains</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>regexp_contains(string, string_pattern[, string_flags])
</pre></div></div></li>
  
<li>
<p>Checks whether the strings <tt>string</tt> contains the regular expression pattern <tt>string_pattern</tt> (a Java regular expression pattern).</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>string</tt> : a <tt>string</tt> that might contain the pattern,</li>
    
<li><tt>string_pattern</tt> : a pattern <tt>string</tt> to be matched,</li>
    
<li><tt>string_flag</tt> : (Optional) a <tt>string</tt> with flags to be used during regular expression matching.
    
<ul>
      
<li>The following modes are enabled with these flags: dotall (s), multiline (m), case_insensitive (i), and comments and whitespace (x).</li>
    </ul></li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>boolean</tt>, returns <tt>true</tt> if <tt>string</tt> contains the pattern <tt>string_pattern</tt>,</li>
    
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>any other non-string input value will cause a type error,</li>
    
<li><tt>false</tt> otherwise.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{
  &quot;v1&quot;: regexp_contains(&quot;pphonepp&quot;, &quot;p*hone&quot;),
  &quot;v2&quot;: regexp_contains(&quot;hone&quot;, &quot;p+hone&quot;)
}
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: true, &quot;v2&quot;: false }
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="regexp_like"></a>regexp_like</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>regexp_like(string, string_pattern[, string_flags])
</pre></div></div></li>
  
<li>
<p>Checks whether the string <tt>string</tt> exactly matches the regular expression pattern <tt>string_pattern</tt>  (a Java regular expression pattern).</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>string</tt> : a <tt>string</tt> that might contain the pattern,</li>
    
<li><tt>string_pattern</tt> : a pattern <tt>string</tt> that might be contained,</li>
    
<li><tt>string_flag</tt> : (Optional) a <tt>string</tt> with flags to be used during regular expression matching.
    
<ul>
      
<li>The following modes are enabled with these flags: dotall (s), multiline (m), case_insensitive (i), and comments and whitespace (x).</li>
    </ul></li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>boolean</tt> value, <tt>true</tt> if <tt>string</tt> contains the pattern <tt>string_pattern</tt>,</li>
    
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>any other non-string input value will cause a type error,</li>
    
<li><tt>false</tt> otherwise.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{
  &quot;v1&quot;: regexp_like(&quot; can't stand acast the network is horrible:(&quot;, &quot;.*acast.*&quot;),
  &quot;v2&quot;: regexp_like(&quot;acast&quot;, &quot;.*acst.*&quot;)
};
</pre></div></div></li>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: true, &quot;v2&quot;: false }
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="regexp_position"></a>regexp_position</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>regexp_position(string, string_pattern[, string_flags])
</pre></div></div></li>
  
<li>
<p>Returns first position of the regular expression <tt>string_pattern</tt> (a Java regular expression pattern)  within <tt>string</tt>.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>string</tt> : a <tt>string</tt> that might contain the pattern,</li>
    
<li><tt>string_pattern</tt> : a pattern <tt>string</tt> to be matched,</li>
    
<li><tt>string_flag</tt> : (Optional) a <tt>string</tt> with flags to be used during regular expression matching.
    
<ul>
      
<li>The following modes are enabled with these flags: dotall (s), multiline (m), case_insensitive (i), and comments and whitespace (x).</li>
    </ul></li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>the first position that the regular expression <tt>string_pattern</tt> appears in <tt>string</tt>,  or -1 if it does not appear.</li>
    
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>any other non-string input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{
  &quot;v1&quot;: regexp_position(&quot;pphonepp&quot;, &quot;p*hone&quot;),
  &quot;v2&quot;: regexp_position(&quot;hone&quot;, &quot;p+hone&quot;)
};
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: 1, &quot;v2&quot;: -1 }
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="regexp_replace"></a>regexp_replace</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>regexp_replace(string, string_pattern, string_replacement[, string_flags])
</pre></div></div></li>
  
<li>
<p>Checks whether the string <tt>string</tt> matches the given  regular expression pattern <tt>string_pattern</tt> (a Java regular expression pattern),  and replace the matched pattern <tt>string_pattern</tt> with the new pattern <tt>string_replacement</tt>.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>string</tt> : a <tt>string</tt> that might contain the pattern,</li>
    
<li><tt>string_pattern</tt> : a pattern <tt>string</tt> to be matched,</li>
    
<li><tt>string_replacement</tt> : a pattern <tt>string</tt> to be used as the replacement,</li>
    
<li><tt>string_flag</tt> : (Optional) a <tt>string</tt> with flags to be used during replace.
    
<ul>
      
<li>The following modes are enabled with these flags: dotall (s), multiline (m), case_insensitive (i), and comments and whitespace (x).</li>
    </ul></li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>Returns a <tt>string</tt> that is obtained after the replacements,</li>
    
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
    
<li>any other non-string input value will cause a type error,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>regexp_replace(&quot; like x-phone the voicemail_service is awesome&quot;, &quot; like x-phone&quot;, &quot;like product-a&quot;)
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>&quot;like product-a the voicemail_service is awesome&quot;
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="repeat"></a>repeat</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>repeat(string, n)
</pre></div></div></li>
  
<li>
<p>Returns a string formed by repeating the input <tt>string</tt> <tt>n</tt> times.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>string</tt> : a <tt>string</tt> to be repeated,</li>
    
<li><tt>offset</tt> : an <tt>tinyint</tt>/<tt>smallint</tt>/<tt>integer</tt>/<tt>bigint</tt> value as the starting offset of the substring in <tt>string</tt>.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a string that repeats the input <tt>string</tt> <tt>n</tt> times,</li>
    
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>a type error will be raised if:
    
<ul>
      
<li>the first argument is any other non-string value,</li>
      
<li>or, the second argument is not a <tt>tinyint</tt>, <tt>smallint</tt>, <tt>integer</tt>, or <tt>bigint</tt>.</li>
    </ul></li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>repeat(&quot;test&quot;, 3);
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>&quot;testtesttest&quot;
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="rtrim"></a>rtrim</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>rtrim(string[, chars]);
</pre></div></div></li>
  
<li>
<p>Returns a new string with all trailing characters that appear in <tt>chars</tt> removed.  By default, white space is the character to trim.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>string</tt> : a <tt>string</tt> to be trimmed,</li>
    
<li><tt>chars</tt> : a <tt>string</tt> that contains characters that are used to trim.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a trimmed, new <tt>string</tt>,</li>
    
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>any other non-string input value will cause a type error.</li>
  </ul></li>
</ul>

<ul>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{
  &quot;v1&quot;: rtrim(&quot;i like x-phone&quot;, &quot;x-phone&quot;),
  &quot;v2&quot;: rtrim(&quot;i like x-phone&quot;, &quot;onexph&quot;)
};
</pre></div></div></li>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: &quot;i like &quot;, &quot;v2&quot;: &quot;i like &quot; }
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="split"></a>split</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>split(string, sep)
</pre></div></div></li>
  
<li>
<p>Splits the input <tt>string</tt> into an array of substrings separated by the string <tt>sep</tt>.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>string</tt> : a <tt>string</tt> to be split.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>an array of substrings by splitting the input <tt>string</tt> by <tt>sep</tt>,</li>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if the argument is a <tt>null</tt> value,</li>
    
<li>any other non-string input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>split(&quot;test driven development&quot;, &quot; &quot;);
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>[ &quot;test&quot;, &quot;driven&quot;, &quot;development&quot; ]
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="starts_with"></a>starts_with</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>starts_with(string, substring_to_start_with)
</pre></div></div></li>
  
<li>
<p>Checks whether the string <tt>string</tt> starts with the string <tt>substring_to_start_with</tt>.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>string</tt> : a <tt>string</tt> that might start with the given string.</li>
    
<li><tt>substring_to_start_with</tt> : a <tt>string</tt> that might be contained as the starting substring.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>boolean</tt>, returns <tt>true</tt> if <tt>string</tt> starts with the string <tt>substring_to_start_with</tt>,</li>
    
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>any other non-string input value will cause a type error,</li>
    
<li><tt>false</tt> otherwise.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{
  &quot;v1&quot; : starts_with(&quot; like the plan, amazing&quot;, &quot; like&quot;),
  &quot;v2&quot; : starts_with(&quot;I like the plan, amazing&quot;, &quot; like&quot;)
};
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: true, &quot;v2&quot;: false }
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="substr"></a>substr</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>substr(string, offset[, length])
</pre></div></div></li>
  
<li>
<p>Returns the substring from the given string <tt>string</tt> based on the given start offset <tt>offset</tt> with the optional <tt>length</tt>.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>string</tt> : a <tt>string</tt> to be extracted,</li>
    
<li><tt>offset</tt> : an <tt>tinyint</tt>/<tt>smallint</tt>/<tt>integer</tt>/<tt>bigint</tt> value as the starting offset of the substring in <tt>string</tt>,</li>
    
<li><tt>length</tt> : (Optional) an an <tt>tinyint</tt>/<tt>smallint</tt>/<tt>integer</tt>/<tt>bigint</tt> value as the length of the substring.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>string</tt> that represents the substring,</li>
    
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>a type error will be raised if:
    
<ul>
      
<li>the first argument is any other non-string value,</li>
      
<li>or, the second argument is not a <tt>tinyint</tt>, <tt>smallint</tt>, <tt>integer</tt>, or <tt>bigint</tt>,</li>
      
<li>or, the third argument is not a <tt>tinyint</tt>, <tt>smallint</tt>, <tt>integer</tt>, or <tt>bigint</tt> if the argument is present.</li>
    </ul></li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>substr(&quot;test string&quot;, 6, 3);
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>&quot;str&quot;
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="trim"></a>trim</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>trim(string[, chars]);
</pre></div></div></li>
  
<li>
<p>Returns a new string with all leading characters that appear in <tt>chars</tt> removed.  By default, white space is the character to trim.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>string</tt> : a <tt>string</tt> to be trimmed,</li>
    
<li><tt>chars</tt> : a <tt>string</tt> that contains characters that are used to trim.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a trimmed, new <tt>string</tt>,</li>
    
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>any other non-string input value will cause a type error.</li>
  </ul></li>
</ul>

<ul>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>trim(&quot;i like x-phone&quot;, &quot;xphoen&quot;);
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>&quot; like &quot;
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="upper"></a>upper</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>upper(string)
</pre></div></div></li>
  
<li>
<p>Converts a given string <tt>string</tt> to its uppercase form.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>string</tt> : a <tt>string</tt> to be converted.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>string</tt> as the uppercase form of the given <tt>string</tt>,</li>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if the argument is a <tt>null</tt> value,</li>
    
<li>any other non-string input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>upper(&quot;hello&quot;)
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>&quot;HELLO&quot;
</pre></div></div></li>
</ul>
<!-- ! 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.
 ! --></div>
<div class="section">
<h3><a name="string_concat"></a>string_concat</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>string_concat(array)
</pre></div></div></li>
  
<li>
<p>Concatenates an array of strings <tt>array</tt> into a single string.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>array</tt> : an <tt>array</tt> or <tt>multiset</tt> of <tt>string</tt>s (could be <tt>null</tt> or <tt>missing</tt>) to be concatenated.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>the concatenated <tt>string</tt> value,</li>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li><tt>missing</tt> if any element in the input array is <tt>missing</tt>,</li>
    
<li><tt>null</tt> if any element in the input array is <tt>null</tt> but no element in the input array is <tt>missing</tt>,</li>
    
<li>any other non-array input value or non-integer element in the input array will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>string_concat([&quot;ASTERIX&quot;, &quot; &quot;, &quot;ROCKS!&quot;]);
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>&quot;ASTERIX ROCKS!&quot;
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="string_join"></a>string_join</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>string_join(array, string)
</pre></div></div></li>
  
<li>
<p>Joins an array or multiset of strings <tt>array</tt> with the given separator <tt>string</tt> into a single string.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>array</tt> : an <tt>array</tt> or <tt>multiset</tt> of strings (could be <tt>null</tt>) to be joined.</li>
    
<li><tt>string</tt> : a <tt>string</tt> to serve as the separator.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>the joined <tt>string</tt>,</li>
    
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li><tt>missing</tt> if the first argument array contains a <tt>missing</tt>,</li>
    
<li><tt>null</tt> if the first argument array contains a <tt>null</tt> but does not contain a <tt>missing</tt>,</li>
    
<li>a type error will be raised if:
    
<ul>
      
<li>the first argument is any other non-array value, or contains any other non-string value,</li>
      
<li>or, the second argument is any other non-string value.</li>
    </ul></li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>string_join([&quot;ASTERIX&quot;, &quot;ROCKS~&quot;], &quot;!! &quot;);
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>&quot;ASTERIX!! ROCKS~&quot;
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="string_to_codepoint"></a>string_to_codepoint</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>string_to_codepoint(string)
</pre></div></div></li>
  
<li>
<p>Converts the string <tt>string</tt> to its code_based representation.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>string</tt> : a <tt>string</tt> that will be converted.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>an <tt>array</tt> of the code points for the string <tt>string</tt>,</li>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if the argument is a <tt>null</tt> value,</li>
    
<li>any other non-string input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>string_to_codepoint(&quot;Hello ASTERIX!&quot;);
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>[ 72, 101, 108, 108, 111, 32, 65, 83, 84, 69, 82, 73, 88, 33 ]
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="codepoint_to_string"></a>codepoint_to_string</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>codepoint_to_string(array)
</pre></div></div></li>
  
<li>
<p>Converts the ordered code_based representation <tt>array</tt> to the corresponding string.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>array</tt> : an <tt>array</tt> of integer code_points.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>string</tt> representation of <tt>array</tt>.</li>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if the argument is a <tt>null</tt> value,</li>
    
<li><tt>missing</tt> if any element in the input array is <tt>missing</tt>,</li>
    
<li><tt>null</tt> if any element in the input array is <tt>null</tt> but no element in the input array is <tt>missing</tt>,</li>
    
<li>any other non-array input value or non-integer element in the input array will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>codepoint_to_string([72, 101, 108, 108, 111, 32, 65, 83, 84, 69, 82, 73, 88, 33]);
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>&quot;Hello ASTERIX!&quot;
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="substring_before"></a>substring_before</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>substring_before(string, string_pattern)
</pre></div></div></li>
  
<li>
<p>Returns the substring from the given string <tt>string</tt> before the given pattern <tt>string_pattern</tt>.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>string</tt> : a <tt>string</tt> to be extracted.</li>
    
<li><tt>string_pattern</tt> : a <tt>string</tt> pattern to be searched.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>string</tt> that represents the substring,</li>
    
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>any other non-string input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>substring_before(&quot; like x-phone&quot;, &quot;x-phone&quot;);
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>&quot; like &quot;
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="substring_after"></a>substring_after</h3>

<ul>
  
<li>
<p>Syntax:</p>
<p>substring_after(string, string_pattern);</p></li>
  
<li>
<p>Returns the substring from the given string <tt>string</tt> after the given pattern <tt>string_pattern</tt>.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>string</tt> : a <tt>string</tt> to be extracted.</li>
    
<li><tt>string_pattern</tt> : a <tt>string</tt> pattern to be searched.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>string</tt> that represents the substring,</li>
    
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>any other non-string input value will cause a type error.</li>
  </ul></li>
</ul>

<ul>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>substring_after(&quot; like x-phone&quot;, &quot;xph&quot;);
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>&quot;one&quot;
</pre></div></div></li>
</ul>
<!-- ! 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.
 ! --></div></div>
<div class="section">
<h2><a name="Binary_Functions"></a><a name="BinaryFunctions" id="BinaryFunctions">Binary Functions</a></h2>
<div class="section">
<h3><a name="parse_binary"></a>parse_binary</h3>

<ul>
  
<li>
<p>Syntax:</p>
<p>parse_binary(string, encoding)</p></li>
  
<li>
<p>Creates a <tt>binary</tt> from an string encoded in <tt>encoding</tt> format.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>string</tt> : an encoded <tt>string</tt>,</li>
    
<li><tt>encoding</tt> : a string notation specifies the encoding type of the given <tt>string</tt>.  Currently we support <tt>hex</tt> and <tt>base64</tt> format.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>binary</tt> that is decoded from the given <tt>string</tt>,</li>
    
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>any other non-string input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
<p>[ parse_binary(&#x201c;ABCDEF0123456789&#x201d;,&#x201c;hex&#x201d;), parse_binary(&#x201c;abcdef0123456789&#x201d;,&#x201c;HEX&#x201d;), parse_binary(&#x2018;QXN0ZXJpeAE=&#x2019;,&#x201c;base64&#x201d;) ];</p></li>
  
<li>
<p>The expected result is:</p>
<p>[ hex(&#x201c;ABCDEF0123456789&#x201d;), hex(&#x201c;ABCDEF0123456789&#x201d;), hex(&#x201c;4173746572697801&#x201d;) ]</p></li>
</ul></div>
<div class="section">
<h3><a name="print_binary"></a>print_binary</h3>

<ul>
  
<li>
<p>Syntax:</p>
<p>print_binary(binary, encoding)</p></li>
  
<li>
<p>Prints a <tt>binary</tt> to the required encoding <tt>string</tt> format.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>binary</tt> : a <tt>binary</tt> data need to be printed.</li>
    
<li><tt>encoding</tt> : a string notation specifies the expected encoding type. Currently we support <tt>hex</tt> and <tt>base64</tt> format.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>string</tt> that represents the encoded format of a <tt>binary</tt>,</li>
    
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>any other non-string input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>[ print_binary(hex(&quot;ABCDEF0123456789&quot;), &quot;base64&quot;), print_binary(base64(&quot;q83vASNFZ4k=&quot;), &quot;hex&quot;) ]
</pre></div></div></li>
  
<li>
<p>The expected result are:</p>
  
<div class="source">
<div class="source">
<pre>[ &quot;q83vASNFZ4k=&quot;, &quot;ABCDEF0123456789&quot; ]
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="binary_length"></a>binary_length</h3>

<ul>
  
<li>
<p>Syntax:</p>
<p>binary_length(binary)</p></li>
  
<li>
<p>Returns the number of bytes storing the binary data.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>binary</tt> : a <tt>binary</tt> value to be checked.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>an <tt>bigint</tt> that represents the number of bytes,</li>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if the argument is a <tt>null</tt> value,</li>
    
<li>any other non-binary input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>binary_length(hex(&quot;00AA&quot;))
</pre></div></div></li>
  
<li>
<p>The expected result is:</p>
<p>2</p></li>
</ul></div>
<div class="section">
<h3><a name="sub_binary"></a>sub_binary</h3>

<ul>
  
<li>
<p>Syntax:</p>
<p>sub_binary(binary, offset[, length])</p></li>
  
<li>
<p>Returns the sub binary from the given <tt>binary</tt> based on the given start offset with the optional <tt>length</tt>.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>binary</tt> : a <tt>binary</tt> to be extracted,</li>
    
<li><tt>offset</tt> : a <tt>tinyint</tt>, <tt>smallint</tt>, <tt>integer</tt>, or <tt>bigint</tt> value  as the starting offset of the sub binary in <tt>binary</tt>,</li>
    
<li><tt>length</tt> : (Optional) a <tt>tinyint</tt>, <tt>smallint</tt>, <tt>integer</tt>, or <tt>bigint</tt> value  as the length of the sub binary.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>binary</tt> that represents the sub binary,</li>
    
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>a type error will be raised if:
    
<ul>
      
<li>the first argument is any other non-binary value,</li>
      
<li>or, the second argument is any other non-integer value,</li>
      
<li>or, the third argument is any other non-integer value, if it is present.</li>
    </ul></li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>sub_binary(hex(&quot;AABBCCDD&quot;), 4);
</pre></div></div></li>
  
<li>
<p>The expected result is</p>
  
<div class="source">
<div class="source">
<pre>hex(&quot;DD&quot;)
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="binary_concat"></a>binary_concat</h3>

<ul>
  
<li>
<p>Syntax:</p>
<p>binary_concat(array)</p></li>
  
<li>
<p>Concatenates a binary <tt>array</tt> or <tt>multiset</tt> into a single binary.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>array</tt> : an <tt>array</tt> or <tt>multiset</tt> of binaries (could be <tt>null</tt> or <tt>missing</tt>) to be concatenated.</li>
  </ul></li>
  
<li>Return Value :
  
<ul>
    
<li>the concatenated <tt>binary</tt> value,</li>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if the argument is a <tt>null</tt> value,</li>
    
<li><tt>missing</tt> if any element in the input array is <tt>missing</tt>,</li>
    
<li><tt>null</tt> if any element in the input array is <tt>null</tt> but no element in the input array is <tt>missing</tt>,</li>
    
<li>any other non-array input value or non-binary element in the input array will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
<p>binary_concat([hex(&#x201c;42&#x201d;), hex(&quot;&quot;), hex(&#x2018;42&#x2019;)]);</p></li>
  
<li>
<p>The expected result is</p>
<p>hex(&#x201c;4242&#x201d;)</p></li>
</ul>
<!-- ! 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.
 ! --></div></div>
<div class="section">
<h2><a name="Spatial_Functions"></a><a name="SpatialFunctions" id="SpatialFunctions">Spatial Functions</a></h2>
<div class="section">
<h3><a name="create_point"></a>create_point</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>create_point(x, y)
</pre></div></div></li>
  
<li>
<p>Creates the primitive type <tt>point</tt> using an <tt>x</tt> and <tt>y</tt> value.</p></li>
  
<li>Arguments:</li>
  
<li><tt>x</tt> : a <tt>double</tt> that represents the x-coordinate,</li>
  
<li><tt>y</tt> : a <tt>double</tt> that represents the y-coordinate.</li>
  
<li>Return Value:</li>
  
<li>a <tt>point</tt> representing the ordered pair (<tt>x</tt>, <tt>y</tt>),</li>
  
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
  
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
  
<li>any other non-double input value will cause a type error.</li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;point&quot;: create_point(30.0,70.0) };
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;point&quot;: point(&quot;30.0,70.0&quot;) }
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="create_line"></a>create_line</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>create_line(point1, point2)
</pre></div></div></li>
  
<li>
<p>Creates the primitive type <tt>line</tt> using <tt>point1</tt> and <tt>point2</tt>.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>point1</tt> : a <tt>point</tt> that represents the start point of the line.</li>
    
<li><tt>point2</tt> : a <tt>point</tt> that represents the end point of the line.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a spatial <tt>line</tt> created using the points provided in <tt>point1</tt> and <tt>point2</tt>,</li>
    
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>any other non-point input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;line&quot;: create_line(create_point(30.0,70.0), create_point(50.0,90.0)) };
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;line&quot;: line(&quot;30.0,70.0 50.0,90.0&quot;) }
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="create_rectangle"></a>create_rectangle</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>create_rectangle(point1, point2)
</pre></div></div></li>
  
<li>
<p>Creates the primitive type <tt>rectangle</tt> using <tt>point1</tt> and <tt>point2</tt>.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>point1</tt> : a <tt>point</tt> that represents the lower_left point of the rectangle.</li>
    
<li><tt>point2</tt> : a <tt>point</tt> that represents the upper_right point of the rectangle.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a spatial <tt>rectangle</tt> created using the points provided in <tt>point1</tt> and <tt>point2</tt>,</li>
    
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>any other non-point input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;rectangle&quot;: create_rectangle(create_point(30.0,70.0), create_point(50.0,90.0)) };
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;rectangle&quot;: rectangle(&quot;30.0,70.0 50.0,90.0&quot;) }
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="create_circle"></a>create_circle</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>create_circle(point, radius)
</pre></div></div></li>
  
<li>
<p>Creates the primitive type <tt>circle</tt> using <tt>point</tt> and <tt>radius</tt>.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>point</tt> : a <tt>point</tt> that represents the center of the circle.</li>
    
<li><tt>radius</tt> : a <tt>double</tt> that represents the radius of the circle.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a spatial <tt>circle</tt> created using the center point and the radius provided in <tt>point</tt> and <tt>radius</tt>.</li>
    
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>a type error will be raised if:
    
<ul>
      
<li>the first argument is any other non-point value,</li>
      
<li>or, the second argument is any other non-double value.</li>
    </ul></li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;circle&quot;: create_circle(create_point(30.0,70.0), 5.0) }
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;circle&quot;: circle(&quot;30.0,70.0 5.0&quot;) }
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="create_polygon"></a>create_polygon</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>create_polygon(array)
</pre></div></div></li>
  
<li>
<p>Creates the primitive type <tt>polygon</tt> using the double values provided in the argument <tt>array</tt>.  Each two consecutive double values represent a point starting from the first double value in the array.  Note that at least six double values should be specified, meaning a total of three points.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>array</tt> : an array of doubles representing the points of the polygon.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>polygon</tt>, represents a spatial simple polygon created using the points provided in <tt>array</tt>.</li>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if the argument is a <tt>null</tt> value,</li>
    
<li><tt>missing</tt> if any element in the input array is <tt>missing</tt>,</li>
    
<li><tt>null</tt> if any element in the input array is <tt>null</tt> but no element in the input array is <tt>missing</tt>,</li>
    
<li>any other non-array input value or non-double element in the input array will cause a type error.</li>
  </ul></li>
</ul>

<ul>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;polygon&quot;: create_polygon([1.0,1.0,2.0,2.0,3.0,3.0,4.0,4.0]) };
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;polygon&quot;: polygon(&quot;1.0,1.0 2.0,2.0 3.0,3.0 4.0,4.0&quot;) }
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="get_xget_y"></a>get_x/get_y</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>get_x(point) or get_y(point)
</pre></div></div></li>
  
<li>
<p>Returns the x or y coordinates of a point <tt>point</tt>.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>point</tt> : a <tt>point</tt>.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>double</tt> representing the x or y coordinates of the point <tt>point</tt>,</li>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if the argument is a <tt>null</tt> value,</li>
    
<li>any other non-point input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;x_coordinate&quot;: get_x(create_point(2.3,5.0)), &quot;y_coordinate&quot;: get_y(create_point(2.3,5.0)) };
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;x_coordinate&quot;: 2.3, &quot;y_coordinate&quot;: 5.0 }
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="get_points"></a>get_points</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>get_points(spatial_object)
</pre></div></div></li>
  
<li>
<p>Returns an ordered array of the points forming the spatial object <tt>spatial_object</tt>.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>spatial_object</tt> : a <tt>point</tt>, <tt>line</tt>, <tt>rectangle</tt>, <tt>circle</tt>, or <tt>polygon</tt>.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>an <tt>array</tt> of the points forming the spatial object <tt>spatial_object</tt>,</li>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if the argument is a <tt>null</tt> value,</li>
    
<li>any other non-spatial-object input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>get_points(create_polygon([1.0,1.0,2.0,2.0,3.0,3.0,4.0,4.0]))
</pre></div></div></li>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>[ point(&quot;1.0,1.0&quot;), point(&quot;2.0,2.0&quot;), point(&quot;3.0,3.0&quot;), point(&quot;4.0,4.0&quot;) ]
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="get_centerget_radius"></a>get_center/get_radius</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>get_center(circle_expression) or get_radius(circle_expression)
</pre></div></div></li>
  
<li>
<p>Returns the center and the radius of a circle <tt>circle_expression</tt>, respectively.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>circle_expression</tt> : a <tt>circle</tt>.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>point</tt> or <tt>double</tt>, represent the center or radius of the circle <tt>circle_expression</tt>.</li>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if the argument is a <tt>null</tt> value,</li>
    
<li>any other non-circle input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{
  &quot;circle_radius&quot;: get_radius(create_circle(create_point(6.0,3.0), 1.0)),
  &quot;circle_center&quot;: get_center(create_circle(create_point(6.0,3.0), 1.0))
};
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;circle_radius&quot;: 1.0, &quot;circle_center&quot;: point(&quot;6.0,3.0&quot;) }
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="spatial_distance"></a>spatial_distance</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>spatial_distance(point1, point2)
</pre></div></div></li>
  
<li>
<p>Returns the Euclidean distance between <tt>point1</tt> and <tt>point2</tt>.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>point1</tt> : a <tt>point</tt>.</li>
    
<li><tt>point2</tt> : a <tt>point</tt>.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>double</tt> as the Euclidean distance between <tt>point1</tt> and <tt>point2</tt>.</li>
    
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>any other non-point input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>spatial_distance(point(&quot;47.44,80.65&quot;), create_point(30.0,70.0));
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>20.434678857275934
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="spatial_area"></a>spatial_area</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>spatial_area(spatial_2d_expression)
</pre></div></div></li>
  
<li>
<p>Returns the spatial area of <tt>spatial_2d_expression</tt>.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>spatial_2d_expression</tt> : a <tt>rectangle</tt>, <tt>circle</tt>, or <tt>polygon</tt>.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>double</tt> representing the area of <tt>spatial_2d_expression</tt>.</li>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if the argument is a <tt>null</tt> value,</li>
    
<li>any other non-2d-spatial-object will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>spatial_area(create_circle(create_point(0.0,0.0), 5.0));
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>78.53981625
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="spatial_intersect"></a>spatial_intersect</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>spatial_intersect(spatial_object1, spatial_object2)
</pre></div></div></li>
  
<li>
<p>Checks whether <tt>@arg1</tt> and <tt>@arg2</tt> spatially intersect each other.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>spatial_object1</tt> : a <tt>point</tt>, <tt>line</tt>, <tt>rectangle</tt>, <tt>circle</tt>, or <tt>polygon</tt>.</li>
    
<li><tt>spatial_object2</tt> : a <tt>point</tt>, <tt>line</tt>, <tt>rectangle</tt>, <tt>circle</tt>, or <tt>polygon</tt>.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>boolean</tt> representing whether <tt>spatial_object1</tt> and <tt>spatial_object2</tt> spatially overlap with each other,</li>
    
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>any other non-spatial-object input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>spatial_intersect(point(&quot;39.28,70.48&quot;), create_rectangle(create_point(30.0,70.0), create_point(40.0,80.0)));
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>true
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="spatial_cell"></a>spatial_cell</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>spatial_cell(point1, point2, x_increment, y_increment)
</pre></div></div></li>
  
<li>
<p>Returns the grid cell that <tt>point1</tt> belongs to.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>point1</tt> : a <tt>point</tt> representing the point of interest that its grid cell will be returned.</li>
    
<li><tt>point2</tt> : a <tt>point</tt> representing the origin of the grid.</li>
    
<li><tt>x_increment</tt> : a <tt>double</tt>, represents X increments.</li>
    
<li><tt>y_increment</tt> : a <tt>double</tt>, represents Y increments.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>rectangle</tt> representing the grid cell that <tt>point1</tt> belongs to,</li>
    
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>a type error will be raised if:
    
<ul>
      
<li>the first or second argument is any other non-point value,</li>
      
<li>or, the second or third argument is any other non-double value.</li>
    </ul></li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>spatial_cell(point(&quot;39.28,70.48&quot;), create_point(20.0,50.0), 5.5, 6.0);
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>rectangle(&quot;36.5,68.0 42.0,74.0&quot;);
</pre></div></div></li>
</ul>
<!-- ! 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.
 ! --></div></div>
<div class="section">
<h2><a name="Similarity_Functions"></a><a name="SimilarityFunctions" id="SimilarityFunctions">Similarity Functions</a></h2>
<p>AsterixDB supports queries with different similarity functions, including <a class="externalLink" href="http://en.wikipedia.org/wiki/Levenshtein_distance">edit distance</a> and <a class="externalLink" href="https://en.wikipedia.org/wiki/Jaccard_index">Jaccard</a>.</p>
<div class="section">
<h3><a name="edit_distance"></a>edit_distance</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>edit_distance(expression1, expression2)
</pre></div></div></li>
  
<li>
<p>Returns the edit distance of <tt>expression1</tt> and <tt>expression2</tt>.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>expression1</tt> : a <tt>string</tt> or a homogeneous <tt>array</tt> of a comparable item type.</li>
    
<li><tt>expression2</tt> : The same type as <tt>expression1</tt>.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>an <tt>bigint</tt> that represents the edit distance between <tt>expression1</tt> and <tt>expression2</tt>,</li>
    
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>any other non-string input value will cause a type error.</li>
  </ul></li>
  
<li>Note: an <a href="similarity.html#UsingIndexesToSupportSimilarityQueries">n_gram index</a> can be utilized for this function.</li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>edit_distance(&quot;SuzannaTillson&quot;, &quot;Suzanna Tilson&quot;);
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>2
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="edit_distance_check"></a>edit_distance_check</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>edit_distance_check(expression1, expression2, threshold)
</pre></div></div></li>
  
<li>
<p>Checks whether the edit distance of <tt>expression1</tt> and <tt>expression2</tt> is within a given threshold.</p></li>
  
<li>
<p>Arguments:</p>
  
<ul>
    
<li><tt>expression1</tt> : a <tt>string</tt> or a homogeneous <tt>array</tt> of a comparable item type.</li>
    
<li><tt>expression2</tt> : The same type as <tt>expression1</tt>.</li>
    
<li><tt>threshold</tt> : a <tt>bigint</tt> that represents the distance threshold.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>an <tt>array</tt> with two items:
    
<ul>
      
<li>The first item contains a <tt>boolean</tt> value representing whether the edit distance of <tt>expression1</tt> and <tt>expression2</tt> is within the given threshold.</li>
      
<li>The second item contains an <tt>integer</tt> that represents the edit distance of <tt>expression1</tt> and <tt>expression2</tt> if the first item is true.</li>
      
<li>If the first item is false, then the second item is set to 2147483647.</li>
    </ul></li>
    
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>a type error will be raised if:
    
<ul>
      
<li>the first or second argument is any other non-string value,</li>
      
<li>or, the third argument is any other non-bigint value.</li>
    </ul></li>
  </ul></li>
  
<li>Note: an <a href="similarity.html#UsingIndexesToSupportSimilarityQueries">n_gram index</a> can be utilized for this function.</li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>edit_distance_check(&quot;happy&quot;,&quot;hapr&quot;,2);
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>[ true, 2 ]
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="edit_distance_contains"></a>edit_distance_contains</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>edit_distance_contains(expression1, expression2, threshold)
</pre></div></div></li>
  
<li>
<p>Checks whether <tt>expression1</tt> contains <tt>expression2</tt> with an <a class="externalLink" href="http://en.wikipedia.org/wiki/Levenshtein_distance">edit distance</a> within a given threshold.</p></li>
  
<li>
<p>Arguments:</p>
  
<ul>
    
<li><tt>expression1</tt> : a <tt>string</tt> or a homogeneous <tt>array</tt> of a comparable item type.</li>
    
<li><tt>expression2</tt> : The same type as <tt>expression1</tt>.</li>
    
<li><tt>threshold</tt> : a <tt>bigint</tt> that represents the distance threshold.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>an <tt>array</tt> with two items:
    
<ul>
      
<li>The first item contains a <tt>boolean</tt> value representing whether <tt>expression1</tt> can contain <tt>expression2</tt>.</li>
      
<li>The second item contains an <tt>integer</tt> that represents the required edit distance for <tt>expression1</tt> to contain  <tt>expression2</tt> if the first item is true.</li>
    </ul></li>
    
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>a type error will be raised if:
    
<ul>
      
<li>the first or second argument is any other non-string value,</li>
      
<li>or, the third argument is any other non-bigint value.</li>
    </ul></li>
  </ul></li>
  
<li>Note: an <a href="similarity.html#UsingIndexesToSupportSimilarityQueries">n_gram index</a> can be utilized for this function.</li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>edit_distance_contains(&quot;happy&quot;,&quot;hapr&quot;,2);
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>[ true, 1 ]
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="similarity_jaccard"></a>similarity_jaccard</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>similarity_jaccard(array1, array2)
</pre></div></div></li>
  
<li>
<p>Returns the <a class="externalLink" href="http://en.wikipedia.org/wiki/Jaccard_index">Jaccard similarity</a> of <tt>array1</tt> and <tt>array2</tt>.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>array1</tt> : an <tt>array</tt> or <tt>multiset</tt>.</li>
    
<li><tt>array2</tt> : an <tt>array</tt> or <tt>multiset</tt>.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>float</tt> that represents the Jaccard similarity of <tt>array1</tt> and <tt>array2</tt>,</li>
    
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li><tt>missing</tt> if any element in any input array is <tt>missing</tt>,</li>
    
<li><tt>null</tt> if any element in any input array is <tt>null</tt> but no element in the input array is <tt>missing</tt>,</li>
    
<li>any other non-array input value or non-integer element in any input array will cause a type error.</li>
  </ul></li>
  
<li>
<p>Note: a <a href="similarity.html#UsingIndexesToSupportSimilarityQueries">keyword index</a> can be utilized for this function.</p></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>similarity_jaccard([1,5,8,9], [1,5,9,10]);
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>0.6
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="similarity_jaccard_check"></a>similarity_jaccard_check</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>similarity_jaccard_check(array1, array2, threshold)
</pre></div></div></li>
  
<li>
<p>Checks whether <tt>array1</tt> and <tt>array2</tt> have a <a class="externalLink" href="http://en.wikipedia.org/wiki/Jaccard_index">Jaccard similarity</a> greater than or equal to threshold. Again, the &#x201c;check&#x201d; version of Jaccard is faster than the &#x201c;non_check&#x201d; version.</p></li>
  
<li>
<p>Arguments:</p>
  
<ul>
    
<li><tt>array1</tt> : an <tt>array</tt> or <tt>multiset</tt>.</li>
    
<li><tt>array2</tt> : an <tt>array</tt> or <tt>multiset</tt>.</li>
    
<li><tt>threshold</tt> : a <tt>double</tt> that represents the similarity threshold.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>an <tt>array</tt> with two items:
    
<ul>
      
<li>The first item contains a <tt>boolean</tt> value representing whether <tt>array1</tt> and <tt>array2</tt> are similar.</li>
      
<li>The second item contains a <tt>float</tt> that represents the Jaccard similarity of <tt>array1</tt> and <tt>array2</tt>  if it is greater than or equal to the threshold, or 0 otherwise.</li>
    </ul></li>
    
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li><tt>missing</tt> if any element in any input array is <tt>missing</tt>,</li>
    
<li><tt>null</tt> if any element in any input array is <tt>null</tt> but no element in the input array is <tt>missing</tt>,</li>
    
<li>a type error will be raised if:  * the first or second argument is any other non-array value,  * or, the third argument is any other non-double value.</li>
  </ul></li>
  
<li>
<p>Note: a <a href="similarity.html#UsingIndexesToSupportSimilarityQueries">keyword index</a> can be utilized for this function.</p></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>similarity_jaccard_check([1,5,8,9], [1,5,9,10], 0.6);
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>[ false, 0.0 ]
</pre></div></div></li>
</ul>
<!-- ! 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.
 ! --></div></div>
<div class="section">
<h2><a name="Tokenizing_Functions"></a><a name="TokenizingFunctions" id="TokenizingFunctions">Tokenizing Functions</a></h2>
<div class="section">
<h3><a name="word_tokens"></a>word_tokens</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>word_tokens(string)
</pre></div></div></li>
  
<li>
<p>Returns an array of word tokens of <tt>string</tt> using non_alphanumeric characters as delimiters.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>string</tt> : a <tt>string</tt> that will be tokenized.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>an <tt>array</tt> of <tt>string</tt> word tokens,</li>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if the argument is a <tt>null</tt> value,</li>
    
<li>any other non-string input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>word_tokens(&quot;I like the phone, awesome!&quot;);
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>[ &quot;i&quot;, &quot;like&quot;, &quot;the&quot;, &quot;phone&quot;, &quot;awesome&quot; ]
</pre></div></div></li>
</ul>
<!-- ! 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.
 ! --></div></div>
<div class="section">
<h2><a name="Temporal_Functions"></a><a name="TemporalFunctions" id="TemporalFunctions">Temporal Functions</a></h2>
<div class="section">
<h3><a name="get_yearget_monthget_dayget_hourget_minuteget_secondget_millisecond"></a>get_year/get_month/get_day/get_hour/get_minute/get_second/get_millisecond</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>get_year/get_month/get_day/get_hour/get_minute/get_second/get_millisecond(temporal_value)
</pre></div></div></li>
  
<li>
<p>Accessors for accessing fields in a temporal value</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>temporal_value</tt> : a temporal value represented as one of the following types: <tt>date</tt>, <tt>datetime</tt>, <tt>time</tt>, and <tt>duration</tt>.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>an <tt>bigint</tt> value representing the field to be extracted,</li>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>any other non-interval input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{
  &quot;year&quot;: get_year(date(&quot;2010-10-30&quot;)),
  &quot;month&quot;: get_month(datetime(&quot;1987-11-19T23:49:23.938&quot;)),
  &quot;day&quot;: get_day(date(&quot;2010-10-30&quot;)),
  &quot;hour&quot;: get_hour(time(&quot;12:23:34.930+07:00&quot;)),
  &quot;min&quot;: get_minute(duration(&quot;P3Y73M632DT49H743M3948.94S&quot;)),
  &quot;second&quot;: get_second(datetime(&quot;1987-11-19T23:49:23.938&quot;)),
  &quot;ms&quot;: get_millisecond(duration(&quot;P3Y73M632DT49H743M3948.94S&quot;))
};
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;year&quot;: 2010, &quot;month&quot;: 11, &quot;day&quot;: 30, &quot;hour&quot;: 5, &quot;min&quot;: 28, &quot;second&quot;: 23, &quot;ms&quot;: 94 }
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="adjust_datetime_for_timezone"></a>adjust_datetime_for_timezone</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>adjust_datetime_for_timezone(datetime, string)
</pre></div></div></li>
  
<li>
<p>Adjusts the given datetime <tt>datetime</tt> by applying the timezone information <tt>string</tt>.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>datetime</tt> : a <tt>datetime</tt> value to be adjusted.</li>
    
<li><tt>string</tt> : a <tt>string</tt> representing the timezone information.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>string</tt> value representing the new datetime after being adjusted by the timezone information,</li>
    
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>a type error will be raised if:
    
<ul>
      
<li>the first argument is any other non-datetime value,</li>
      
<li>or, the second argument is any other non-string value.</li>
    </ul></li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>adjust_datetime_for_timezone(datetime(&quot;2008-04-26T10:10:00&quot;), &quot;+08:00&quot;);
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>&quot;2008-04-26T18:10:00.000+08:00&quot;
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="adjust_time_for_timezone"></a>adjust_time_for_timezone</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>adjust_time_for_timezone(time, string)
</pre></div></div></li>
  
<li>
<p>Adjusts the given time <tt>time</tt> by applying the timezone information <tt>string</tt>.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>time</tt> : a <tt>time</tt> value to be adjusted.</li>
    
<li><tt>string</tt> : a <tt>string</tt> representing the timezone information.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>string</tt> value representing the new time after being adjusted by the timezone information,</li>
    
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>a type error will be raised if:
    
<ul>
      
<li>the first argument is any other non-time value,</li>
      
<li>or, the second argument is any other non-string value.</li>
    </ul></li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>adjust_time_for_timezone(get_time_from_datetime(datetime(&quot;2008-04-26T10:10:00&quot;)), &quot;+08:00&quot;);
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>&quot;18:10:00.000+08:00&quot;
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="calendar_duration_from_datetime"></a>calendar_duration_from_datetime</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>calendar_duration_from_datetime(datetime, duration_value)
</pre></div></div></li>
  
<li>
<p>Gets a user_friendly representation of the duration <tt>duration_value</tt> based on the given datetime <tt>datetime</tt>.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>datetime</tt> : a <tt>datetime</tt> value to be used as the reference time point.</li>
    
<li><tt>duration_value</tt> : a <tt>duration</tt> value to be converted.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>duration</tt> value with the duration as <tt>duration_value</tt> but with a user_friendly representation,</li>
    
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>a type error will be raised if:
    
<ul>
      
<li>the first argument is any other non-datetime value,</li>
      
<li>or, the second argument is any other non-duration input value.</li>
    </ul></li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>calendar_duration_from_datetime(
      datetime(&quot;2016-03-26T10:10:00&quot;),
      datetime(&quot;2016-03-26T10:10:00&quot;) - datetime(&quot;2011-01-01T00:00:00&quot;)
);
</pre></div></div></li>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>duration(&quot;P5Y2M24DT10H10M&quot;)
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="get_year_month_durationget_day_time_duration"></a>get_year_month_duration/get_day_time_duration</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>get_year_month_duration/get_day_time_duration(duration_value)
</pre></div></div></li>
  
<li>
<p>Extracts the correct <tt>duration</tt> subtype from <tt>duration_value</tt>.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>duration_value</tt> : a <tt>duration</tt> value to be converted.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>year_month_duration</tt> value or a <tt>day_time_duration</tt> value,</li>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if the argument is a <tt>null</tt> value,</li>
    
<li>any other non-duration input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>get_year_month_duration(duration(&quot;P12M50DT10H&quot;));
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>year_month_duration(&quot;P1Y&quot;)
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="months_from_year_month_durationmilliseconds_from_day_time_duration"></a>months_from_year_month_duration/milliseconds_from_day_time_duration</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>months_from_year_month_duration/milliseconds_from_day_time_duration(duration_value)
</pre></div></div></li>
  
<li>
<p>Extracts the number of months or the number of milliseconds from the <tt>duration</tt> subtype.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>duration_value</tt> : a <tt>duration</tt> of the correct subtype.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>an <tt>bigint</tt> representing the number or months/milliseconds,</li>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if the argument is a <tt>null</tt> value,</li>
    
<li>any other non-duration input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>months_from_year_month_duration(get_year_month_duration(duration(&quot;P5Y7MT50M&quot;)));
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>67
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="duration_from_monthsduration_from_ms"></a>duration_from_months/duration_from_ms</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>duration_from_months/duration_from_ms(number_value)
</pre></div></div></li>
  
<li>
<p>Creates a <tt>duration</tt> from <tt>number_value</tt>.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>number_value</tt> : a <tt>bigint</tt> representing the number of months/milliseconds</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>duration</tt> containing <tt>number_value</tt> value for months/milliseconds,</li>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if the argument is a <tt>null</tt> value,</li>
    
<li>any other non-duration input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>duration_from_months(8);
</pre></div></div></li>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>duration(&quot;P8M&quot;)
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="duration_from_interval"></a>duration_from_interval</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>duration_from_interval(interval_value)
</pre></div></div></li>
  
<li>
<p>Creates a <tt>duration</tt> from <tt>interval_value</tt>.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>interval_value</tt> : an <tt>interval</tt> value</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>duration</tt> representing the time in the <tt>interval_value</tt></li>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if the argument is a <tt>null</tt> value,</li>
    
<li>any other non-duration input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{
  &quot;dr1&quot; : duration_from_interval(interval(date(&quot;2010-10-30&quot;), date(&quot;2010-12-21&quot;))),
  &quot;dr2&quot; : duration_from_interval(interval(datetime(&quot;2012-06-26T01:01:01.111&quot;), datetime(&quot;2012-07-27T02:02:02.222&quot;))),
  &quot;dr3&quot; : duration_from_interval(interval(time(&quot;12:32:38&quot;), time(&quot;20:29:20&quot;))),
  &quot;dr4&quot; : duration_from_interval(null)
};
</pre></div></div></li>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{
  &quot;dr1&quot;: day_time_duration(&quot;P52D&quot;),
  &quot;dr2&quot;: day_time_duration(&quot;P31DT1H1M1.111S&quot;),
  &quot;dr3&quot;: day_time_duration(&quot;PT7H56M42S&quot;),
  &quot;dr4&quot;: null
}
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="current_date"></a>current_date</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>current_date()
</pre></div></div></li>
  
<li>
<p>Gets the current date.</p></li>
  
<li>Arguments: None</li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>date</tt> value of the date when the function is called.</li>
  </ul></li>
</ul></div>
<div class="section">
<h3><a name="current_time"></a>current_time</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>current_time()
</pre></div></div></li>
  
<li>
<p>Get the current time</p></li>
  
<li>Arguments: None</li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>time</tt> value of the time when the function is called.</li>
  </ul></li>
</ul></div>
<div class="section">
<h3><a name="current_datetime"></a>current_datetime</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>current_datetime()
</pre></div></div></li>
  
<li>
<p>Get the current datetime</p></li>
  
<li>Arguments: None</li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>datetime</tt> value of the datetime when the function is called.</li>
  </ul></li>
</ul></div>
<div class="section">
<h3><a name="get_date_from_datetime"></a>get_date_from_datetime</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>get_date_from_datetime(datetime)
</pre></div></div></li>
  
<li>
<p>Gets the date value from the given datetime value <tt>datetime</tt>.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>datetime</tt>: a <tt>datetime</tt> value to be extracted from.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>date</tt> value from the datetime,</li>
    
<li>any other non-datetime input value will cause a type error.</li>
  </ul></li>
</ul></div>
<div class="section">
<h3><a name="get_time_from_datetime"></a>get_time_from_datetime</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>get_time_from_datetime(datetime)
</pre></div></div></li>
  
<li>
<p>Get the time value from the given datetime value <tt>datetime</tt></p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>datetime</tt>: a <tt>datetime</tt> value to be extracted from.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>time</tt> value from the datetime.</li>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if the argument is a <tt>null</tt> value,</li>
    
<li>any other non-datetime input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>get_time_from_datetime(datetime(&quot;2016-03-26T10:10:00&quot;));
</pre></div></div></li>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>time(&quot;10:10:00.000Z&quot;)
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="day_of_week"></a>day_of_week</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>day_of_week(date)
</pre></div></div></li>
  
<li>
<p>Finds the day of the week for a given date (1_7)</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>date</tt>: a <tt>date</tt> value (Can also be a <tt>datetime</tt>)</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>an <tt>tinyint</tt> representing the day of the week (1_7),</li>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if the argument is a <tt>null</tt> value,</li>
    
<li>any other non-date input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>day_of_week(datetime(&quot;2012-12-30T12:12:12.039Z&quot;));
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>7
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="date_from_unix_time_in_days"></a>date_from_unix_time_in_days</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>date_from_unix_time_in_days(numeric_value)
</pre></div></div></li>
  
<li>
<p>Gets a date representing the time after <tt>numeric_value</tt> days since 1970_01_01.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>numeric_value</tt>: a <tt>tinyint</tt>/<tt>smallint</tt>/<tt>integer</tt>/<tt>bigint</tt> value representing the number of days.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>date</tt> value as the time after <tt>numeric_value</tt> days since 1970-01-01,</li>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if the argument is a <tt>null</tt> value,</li>
    
<li>any other non-numeric input value will cause a type error.</li>
  </ul></li>
</ul></div>
<div class="section">
<h3><a name="datetime_from_unix_time_in_ms"></a>datetime_from_unix_time_in_ms</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>datetime_from_unix_time_in_ms(numeric_value)
</pre></div></div></li>
  
<li>
<p>Gets a datetime representing the time after <tt>numeric_value</tt> milliseconds since 1970_01_01T00:00:00Z.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>numeric_value</tt>: a <tt>tinyint</tt>/<tt>smallint</tt>/<tt>integer</tt>/<tt>bigint</tt> value representing the number of milliseconds.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>datetime</tt> value as the time after <tt>numeric_value</tt> milliseconds since 1970-01-01T00:00:00Z,</li>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if the argument is a <tt>null</tt> value,</li>
    
<li>any other non-numeric input value will cause a type error.</li>
  </ul></li>
</ul></div>
<div class="section">
<h3><a name="datetime_from_unix_time_in_secs"></a>datetime_from_unix_time_in_secs</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>datetime_from_unix_time_in_secs(numeric_value)
</pre></div></div></li>
  
<li>
<p>Gets a datetime representing the time after <tt>numeric_value</tt> seconds since 1970_01_01T00:00:00Z.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>numeric_value</tt>: a <tt>tinyint</tt>/<tt>smallint</tt>/<tt>integer</tt>/<tt>bigint</tt> value representing the number of seconds.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>datetime</tt> value as the time after <tt>numeric_value</tt> seconds since 1970_01_01T00:00:00Z,</li>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if the argument is a <tt>null</tt> value,</li>
    
<li>any other non-numeric input value will cause a type error.</li>
  </ul></li>
</ul></div>
<div class="section">
<h3><a name="datetime_from_date_time"></a>datetime_from_date_time</h3>

<ul>
  
<li>Syntax:</li>
</ul>
<p>datetime_from_date_time(date,time)</p>

<ul>
  
<li>Gets a datetime representing the combination of <tt>date</tt> and <tt>time</tt>
  
<ul>
    
<li>Arguments:</li>
    
<li><tt>date</tt>: a <tt>date</tt> value</li>
    
<li><tt>time</tt> a <tt>time</tt> value</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>datetime</tt> value by combining <tt>date</tt> and <tt>time</tt>,</li>
    
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>a type error will be raised if
    
<ul>
      
<li>the first argument is any other non-date value,</li>
      
<li>or, the second argument is any other non-time value.</li>
    </ul></li>
  </ul></li>
</ul></div>
<div class="section">
<h3><a name="time_from_unix_time_in_ms"></a>time_from_unix_time_in_ms</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>time_from_unix_time_in_ms(numeric_value)
</pre></div></div></li>
  
<li>
<p>Gets a time representing the time after <tt>numeric_value</tt> milliseconds since 00:00:00.000Z.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>numeric_value</tt>: a <tt>tinyint</tt>/<tt>smallint</tt>/<tt>integer</tt>/<tt>bigint</tt> value representing the number of milliseconds.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>time</tt> value as the time after <tt>numeric_value</tt> milliseconds since 00:00:00.000Z,</li>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if the argument is a <tt>null</tt> value,</li>
    
<li>any other non-numeric input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{
  &quot;date&quot;: date_from_unix_time_in_days(15800),
  &quot;datetime&quot;: datetime_from_unix_time_in_ms(1365139700000),
  &quot;time&quot;: time_from_unix_time_in_ms(3748)
};
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;date&quot;: date(&quot;2013-04-05&quot;), &quot;datetime&quot;: datetime(&quot;2013-04-05T05:28:20.000Z&quot;), &quot;time&quot;: time(&quot;00:00:03.748Z&quot;) }
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="unix_time_from_date_in_days"></a>unix_time_from_date_in_days</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>unix_time_from_date_in_days(date_value)
</pre></div></div></li>
  
<li>
<p>Gets an integer value representing the number of days since 1970_01_01 for <tt>date_value</tt>.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>date_value</tt>: a <tt>date</tt> value.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>bigint</tt> value representing the number of days,</li>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if the argument is a <tt>null</tt> value,</li>
    
<li>any other non-date input value will cause a type error.</li>
  </ul></li>
</ul></div>
<div class="section">
<h3><a name="unix_time_from_datetime_in_ms"></a>unix_time_from_datetime_in_ms</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>unix_time_from_datetime_in_ms(datetime_value)
</pre></div></div></li>
  
<li>
<p>Gets an integer value representing the time in milliseconds since 1970_01_01T00:00:00Z for <tt>datetime_value</tt>.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>datetime_value</tt> : a <tt>datetime</tt> value.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>bigint</tt> value representing the number of milliseconds,</li>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if the argument is a <tt>null</tt> value,</li>
    
<li>any other non-datetime input value will cause a type error.</li>
  </ul></li>
</ul></div>
<div class="section">
<h3><a name="unix_time_from_datetime_in_secs"></a>unix_time_from_datetime_in_secs</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>unix_time_from_datetime_in_secs(datetime_value)
</pre></div></div></li>
  
<li>
<p>Gets an integer value representing the time in seconds since 1970_01_01T00:00:00Z for <tt>datetime_value</tt>.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>datetime_value</tt> : a <tt>datetime</tt> value.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>bigint</tt> value representing the number of seconds,</li>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if the argument is a <tt>null</tt> value,</li>
    
<li>any other non-datetime input value will cause a type error.</li>
  </ul></li>
</ul></div>
<div class="section">
<h3><a name="unix_time_from_time_in_ms"></a>unix_time_from_time_in_ms</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>unix_time_from_time_in_ms(time_value)
</pre></div></div></li>
  
<li>
<p>Gets an integer value representing the time the milliseconds since 00:00:00.000Z for <tt>time_value</tt>.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>time_value</tt> : a <tt>time</tt> value.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>bigint</tt> value representing the number of milliseconds,</li>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if the argument is a <tt>null</tt> value,</li>
    
<li>any other non-datetime input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{
  &quot;date&quot;: date_from_unix_time_in_days(15800),
  &quot;datetime&quot;: datetime_from_unix_time_in_ms(1365139700000),
  &quot;time&quot;: time_from_unix_time_in_ms(3748)
}
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;date&quot;: date(&quot;2013-04-05&quot;), &quot;datetime&quot;: datetime(&quot;2013-04-05T05:28:20.000Z&quot;), &quot;time&quot;: time(&quot;00:00:03.748Z&quot;) }
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="parse_dateparse_timeparse_datetime"></a>parse_date/parse_time/parse_datetime</h3>

<ul>
  
<li>Syntax:</li>
</ul>
<p>parse_date/parse_time/parse_datetime(date,formatting_expression)</p>

<ul>
  
<li>Creates a <tt>date/time/date_time</tt> value by treating <tt>date</tt> with formatting <tt>formatting_expression</tt></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>date</tt>: a <tt>string</tt> value representing the <tt>date/time/datetime</tt>.</li>
    
<li><tt>formatting_expression</tt> a <tt>string</tt> value providing the formatting for <tt>date_expression</tt>.Characters used to create date expression:</li>
    
<li><tt>h</tt> hours</li>
    
<li><tt>m</tt> minutes</li>
    
<li><tt>s</tt> seconds</li>
    
<li><tt>n</tt> milliseconds</li>
    
<li><tt>a</tt> am/pm</li>
    
<li><tt>z</tt> timezone</li>
    
<li><tt>Y</tt> year</li>
    
<li><tt>M</tt> month</li>
    
<li><tt>D</tt> day</li>
    
<li><tt>W</tt> weekday</li>
    
<li><tt>_</tt>, <tt>'</tt>, <tt>/</tt>, <tt>.</tt>, <tt>,</tt>, <tt>T</tt> seperators for both time and date</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>date/time/date_time</tt> value corresponding to <tt>date</tt>,</li>
    
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>a type error will be raised if:</li>
    
<li>the first argument is any other non-date value,</li>
    
<li>the second argument is any other non-string value.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>parse_time(&quot;30:30&quot;,&quot;m:s&quot;);
</pre></div></div></li>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>time(&quot;00:30:30.000Z&quot;)
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="print_dateprint_timeprint_datetime"></a>print_date/print_time/print_datetime</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>print_date/print_time/print_datetime(date,formatting_expression)
</pre></div></div></li>
  
<li>
<p>Creates a <tt>string</tt> representing a <tt>date/time/date_time</tt> value of the <tt>date</tt> using the formatting <tt>formatting_expression</tt></p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>date</tt>: a <tt>date/time/datetime</tt> value.</li>
    
<li><tt>formatting_expression</tt> a <tt>string</tt> value providing the formatting for <tt>date_expression</tt>. Characters used to create date expression:</li>
    
<li><tt>h</tt> hours</li>
    
<li><tt>m</tt> minutes</li>
    
<li><tt>s</tt> seconds</li>
    
<li><tt>n</tt> milliseconds</li>
    
<li><tt>a</tt> am/pm</li>
    
<li><tt>z</tt> timezone</li>
    
<li><tt>Y</tt> year</li>
    
<li><tt>M</tt> month</li>
    
<li><tt>D</tt> day</li>
    
<li><tt>W</tt> weekday</li>
    
<li><tt>_</tt>, <tt>'</tt>, <tt>/</tt>, <tt>.</tt>, <tt>,</tt>, <tt>T</tt> seperators for both time and date</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>string</tt> value corresponding to <tt>date</tt>,</li>
    
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>a type error will be raised if:
    
<ul>
      
<li>the first argument is any other non-date value,</li>
      
<li>the second argument is any other non-string value.</li>
    </ul></li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>print_time(time(&quot;00:30:30.000Z&quot;),&quot;m:s&quot;);
</pre></div></div></li>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>&quot;30:30&quot;
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="get_interval_start_get_interval_end"></a>get_interval_start, get_interval_end</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>get_interval_start/get_interval_end(interval)
</pre></div></div></li>
  
<li>
<p>Gets the start/end of the given interval.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>interval</tt>: the interval to be accessed.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>time</tt>, <tt>date</tt>, or <tt>datetime</tt> (depending on the time instances of the interval) representing the starting  or ending time,</li>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if the argument is a <tt>null</tt> value,</li>
    
<li>any other non-interval value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{
  &quot;start&quot;: get_interval_start(interval_start_from_date(&quot;1984-01-01&quot;, &quot;P1Y&quot;)),
  &quot;end&quot;: get_interval_end(interval_start_from_date(&quot;1984-01-01&quot;, &quot;P1Y&quot;))
};
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;start&quot;: date(&quot;1984_01_01&quot;), &quot;end&quot;: date(&quot;1985_01_01&quot;) }
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="get_interval_start_dateget_interval_start_datetimeget_interval_start_time_get_interval_end_dateget_interval_end_datetimeget_interval_end_time"></a>get_interval_start_date/get_interval_start_datetimeget_interval_start_time, get_interval_end_date/get_interval_end_datetime/get_interval_end_time</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>get_interval_start_date/get_interval_start_datetime/get_interval_start_time/get_interval_end_date/get_interval_end_datetime/get_interval_end_time(interval)
</pre></div></div></li>
  
<li>
<p>Gets the start/end of the given interval for the specific date/datetime/time type.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>interval</tt>: the interval to be accessed.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>time</tt>, <tt>date</tt>, or <tt>datetime</tt> (depending on the function) representing the starting or ending time,</li>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if the argument is a <tt>null</tt> value,</li>
    
<li>any other non-interval value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{
  &quot;start1&quot;: get_interval_start_date(interval_start_from_date(&quot;1984-01-01&quot;, &quot;P1Y&quot;)),
  &quot;end1&quot;: get_interval_end_date(interval_start_from_date(&quot;1984-01-01&quot;, &quot;P1Y&quot;)),
  &quot;start2&quot;: get_interval_start_datetime(interval_start_from_datetime(&quot;1984-01-01T08:30:00.000&quot;, &quot;P1Y1H&quot;)),
  &quot;end2&quot;: get_interval_end_datetime(interval_start_from_datetime(&quot;1984-01-01T08:30:00.000&quot;, &quot;P1Y1H&quot;)),
  &quot;start3&quot;: get_interval_start_time(interval_start_from_time(&quot;08:30:00.000&quot;, &quot;P1H&quot;)),
  &quot;end3&quot;: get_interval_end_time(interval_start_from_time(&quot;08:30:00.000&quot;, &quot;P1H&quot;))
};
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{
  &quot;start1&quot;: date(&quot;1984-01-01&quot;),
  &quot;end1&quot;: date(&quot;1985-01-01&quot;),
  &quot;start2&quot;: datetime(&quot;1984-01-01T08:30:00.000Z&quot;),
  &quot;end2&quot;: datetime(&quot;1985-01-01T09:30:00.000Z&quot;),
  &quot;start3&quot;: time(&quot;08:30:00.000Z&quot;),
  &quot;end3&quot;: time(&quot;09:30:00.000Z&quot;)
}
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="get_overlapping_interval"></a>get_overlapping_interval</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>get_overlapping_interval(interval1, interval2)
</pre></div></div></li>
  
<li>
<p>Gets the start/end of the given interval for the specific date/datetime/time type.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>interval1</tt>: an <tt>interval</tt> value</li>
    
<li><tt>interval2</tt>: an <tt>interval</tt> value</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>an <tt>interval</tt> that is overlapping <tt>interval1</tt> and <tt>interval2</tt>.  If <tt>interval1</tt> and <tt>interval2</tt> do not overlap <tt>null</tt> is returned. Note each interval must be of the same type.</li>
    
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>any other non-interval input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;overlap1&quot;: get_overlapping_interval(interval(time(&quot;11:23:39&quot;), time(&quot;18:27:19&quot;)), interval(time(&quot;12:23:39&quot;), time(&quot;23:18:00&quot;))),
  &quot;overlap2&quot;: get_overlapping_interval(interval(time(&quot;12:23:39&quot;), time(&quot;18:27:19&quot;)), interval(time(&quot;07:19:39&quot;), time(&quot;09:18:00&quot;))),
  &quot;overlap3&quot;: get_overlapping_interval(interval(date(&quot;1980-11-30&quot;), date(&quot;1999-09-09&quot;)), interval(date(&quot;2013-01-01&quot;), date(&quot;2014-01-01&quot;))),
  &quot;overlap4&quot;: get_overlapping_interval(interval(date(&quot;1980-11-30&quot;), date(&quot;2099-09-09&quot;)), interval(date(&quot;2013-01-01&quot;), date(&quot;2014-01-01&quot;))),
  &quot;overlap5&quot;: get_overlapping_interval(interval(datetime(&quot;1844-03-03T11:19:39&quot;), datetime(&quot;2000-10-30T18:27:19&quot;)), interval(datetime(&quot;1989-03-04T12:23:39&quot;), datetime(&quot;2009-10-10T23:18:00&quot;))),
  &quot;overlap6&quot;: get_overlapping_interval(interval(datetime(&quot;1989-03-04T12:23:39&quot;), datetime(&quot;2000-10-30T18:27:19&quot;)), interval(datetime(&quot;1844-03-03T11:19:39&quot;), datetime(&quot;1888-10-10T23:18:00&quot;)))
};
</pre></div></div></li>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;overlap1&quot;: interval(time(&quot;12:23:39.000Z&quot;), time(&quot;18:27:19.000Z&quot;)),
  &quot;overlap2&quot;: null,
  &quot;overlap3&quot;: null,
  &quot;overlap4&quot;: interval(date(&quot;2013-01-01&quot;), date(&quot;2014_01_01&quot;)),
  &quot;overlap5&quot;: interval(datetime(&quot;1989-03-04T12:23:39.000Z&quot;), datetime(&quot;2000-10-30T18:27:19.000Z&quot;)),
  &quot;overlap6&quot;: null
}
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="interval_bin"></a>interval_bin</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>interval_bin(time_to_bin, time_bin_anchor, duration_bin_size)
</pre></div></div></li>
  
<li>
<p>Returns the <tt>interval</tt> value representing the bin containing the <tt>time_to_bin</tt> value.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>time_to_bin</tt>: a date/time/datetime value representing the time to be binned.</li>
    
<li><tt>time_bin_anchor</tt>: a date/time/datetime value representing an anchor of a bin starts. The type of this argument should be the same as the first <tt>time_to_bin</tt> argument.</li>
    
<li><tt>duration_bin_size</tt>: the duration value representing the size of the bin, in the type of year_month_duration or day_time_duration. The type of this duration should be compatible with the type of <tt>time_to_bin</tt>, so that the arithmetic operation between <tt>time_to_bin</tt> and <tt>duration_bin_size</tt> is well_defined. Currently AsterixDB supports the following arithmetic operations:
    
<ul>
      
<li>datetime +|_ year_month_duration</li>
      
<li>datetime +|_ day_time_duration</li>
      
<li>date +|_ year_month_duration</li>
      
<li>date +|_ day_time_duration</li>
      
<li>time +|_ day_time_duration</li>
    </ul></li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>interval</tt> value representing the bin containing the <tt>time_to_bin</tt> value. Note that the internal type of  this interval value should be the same as the <tt>time_to_bin</tt> type,</li>
    
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>a type error will be raised if:
    
<ul>
      
<li>the first argument or the second argument is any other non-date/non-time/non-datetime value,</li>
      
<li>or, the second argument is any other non-year_month_duration/non-day_time_duration value.</li>
    </ul></li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{
  &quot;bin1&quot;: interval_bin(date(&quot;2010-10-30&quot;), date(&quot;1990-01-01&quot;), year_month_duration(&quot;P1Y&quot;)),
  &quot;bin2&quot;: interval_bin(datetime(&quot;1987-11-19T23:49:23.938&quot;), datetime(&quot;1990-01-01T00:00:00.000Z&quot;), year_month_duration(&quot;P6M&quot;)),
  &quot;bin3&quot;: interval_bin(time(&quot;12:23:34.930+07:00&quot;), time(&quot;00:00:00&quot;), day_time_duration(&quot;PT1M&quot;)),
  &quot;bin4&quot;: interval_bin(datetime(&quot;1987-11-19T23:49:23.938&quot;), datetime(&quot;2013-01-01T00:00:00.000&quot;), day_time_duration(&quot;PT24H&quot;))
};
</pre></div></div></li>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{
  &quot;bin1&quot;: interval(date(&quot;2010-01-01&quot;),date(&quot;2011-01-01&quot;)),
  &quot;bin2&quot;: interval(datetime(&quot;1987-07-01T00:00:00.000Z&quot;), datetime(&quot;1988-01-01T00:00:00.000Z&quot;)),
  &quot;bin3&quot;: interval(time(&quot;05:23:00.000Z&quot;), time(&quot;05:24:00.000Z&quot;)),
  &quot;bin4&quot;: interval(datetime(&quot;1987-11-19T00:00:00.000Z&quot;), datetime(&quot;1987-11-20T00:00:00.000Z&quot;))
}
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="interval_start_from_datetimedatetime"></a>interval_start_from_date/time/datetime</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>interval_start_from_date/time/datetime(date/time/datetime, duration)
</pre></div></div></li>
  
<li>
<p>Construct an <tt>interval</tt> value by the given starting <tt>date</tt>/<tt>time</tt>/<tt>datetime</tt> and the <tt>duration</tt> that the interval lasts.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>date/time/datetime</tt>: a <tt>string</tt> representing a <tt>date</tt>, <tt>time</tt> or <tt>datetime</tt>, or a <tt>date</tt>/<tt>time</tt>/<tt>datetime</tt> value, representing the starting time point.</li>
    
<li><tt>duration</tt>: a <tt>string</tt> or <tt>duration</tt> value representing the duration of the interval. Note that duration cannot be negative value.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>an <tt>interval</tt> value representing the interval starting from the given time point with the length of duration,</li>
    
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>a type error will be raised if:
    
<ul>
      
<li>the first argument or the second argument is any other non-date/non-time/non-datetime value,</li>
      
<li>or, the second argument is any other non-duration value.</li>
    </ul></li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{
  &quot;interval1&quot;: interval_start_from_date(&quot;1984-01-01&quot;, &quot;P1Y&quot;),
  &quot;interval2&quot;: interval_start_from_time(time(&quot;02:23:28.394&quot;), &quot;PT3H24M&quot;),
  &quot;interval3&quot;: interval_start_from_datetime(&quot;1999-09-09T09:09:09.999&quot;, duration(&quot;P2M30D&quot;))
};
</pre></div></div></li>
  
<li>
<p>The expectecd result is:</p>
  
<div class="source">
<div class="source">
<pre>{
  &quot;interval1&quot;: interval(date(&quot;1984-01-01&quot;), date(&quot;1985-01-01&quot;)),
  &quot;interval2&quot;: interval(time(&quot;02:23:28.394Z&quot;), time(&quot;05:47:28.394Z&quot;)),
  &quot;interval3&quot;: interval(datetime(&quot;1999-09-09T09:09:09.999Z&quot;), datetime(&quot;1999-12-09T09:09:09.999Z&quot;))
}
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="overlap_bins"></a>overlap_bins</h3>

<ul>
  
<li>
<p>Return Value:</p>
  
<ul>
    
<li>a <tt>interval</tt> value representing the bin containing the <tt>time_to_bin</tt> value. Note that the internal type of this interval value should be the same as the <tt>time_to_bin</tt> type.</li>
  </ul></li>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>overlap_bins(interval, time_bin_anchor, duration_bin_size)
</pre></div></div></li>
  
<li>
<p>Returns an ordered list of <tt>interval</tt> values representing each bin that is overlapping the <tt>interval</tt>.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>interval</tt>: an <tt>interval</tt> value</li>
    
<li><tt>time_bin_anchor</tt>: a date/time/datetime value representing an anchor of a bin starts. The type of this argument should be the same as the first <tt>time_to_bin</tt> argument.</li>
    
<li><tt>duration_bin_size</tt>: the duration value representing the size of the bin, in the type of year_month_duration or day_time_duration. The type of this duration should be compatible with the type of <tt>time_to_bin</tt>, so that the arithmetic operation between <tt>time_to_bin</tt> and <tt>duration_bin_size</tt> is well_defined. Currently AsterixDB supports the following arithmetic operations:
    
<ul>
      
<li>datetime +|_ year_month_duration</li>
      
<li>datetime +|_ day_time_duration</li>
      
<li>date +|_ year_month_duration</li>
      
<li>date +|_ day_time_duration</li>
      
<li>time +|_ day_time_duration</li>
    </ul></li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a ordered list of <tt>interval</tt> values representing each bin that is overlapping the <tt>interval</tt>.  Note that the internal type as <tt>time_to_bin</tt> and <tt>duration_bin_size</tt>.</li>
    
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>a type error will be raised if:
    
<ul>
      
<li>the first arugment is any other non-interval value,</li>
      
<li>or, the second argument is any other non-date/non-time/non-datetime value,</li>
      
<li>or, the second argument is any other non-year_month_duration/non-day_time_duration value.</li>
    </ul></li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{
  &quot;timebins&quot;: overlap_bins(interval(time(&quot;17:23:37&quot;), time(&quot;18:30:21&quot;)), time(&quot;00:00:00&quot;), day_time_duration(&quot;PT30M&quot;)),
  &quot;datebins&quot;: overlap_bins(interval(date(&quot;1984-03-17&quot;), date(&quot;2013-08-22&quot;)), date(&quot;1990-01-01&quot;), year_month_duration(&quot;P10Y&quot;)),
  &quot;datetimebins&quot;: overlap_bins(interval(datetime(&quot;1800-01-01T23:59:48.938&quot;), datetime(&quot;2015-07-26T13:28:30.218&quot;)),
                              datetime(&quot;1900-01-01T00:00:00.000&quot;), year_month_duration(&quot;P100Y&quot;))
};
</pre></div></div></li>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{
  &quot;timebins&quot;: [
                interval(time(&quot;17:00:00.000Z&quot;), time(&quot;17:30:00.000Z&quot;)),
                interval(time(&quot;17:30:00.000Z&quot;), time(&quot;18:00:00.000Z&quot;)),
                interval(time(&quot;18:00:00.000Z&quot;), time(&quot;18:30:00.000Z&quot;)),
                interval(time(&quot;18:30:00.000Z&quot;), time(&quot;19:00:00.000Z&quot;))
              ],
  &quot;datebins&quot;: [
                interval(date(&quot;1980-01-01&quot;), date(&quot;1990-01-01&quot;)),
                interval(date(&quot;1990-01-01&quot;), date(&quot;2000-01-01&quot;)),
                interval(date(&quot;2000-01-01&quot;), date(&quot;2010-01-01&quot;)),
                interval(date(&quot;2010-01-01&quot;), date(&quot;2020-01-01&quot;))
              ],
  &quot;datetimebins&quot;: [
                    interval(datetime(&quot;1800-01-01T00:00:00.000Z&quot;), datetime(&quot;1900-01-01T00:00:00.000Z&quot;)),
                    interval(datetime(&quot;1900-01-01T00:00:00.000Z&quot;), datetime(&quot;2000-01-01T00:00:00.000Z&quot;)),
                    interval(datetime(&quot;2000-01-01T00:00:00.000Z&quot;), datetime(&quot;2100-01-01T00:00:00.000Z&quot;))
                   ]
};
</pre></div></div></li>
</ul>
<!-- ! 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.
 ! --></div>
<div class="section">
<h3><a name="interval_before_interval_after"></a>interval_before, interval_after</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>interval_before(interval1, interval2)
interval_after(interval1, interval2)
</pre></div></div></li>
  
<li>
<p>These two functions check whether an interval happens before/after another interval.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>interval1</tt>, <tt>interval2</tt>: two intervals to be compared</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>boolean</tt> value. Specifically, <tt>interval_before(interval1, interval2)</tt> is true if and  only if <tt>interval1.end &lt; interval2.start</tt>, and <tt>interval_after(interval1, interval2)</tt> is true  if and only if <tt>interval1.start &gt; interval2.end</tt>.</li>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>any other non-interval input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Examples:</p>
  
<div class="source">
<div class="source">
<pre>{
  &quot;interval_before&quot;: interval_before(interval(date(&quot;2000-01-01&quot;), date(&quot;2005-01-01&quot;)),
                                     interval(date(&quot;2005-05-01&quot;), date(&quot;2012-09-09&quot;))),
  &quot;interval_after&quot;: interval_after(interval(date(&quot;2005-05-01&quot;), date(&quot;2012-09-09&quot;)),
                                   interval(date(&quot;2000-01-01&quot;), date(&quot;2005-01-01&quot;)))
};
</pre></div></div></li>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;interval_before&quot;: true, &quot;interval_after&quot;: true }
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="interval_covers_interval_covered_by"></a>interval_covers, interval_covered_by</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>interval_covers(interval1, interval2)
interval_covered_by(interval1, interval2)
</pre></div></div></li>
  
<li>
<p>These two functions check whether one interval covers the other interval.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>interval1</tt>, <tt>interval2</tt>: two intervals to be compared</li>
  </ul></li>
  
<li>
<p>Return Value:</p>
  
<ul>
    
<li>a <tt>boolean</tt> value. Specifically, <tt>interval_covers(interval1, interval2)</tt> is true if and only if</li>
  </ul>
  
<div class="source">
<div class="source">
<pre>interval1.start &lt;= interval2.start AND interval1.end &gt;= interval2.end

`interval_covered_by(interval1, interval2)` is true if and only if

interval2.start &lt;= interval1.start AND interval2.end &gt;= interval1.end
</pre></div></div>
  
<ul>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>any other non-interval input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Examples:</p>
  
<div class="source">
<div class="source">
<pre>{
  &quot;interval_covers&quot;: interval_covers(interval(date(&quot;2000-01-01&quot;), date(&quot;2005-01-01&quot;)),
                                     interval(date(&quot;2000-03-01&quot;), date(&quot;2004-09-09&quot;))),
  &quot;interval_covered_by&quot;: interval_covered_by(interval(date(&quot;2006-08-01&quot;), date(&quot;2007-03-01&quot;)),
                                             interval(date(&quot;2004-09-10&quot;), date(&quot;2012-08-01&quot;)))
};
</pre></div></div></li>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;interval_covers&quot;: true, &quot;interval_covered_by&quot;: true }
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="interval_overlaps_interval_overlapped_by"></a>interval_overlaps, interval_overlapped_by</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>interval_overlaps(interval1, interval2)
interval_overlapped_by(interval1, interval2)
</pre></div></div></li>
  
<li>
<p>These functions check whether two intervals overlap with each other.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>interval1</tt>, <tt>interval2</tt>: two intervals to be compared</li>
  </ul></li>
  
<li>
<p>Return Value:</p>
  
<ul>
    
<li>a <tt>boolean</tt> value. Specifically, <tt>interval_overlaps(interval1, interval2)</tt> is true if and only if</li>
  </ul>
  
<div class="source">
<div class="source">
<pre>interval1.start &lt; interval2.start
AND interval2.end &gt; interval1.end
AND interval1.end &gt; interval2.start
</pre></div></div>
<p><tt>interval_overlapped_by(interval1, interval2)</tt> is true if and only if</p>
  
<div class="source">
<div class="source">
<pre>interval2.start &lt; interval1.start
AND interval1.end &gt; interval2.end
AND interval2.end &gt; interval1.start
</pre></div></div>
  
<ul>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>any other non-interval input value will cause a type error.</li>
  </ul>
<p>Note that <tt>interval_overlaps</tt> and <tt>interval_overlapped_by</tt> are following the Allen&#x2019;s relations on the definition of overlap.</p></li>
  
<li>
<p>Examples:</p>
  
<div class="source">
<div class="source">
<pre>{
  &quot;overlaps&quot;: interval_overlaps(interval(date(&quot;2000-01-01&quot;), date(&quot;2005-01-01&quot;)),
                                interval(date(&quot;2004-05-01&quot;), date(&quot;2012-09-09&quot;))),
  &quot;overlapped_by&quot;: interval_overlapped_by(interval(date(&quot;2006-08-01&quot;), date(&quot;2007-03-01&quot;)),
                                          interval(date(&quot;2004-05-01&quot;), date(&quot;2012-09-09&quot;))))
};
</pre></div></div></li>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;overlaps&quot;: true, &quot;overlapped_by&quot;: true }
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="interval_overlapping"></a>interval_overlapping</h3>
<p>Note that <tt>interval_overlapping</tt> is not an Allen&#x2019;s Relation, but syntactic sugar we added for the case that the intersect of two intervals is not empty. Basically this function returns true if any of these functions return true: <tt>interval_overlaps</tt>, <tt>interval_overlapped_by</tt>, <tt>interval_covers</tt>, or <tt>interval_covered_by</tt>.</p>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>interval_overlapping(interval1, interval2)
</pre></div></div></li>
  
<li>
<p>This functions check whether two intervals share any points with each other.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>interval1</tt>, <tt>interval2</tt>: two intervals to be compared</li>
  </ul></li>
  
<li>
<p>Return Value:</p>
  
<ul>
    
<li>a <tt>boolean</tt> value. Specifically, <tt>interval_overlapping(interval1, interval2)</tt> is true if</li>
  </ul>
  
<div class="source">
<div class="source">
<pre>interval1.start &lt; interval2.end
AND interval1.end &gt; interval2.start
</pre></div></div>
  
<ul>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>any other non-interval input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Examples:</p>
  
<div class="source">
<div class="source">
<pre>{
  &quot;overlapping1&quot;: interval_overlapping(interval(date(&quot;2000-01-01&quot;), date(&quot;2005-01-01&quot;)),
                                       interval(date(&quot;2004-05-01&quot;), date(&quot;2012-09-09&quot;))),
  &quot;overlapping2&quot;: interval_overlapping(interval(date(&quot;2006-08-01&quot;), date(&quot;2007-03-01&quot;)),
                                       interval(date(&quot;2004-09-10&quot;), date(&quot;2006-12-31&quot;)))
};
</pre></div></div></li>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;overlapping1&quot;: true, &quot;overlapping2&quot;: true }
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="interval_meets_interval_met_by"></a>interval_meets, interval_met_by</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>interval_meets(interval1, interval2)
interval_met_by(interval1, interval2)
</pre></div></div></li>
  
<li>
<p>These two functions check whether an interval meets with another interval.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>interval1</tt>, <tt>interval2</tt>: two intervals to be compared</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>boolean</tt> value. Specifically, <tt>interval_meets(interval1, interval2)</tt> is true if and only if  <tt>interval1.end = interval2.start</tt>, and <tt>interval_met_by(interval1, interval2)</tt> is true if and only  if <tt>interval1.start = interval2.end</tt>. If any of the two inputs is <tt>null</tt>, <tt>null</tt> is returned.</li>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>any other non-interval input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Examples:</p>
  
<div class="source">
<div class="source">
<pre>{
  &quot;meets&quot;: interval_meets(interval(date(&quot;2000-01-01&quot;), date(&quot;2005-01-01&quot;)),
                          interval(date(&quot;2005-01-01&quot;), date(&quot;2012-09-09&quot;))),
  &quot;metby&quot;: interval_met_by(interval(date(&quot;2006-08-01&quot;), date(&quot;2007-03-01&quot;)),
                           interval(date(&quot;2004-09-10&quot;), date(&quot;2006-08-01&quot;)))
};
</pre></div></div></li>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;meets&quot;: true, &quot;metby&quot;: true }
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="interval_starts_interval_started_by"></a>interval_starts, interval_started_by</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>interval_starts(interval1, interval2)
interval_started_by(interval1, interval2)
</pre></div></div></li>
  
<li>
<p>These two functions check whether one interval starts with the other interval.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>interval1</tt>, <tt>interval2</tt>: two intervals to be compared</li>
  </ul></li>
  
<li>
<p>Return Value:</p>
  
<ul>
    
<li>a <tt>boolean</tt> value. Specifically, <tt>interval_starts(interval1, interval2)</tt> returns true if and only if</li>
  </ul>
  
<div class="source">
<div class="source">
<pre>interval1.start = interval2.start
AND interval1.end &lt;= interval2.end
</pre></div></div>
<p><tt>interval_started_by(interval1, interval2)</tt> returns true if and only if</p>
  
<div class="source">
<div class="source">
<pre>interval1.start = interval2.start
AND interval2.end &lt;= interval1.end
</pre></div></div>
  
<ul>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>any other non-interval input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Examples:</p>
  
<div class="source">
<div class="source">
<pre>{
  &quot;interval_starts&quot;: interval_starts(interval(date(&quot;2000-01-01&quot;), date(&quot;2005-01-01&quot;)),
                                     interval(date(&quot;2000-01-01&quot;), date(&quot;2012-09-09&quot;))),
  &quot;interval_started_by&quot;: interval_started_by(interval(date(&quot;2006-08-01&quot;), date(&quot;2007-03-01&quot;)),
                                             interval(date(&quot;2006-08-01&quot;), date(&quot;2006-08-02&quot;)))
};
</pre></div></div></li>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;interval_starts&quot;: true, &quot;interval_started_by&quot;: true }
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="interval_ends_interval_ended_by"></a>interval_ends, interval_ended_by</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>interval_ends(interval1, interval2)
interval_ended_by(interval1, interval2)
</pre></div></div></li>
  
<li>
<p>These two functions check whether one interval ends with the other interval.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>interval1</tt>, <tt>interval2</tt>: two intervals to be compared</li>
  </ul></li>
  
<li>
<p>Return Value:</p>
  
<ul>
    
<li>a <tt>boolean</tt> value. Specifically, <tt>interval_ends(interval1, interval2)</tt> returns true if and only if</li>
  </ul>
  
<div class="source">
<div class="source">
<pre>interval1.end = interval2.end
AND interval1.start &gt;= interval2.start

`interval_ended_by(interval1, interval2)` returns true if and only if

interval2.end = interval1.end
AND interval2.start &gt;= interval1.start
</pre></div></div>
  
<ul>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>any other non-interval input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Examples:</p>
  
<div class="source">
<div class="source">
<pre>{
  &quot;interval_ends&quot;: interval_ends(interval(date(&quot;2000-01-01&quot;), date(&quot;2005-01-01&quot;)),
                                 interval(date(&quot;1998-01-01&quot;), date(&quot;2005-01-01&quot;))),
  &quot;interval_ended_by&quot;: interval_ended_by(interval(date(&quot;2006-08-01&quot;), date(&quot;2007-03-01&quot;)),
                                         interval(date(&quot;2006-09-10&quot;), date(&quot;2007-03-01&quot;)))
};
</pre></div></div></li>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;interval_ends&quot;: true, &quot;interval_ended_by&quot;: true }
</pre></div></div></li>
</ul>
<!-- ! 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.
 ! --></div></div>
<div class="section">
<h2><a name="Object_Functions"></a><a name="ObjectFunctions" id="ObjectFunctions">Object Functions</a></h2>
<div class="section">
<h3><a name="get_object_fields"></a>get_object_fields</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>get_object_fields(input_object)
</pre></div></div></li>
  
<li>
<p>Access the object field names, type and open status for a given object.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>input_object</tt> : a object value.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>an array of <tt>object</tt> values that include the field_name <tt>string</tt>,  field_type <tt>string</tt>, is_open <tt>boolean</tt> (used for debug purposes only: <tt>true</tt> if field is open and <tt>false</tt> otherwise),  and optional nested <tt>orderedList</tt> for the values of a nested object,</li>
    
<li><tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if the argument is a <tt>null</tt> value,</li>
    
<li>any other non-object input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>get_object_fields(
                  {
                    &quot;id&quot;: 1,
                    &quot;project&quot;: &quot;AsterixDB&quot;,
                    &quot;address&quot;: {&quot;city&quot;: &quot;Irvine&quot;, &quot;state&quot;: &quot;CA&quot;},
                    &quot;related&quot;: [&quot;Hivestrix&quot;, &quot;Preglix&quot;, &quot;Apache VXQuery&quot;]
                  }
                 );
</pre></div></div></li>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>[
  { &quot;field-name&quot;: &quot;id&quot;, &quot;field-type&quot;: &quot;INT64&quot;, &quot;is-open&quot;: false },
  { &quot;field-name&quot;: &quot;project&quot;, &quot;field-type&quot;: &quot;STRING&quot;, &quot;is-open&quot;: false },
  { &quot;field-name&quot;: &quot;address&quot;, &quot;field-type&quot;: &quot;RECORD&quot;, &quot;is-open&quot;: false,
    &quot;nested&quot;: [
                { &quot;field-name&quot;: &quot;city&quot;, &quot;field-type&quot;: &quot;STRING&quot;, &quot;is-open&quot;: false },
                { &quot;field-name&quot;: &quot;state&quot;, &quot;field-type&quot;: &quot;STRING&quot;, &quot;is-open&quot;: false }
              ]
  },
  { &quot;field-name&quot;:
        &quot;related&quot;,
        &quot;field-type&quot;: &quot;ORDEREDLIST&quot;,
        &quot;is-open&quot;: false,
        &quot;list&quot;: [
                  { &quot;field-type&quot;: &quot;STRING&quot; },
                  { &quot;field-type&quot;: &quot;STRING&quot; },
                  { &quot;field-type&quot;: &quot;STRING&quot; }
                ]
  }
]
</pre></div></div></li>
</ul>
<p>]</p></div>
<div class="section">
<h3><a name="get_object_field_value"></a>get_object_field_value</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>get_object_field_value(input_object, string)
</pre></div></div></li>
  
<li>
<p>Access the field name given in the <tt>string_expression</tt> from the <tt>object_expression</tt>.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>input_object</tt> : a <tt>object</tt> value.</li>
    
<li><tt>string</tt> : a <tt>string</tt> representing the top level field name.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>an <tt>any</tt> value saved in the designated field of the object,</li>
    
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>a type error will be raised if:
    
<ul>
      
<li>the first argument is any other non-object value,</li>
      
<li>or, the second argument is any other non-string value.</li>
    </ul></li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>get_object_field_value({
                         &quot;id&quot;: 1,
                         &quot;project&quot;: &quot;AsterixDB&quot;,
                         &quot;address&quot;: {&quot;city&quot;: &quot;Irvine&quot;, &quot;state&quot;: &quot;CA&quot;},
                         &quot;related&quot;: [&quot;Hivestrix&quot;, &quot;Preglix&quot;, &quot;Apache VXQuery&quot;]
                        },
                        &quot;project&quot;
                       );
</pre></div></div></li>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>&quot;AsterixDB&quot;
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="object_remove_fields"></a>object_remove_fields</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>object_remove_fields(input_object, field_names)
</pre></div></div></li>
  
<li>
<p>Remove indicated fields from a object given a list of field names.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>input_object</tt>: a object value.</li>
    
<li><tt>field_names</tt>: an array of strings and/or array of array of strings.</li>
  </ul></li>
  
<li>
<p>Return Value:</p>
  
<ul>
    
<li>a new object value without the fields listed in the second argument,</li>
    
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>a type error will be raised if:
    
<ul>
      
<li>the first argument is any other non-object value,</li>
      
<li>or, the second argument is any other non-array value or recursively contains non-string items.</li>
    </ul></li>
  </ul></li>
</ul>

<ul>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>object_remove_fields(
                       {
                         &quot;id&quot;:1,
                         &quot;project&quot;:&quot;AsterixDB&quot;,
                         &quot;address&quot;:{&quot;city&quot;:&quot;Irvine&quot;, &quot;state&quot;:&quot;CA&quot;},
                         &quot;related&quot;:[&quot;Hivestrix&quot;, &quot;Preglix&quot;, &quot;Apache VXQuery&quot;]
                       },
                       [[&quot;address&quot;, &quot;city&quot;], &quot;related&quot;]
                     );
</pre></div></div></li>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{
  &quot;id&quot;:1,
  &quot;project&quot;:&quot;AsterixDB&quot;,
  &quot;address&quot;:{ &quot;state&quot;: &quot;CA&quot; }
}
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="object_add_fields"></a>object_add_fields</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>object_add_fields(input_object, fields)
</pre></div></div></li>
  
<li>
<p>Add fields to a object given a list of field names.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>input_object</tt> : a object value.</li>
    
<li><tt>fields</tt>: an array of field descriptor objects where each object has field_name and field_value.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a new object value with the new fields included,</li>
    
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>a type error will be raised if:
    
<ul>
      
<li>the first argument is any other non-object value,</li>
      
<li>the second argument is any other non-array value, or contains non-object items.</li>
    </ul></li>
  </ul></li>
</ul>

<ul>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>object_add_fields(
                   {
                     &quot;id&quot;:1,
                     &quot;project&quot;:&quot;AsterixDB&quot;,
                     &quot;address&quot;:{&quot;city&quot;:&quot;Irvine&quot;, &quot;state&quot;:&quot;CA&quot;},
                     &quot;related&quot;:[&quot;Hivestrix&quot;, &quot;Preglix&quot;, &quot;Apache VXQuery&quot;]
                    },
                    [{&quot;field-name&quot;:&quot;employment_location&quot;, &quot;field-value&quot;:create_point(30.0,70.0)}]
                  );
</pre></div></div></li>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{
   &quot;id&quot;:1,
   &quot;project&quot;:&quot;AsterixDB&quot;,
   &quot;address&quot;:{&quot;city&quot;:&quot;Irvine&quot;, &quot;state&quot;:&quot;CA&quot;},
   &quot;related&quot;:[&quot;Hivestrix&quot;, &quot;Preglix&quot;, &quot;Apache VXQuery&quot;]
   &quot;employment_location&quot;: point(&quot;30.0,70.0&quot;)
 }
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="object_merge"></a>object_merge</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>object_merge(object1, object2)
</pre></div></div></li>
  
<li>
<p>Merge two different objects into a new object.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>object1</tt> : a object value.</li>
    
<li><tt>object2</tt> : a object value.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a new object value with fields from both input objects. If a field&#x2019;s names in both objects are the same,  an exception is issued,</li>
    
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>any other non-object input value will cause a type error.</li>
  </ul></li>
</ul>

<ul>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>object_merge(
              {
                &quot;id&quot;:1,
                &quot;project&quot;:&quot;AsterixDB&quot;,
                &quot;address&quot;:{&quot;city&quot;:&quot;Irvine&quot;, &quot;state&quot;:&quot;CA&quot;},
                &quot;related&quot;:[&quot;Hivestrix&quot;, &quot;Preglix&quot;, &quot;Apache VXQuery&quot;]
              },
              {
                &quot;user_id&quot;: 22,
                &quot;employer&quot;: &quot;UC Irvine&quot;,
                &quot;employment_type&quot;: &quot;visitor&quot;
              }
            );
</pre></div></div></li>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{
  &quot;employment_type&quot;: &quot;visitor&quot;,
  &quot;address&quot;: {
    &quot;city&quot;: &quot;Irvine&quot;,
    &quot;state&quot;: &quot;CA&quot;
  },
  &quot;related&quot;: [
    &quot;Hivestrix&quot;,
    &quot;Preglix&quot;,
    &quot;Apache VXQuery&quot;
  ],
  &quot;user_id&quot;: 22,
  &quot;project&quot;: &quot;AsterixDB&quot;,
  &quot;employer&quot;: &quot;UC Irvine&quot;,
  &quot;id&quot;: 1
}
</pre></div></div></li>
</ul>
<!-- ! 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.
 ! --></div></div>
<div class="section">
<h2><a name="Aggregate_Functions_Array_Functions"></a><a name="AggregateFunctions" id="AggregateFunctions">Aggregate Functions (Array Functions) </a></h2>
<p>This section contains detailed descriptions of each SQL++ aggregate function (i.e., array function). Note that as described in the SQL++ query reference documentation, standard SQL aggregate functions (e.g., <tt>MIN</tt>, <tt>MAX</tt>, <tt>SUM</tt>, <tt>COUNT</tt>, and <tt>AVG</tt>) are not real functions in SQL++ but just syntactic sugars over corresponding SQL++ builtin aggregate functions (e.g., <tt>ARRAY_MIN</tt>, <tt>ARRAY_MAX</tt>, <tt>ARRAY_SUM</tt>, <tt>ARRAY_COUNT</tt>, and <tt>ARRAY_AVG</tt>).</p>
<div class="section">
<h3><a name="array_count"></a>array_count</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>array_count(collection)
</pre></div></div></li>
  
<li>
<p>Gets the number of non-null and non-missing items in the given collection.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>collection</tt> could be:
    
<ul>
      
<li>an <tt>array</tt> or <tt>multiset</tt> to be counted,</li>
      
<li>or, a <tt>null</tt> value,</li>
      
<li>or, a <tt>missing</tt> value.</li>
    </ul></li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>bigint</tt> value representing the number of non-null and non-missing items in the given collection,</li>
    
<li><tt>null</tt> is returned if the input is <tt>null</tt> or <tt>missing</tt>,</li>
    
<li>any other non-array and non-multiset input value will cause an error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>array_count( ['hello', 'world', 1, 2, 3, null, missing] );
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>5
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="array_avg"></a>array_avg</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>array_avg(num_collection)
</pre></div></div></li>
  
<li>
<p>Gets the average value of the non-null and non-missing numeric items in the given collection.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>num_collection</tt> could be:
    
<ul>
      
<li>an <tt>array</tt> or <tt>multiset</tt> containing numeric values, <tt>null</tt>s or <tt>missing</tt>s,</li>
      
<li>or, a <tt>null</tt> value,</li>
      
<li>or, a <tt>missing</tt> value.</li>
    </ul></li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>double</tt> value representing the average of the non-null and non-missing numbers in the given collection,</li>
    
<li><tt>null</tt> is returned if the input is <tt>null</tt> or <tt>missing</tt>,</li>
    
<li><tt>null</tt> is returned if the given collection does not contain any non-null and non-missing items,</li>
    
<li>any other non-array and non-multiset input value will cause a type error,</li>
    
<li>any other non-numeric value in the input collection will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>array_avg( [1.2, 2.3, 3.4, 0, null] );
</pre></div></div></li>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>1.725
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="array_sum"></a>array_sum</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>array_sum(num_collection)
</pre></div></div></li>
  
<li>
<p>Gets the sum of non-null and non-missing items in the given collection.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>num_collection</tt> could be:
    
<ul>
      
<li>an <tt>array</tt> or <tt>multiset</tt> containing numeric values, <tt>null</tt>s or <tt>missing</tt>s,</li>
      
<li>or, a <tt>null</tt> value,</li>
      
<li>or, a <tt>missing</tt> value.</li>
    </ul></li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>the sum of the non-null and non-missing numbers in the given collection.  The returning type is decided by the item type with the highest  order in the numeric type promotion order (<tt>tinyint</tt>-&gt; <tt>smallint</tt>-&gt;<tt>integer</tt>-&gt;<tt>bigint</tt>-&gt;<tt>float</tt>-&gt;<tt>double</tt>) among  items.</li>
    
<li><tt>null</tt> is returned if the input is <tt>null</tt> or <tt>missing</tt>,</li>
    
<li><tt>null</tt> is returned if the given collection does not contain any non-null and non-missing items,</li>
    
<li>any other non-array and non-multiset input value will cause a type error,</li>
    
<li>any other non-numeric value in the input collection will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>array_sum( [1.2, 2.3, 3.4, 0, null, missing] );
</pre></div></div></li>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>6.9
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="array_sql_min"></a>array_sql_min</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>array_min(num_collection)
</pre></div></div></li>
  
<li>
<p>Gets the min value of non-null and non-missing comparable items in the given collection.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>num_collection</tt> could be:
    
<ul>
      
<li>an <tt>array</tt> or <tt>multiset</tt>,</li>
      
<li>or, a <tt>null</tt> value,</li>
      
<li>or, a <tt>missing</tt> value.</li>
    </ul></li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>the min value of non-null and non-missing values in the given collection.  The returning type is decided by the item type with the highest order in the  type promotion order (<tt>tinyint</tt>-&gt; <tt>smallint</tt>-&gt;<tt>integer</tt>-&gt;<tt>bigint</tt>-&gt;<tt>float</tt>-&gt;<tt>double</tt>) among numeric items.</li>
    
<li><tt>null</tt> is returned if the input is <tt>null</tt> or <tt>missing</tt>,</li>
    
<li><tt>null</tt> is returned if the given collection does not contain any non-null and non-missing items,</li>
    
<li>multiple incomparable items in the input array or multiset will cause a type error,</li>
    
<li>any other non-array and non-multiset input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>array_min( [1.2, 2.3, 3.4, 0, null, missing] );
</pre></div></div></li>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>0.0
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="array_max"></a>array_max</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>array_max(num_collection)
</pre></div></div></li>
  
<li>
<p>Gets the max value of the non-null and non-missing comparable items in the given collection.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>num_collection</tt> could be:
    
<ul>
      
<li>an <tt>array</tt> or <tt>multiset</tt>,</li>
      
<li>or, a <tt>null</tt> value,</li>
      
<li>or, a <tt>missing</tt> value.</li>
    </ul></li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>the max value of non-null and non-missing numbers in the given collection.  The returning type is decided by the item type with the highest order in the  type promotion order (<tt>tinyint</tt>-&gt; <tt>smallint</tt>-&gt;<tt>integer</tt>-&gt;<tt>bigint</tt>-&gt;<tt>float</tt>-&gt;<tt>double</tt>) among numeric items.</li>
    
<li><tt>null</tt> is returned if the input is <tt>null</tt> or <tt>missing</tt>,</li>
    
<li><tt>null</tt> is returned if the given collection does not contain any non-null and non-missing items,</li>
    
<li>multiple incomparable items in the input array or multiset will cause a type error,</li>
    
<li>any other non-array and non-multiset input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>array_max( [1.2, 2.3, 3.4, 0, null, missing] );
</pre></div></div></li>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>3.4
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="coll_count"></a>coll_count</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>coll_count(collection)
</pre></div></div></li>
  
<li>
<p>Gets the number of items in the given collection.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>collection</tt> could be:
    
<ul>
      
<li>an <tt>array</tt> or <tt>multiset</tt> containing the items to be counted,</li>
      
<li>or a <tt>null</tt> value,</li>
      
<li>or a <tt>missing</tt> value.</li>
    </ul></li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>bigint</tt> value representing the number of items in the given collection,</li>
    
<li><tt>null</tt> is returned if the input is <tt>null</tt> or <tt>missing</tt>.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>coll_count( [1, 2, null, missing] );
</pre></div></div></li>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>4
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="coll_avg"></a>coll_avg</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>coll_avg(num_collection)
</pre></div></div></li>
  
<li>
<p>Gets the average value of the numeric items in the given collection.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>num_collection</tt> could be:
    
<ul>
      
<li>an <tt>array</tt> or <tt>multiset</tt> containing numeric values, <tt>null</tt>s or <tt>missing</tt>s,</li>
      
<li>or, a <tt>null</tt> value,</li>
      
<li>or, a <tt>missing</tt> value.</li>
    </ul></li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>double</tt> value representing the average of the numbers in the given collection,</li>
    
<li><tt>null</tt> is returned if the input is <tt>null</tt> or <tt>missing</tt>,</li>
    
<li><tt>null</tt> is returned if there is a <tt>null</tt> or <tt>missing</tt> in the input collection,</li>
    
<li>any other non-numeric value in the input collection will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>coll_avg( [100, 200, 300] );
</pre></div></div></li>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>[ 200.0 ]
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="coll_sum"></a>coll_sum</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>coll_sum(num_collection)
</pre></div></div></li>
  
<li>
<p>Gets the sum of the items in the given collection.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>num_collection</tt> could be:
    
<ul>
      
<li>an <tt>array</tt> or <tt>multiset</tt> containing numeric values, <tt>null</tt>s or <tt>missing</tt>s,</li>
      
<li>or, a <tt>null</tt> value,</li>
      
<li>or, a <tt>missing</tt> value.</li>
    </ul></li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>the sum of the numbers in the given collection. The returning type is decided by the item type with the highest  order in the numeric type promotion order (<tt>tinyint</tt>-&gt; <tt>smallint</tt>-&gt;<tt>integer</tt>-&gt;<tt>bigint</tt>-&gt;<tt>float</tt>-&gt;<tt>double</tt>) among  items.</li>
    
<li><tt>null</tt> is returned if the input is <tt>null</tt> or <tt>missing</tt>,</li>
    
<li><tt>null</tt> is returned if there is a <tt>null</tt> or <tt>missing</tt> in the input collection,</li>
    
<li>any other non-numeric value in the input collection will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>coll_sum( [100, 200, 300] );
</pre></div></div></li>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>600
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="array_min"></a>array_min</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>coll_min(num_collection)
</pre></div></div></li>
  
<li>
<p>Gets the min value of comparable items in the given collection.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>num_collection</tt> could be:
    
<ul>
      
<li>an <tt>array</tt> or <tt>multiset</tt>,</li>
      
<li>or, a <tt>null</tt> value,</li>
      
<li>or, a <tt>missing</tt> value.</li>
    </ul></li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>the min value of the given collection.  The returning type is decided by the item type with the highest order in the type promotion order  (<tt>tinyint</tt>-&gt; <tt>smallint</tt>-&gt;<tt>integer</tt>-&gt;<tt>bigint</tt>-&gt;<tt>float</tt>-&gt;<tt>double</tt>) among numeric items.</li>
    
<li><tt>null</tt> is returned if the input is <tt>null</tt> or <tt>missing</tt>,</li>
    
<li><tt>null</tt> is returned if there is a <tt>null</tt> or <tt>missing</tt> in the input collection,</li>
    
<li>multiple incomparable items in the input array or multiset will cause a type error,</li>
    
<li>any other non-array and non-multiset input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>coll_min( [10.2, 100, 5] );
</pre></div></div></li>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>5.0
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="array_max"></a>array_max</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>coll_max(num_collection)
</pre></div></div></li>
  
<li>
<p>Gets the max value of numeric items in the given collection.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>num_collection</tt> could be:
    
<ul>
      
<li>an <tt>array</tt> or <tt>multiset</tt>,</li>
      
<li>or, a <tt>null</tt> value,</li>
      
<li>or, a <tt>missing</tt> value.</li>
    </ul></li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>The max value of the given collection.  The returning type is decided by the item type with the highest order in the type promotion order  (<tt>tinyint</tt>-&gt; <tt>smallint</tt>-&gt;<tt>integer</tt>-&gt;<tt>bigint</tt>-&gt;<tt>float</tt>-&gt;<tt>double</tt>) among numeric items.</li>
    
<li><tt>null</tt> is returned if the input is <tt>null</tt> or <tt>missing</tt>,</li>
    
<li><tt>null</tt> is returned if there is a <tt>null</tt> or <tt>missing</tt> in the input collection,</li>
    
<li>multiple incomparable items in the input array or multiset will cause a type error,</li>
    
<li>any other non-array and non-multiset input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>coll_max( [10.2, 100, 5] );
</pre></div></div></li>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>100.0
</pre></div></div></li>
</ul>
<!-- ! 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.
 ! --></div></div>
<div class="section">
<h2><a name="Comparison_Functions"></a><a name="ComparisonFunctions" id="ComparisonFunctions">Comparison Functions</a></h2>
<div class="section">
<h3><a name="greatest"></a>greatest</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>greatest(numeric_value1, numeric_value2, ...)
</pre></div></div></li>
  
<li>
<p>Computes the greatest value among arguments.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>numeric_value1</tt>: a <tt>tinyint</tt>/<tt>smallint</tt>/<tt>integer</tt>/<tt>bigint</tt>/<tt>float</tt>/<tt>double</tt> value,</li>
    
<li><tt>numeric_value2</tt>: a <tt>tinyint</tt>/<tt>smallint</tt>/<tt>integer</tt>/<tt>bigint</tt>/<tt>float</tt>/<tt>double</tt> value,</li>
    
<li>&#x2026;.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>the greatest values among arguments.  The returning type is decided by the item type with the highest  order in the numeric type promotion order (<tt>tinyint</tt>-&gt; <tt>smallint</tt>-&gt;<tt>integer</tt>-&gt;<tt>bigint</tt>-&gt;<tt>float</tt>-&gt;<tt>double</tt>)  among items.</li>
    
<li><tt>null</tt> if any argument is a <tt>missing</tt> value or <tt>null</tt> value,</li>
    
<li>any other non-numeric input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: greatest(1, 2, 3), &quot;v2&quot;: greatest(float(&quot;0.5&quot;), double(&quot;-0.5&quot;), 5000) };
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: 3, &quot;v2&quot;: 5000.0 }
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="least"></a>least</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>least(numeric_value1, numeric_value2, ...)
</pre></div></div></li>
  
<li>
<p>Computes the least value among arguments.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>numeric_value1</tt>: a <tt>tinyint</tt>/<tt>smallint</tt>/<tt>integer</tt>/<tt>bigint</tt>/<tt>float</tt>/<tt>double</tt> value,</li>
    
<li><tt>numeric_value2</tt>: a <tt>tinyint</tt>/<tt>smallint</tt>/<tt>integer</tt>/<tt>bigint</tt>/<tt>float</tt>/<tt>double</tt> value,</li>
    
<li>&#x2026;.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>the least values among arguments.  The returning type is decided by the item type with the highest  order in the numeric type promotion order (<tt>tinyint</tt>-&gt; <tt>smallint</tt>-&gt;<tt>integer</tt>-&gt;<tt>bigint</tt>-&gt;<tt>float</tt>-&gt;<tt>double</tt>)  among items.</li>
    
<li><tt>null</tt> if any argument is a <tt>missing</tt> value or <tt>null</tt> value,</li>
    
<li>any other non-numeric input value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: least(1, 2, 3), &quot;v2&quot;: least(float(&quot;0.5&quot;), double(&quot;-0.5&quot;), 5000) };
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: 1, &quot;v2&quot;: -0.5 }
</pre></div></div></li>
</ul>
<!-- ! 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.
 ! --></div></div>
<div class="section">
<h2><a name="Type_Functions"></a><a name="TypeFunctions" id="TypeFunctions">Type Functions</a></h2>
<div class="section">
<h3><a name="is_array_isarray"></a>is_array (isarray)</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>is_array(expr)
</pre></div></div></li>
  
<li>
<p>Checks whether the given expression is evaluated to be an <tt>array</tt> value.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>expr</tt> : an expression (any type is allowed).</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>boolean</tt> on whether the argument is an <tt>array</tt> value or not,</li>
    
<li>a <tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li>a <tt>null</tt> if the argument is a <tt>null</tt> value.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{
  &quot;a&quot;: is_array(true),
  &quot;b&quot;: is_array(false),
  &quot;c&quot;: isarray(null),
  &quot;d&quot;: isarray(missing),
  &quot;e&quot;: isarray(&quot;d&quot;),
  &quot;f&quot;: isarray(4.0),
  &quot;g&quot;: isarray(5),
  &quot;h&quot;: isarray([&quot;1&quot;, 2]),
  &quot;i&quot;: isarray({&quot;a&quot;:1})
};
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;a&quot;: false, &quot;b&quot;: false, &quot;c&quot;: null, &quot;e&quot;: false, &quot;f&quot;: false, &quot;g&quot;: false, &quot;h&quot;: true, &quot;i&quot;: false }
</pre></div></div></li>
</ul>
<p>The function has an alias <tt>isarray</tt>.</p></div>
<div class="section">
<h3><a name="is_boolean_isboolean_isbool"></a>is_boolean (isboolean, isbool)</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>is_boolean(expr)
</pre></div></div></li>
  
<li>
<p>Checks whether the given expression is evaluated to be a <tt>boolean</tt> value.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>expr</tt> : an expression (any type is allowed).</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>boolean</tt> on whether the argument is a <tt>boolean</tt> value or not,</li>
    
<li>a <tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li>a <tt>null</tt> if the argument is a <tt>null</tt> value.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{
  &quot;a&quot;: isboolean(true),
  &quot;b&quot;: isboolean(false),
  &quot;c&quot;: is_boolean(null),
  &quot;d&quot;: is_boolean(missing),
  &quot;e&quot;: isbool(&quot;d&quot;),
  &quot;f&quot;: isbool(4.0),
  &quot;g&quot;: isbool(5),
  &quot;h&quot;: isbool([&quot;1&quot;, 2]),
  &quot;i&quot;: isbool({&quot;a&quot;:1})
};
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;a&quot;: true, &quot;b&quot;: true, &quot;c&quot;: null, &quot;e&quot;: false, &quot;f&quot;: false, &quot;g&quot;: false, &quot;h&quot;: false, &quot;i&quot;: false }
</pre></div></div></li>
</ul>
<p>The function has two aliases, <tt>isboolean</tt> or <tt>isbool</tt>.</p></div>
<div class="section">
<h3><a name="is_number_isnumber_isnum"></a>is_number (isnumber, isnum)</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>is_number(expr)
</pre></div></div></li>
  
<li>
<p>Checks whether the given expression is evaluated to be a numeric value.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>expr</tt> : an expression (any type is allowed).</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>boolean</tt> on whether the argument is a <tt>smallint</tt>/<tt>tinyint</tt>/<tt>integer</tt>/<tt>bigint</tt>/<tt>float</tt>/<tt>double</tt>  value or not,</li>
    
<li>a <tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li>a <tt>null</tt> if the argument is a <tt>null</tt> value.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{
  &quot;a&quot;: is_number(true),
  &quot;b&quot;: is_number(false),
  &quot;c&quot;: isnumber(null),
  &quot;d&quot;: isnumber(missing),
  &quot;e&quot;: isnumber(&quot;d&quot;),
  &quot;f&quot;: isnum(4.0),
  &quot;g&quot;: isnum(5),
  &quot;h&quot;: isnum([&quot;1&quot;, 2]),
  &quot;i&quot;: isnum({&quot;a&quot;:1})
};
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;a&quot;: false, &quot;b&quot;: false, &quot;c&quot;: null, &quot;e&quot;: false, &quot;f&quot;: true, &quot;g&quot;: true, &quot;h&quot;: false, &quot;i&quot;: false }
</pre></div></div></li>
</ul>
<p>The function has two aliases, <tt>isnumber</tt> or <tt>isnum</tt>.</p></div>
<div class="section">
<h3><a name="is_object_isobject_isobj"></a>is_object (isobject, isobj)</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>is_object(expr)
</pre></div></div></li>
  
<li>
<p>Checks whether the given expression is evaluated to be a <tt>object</tt> value.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>expr</tt> : an expression (any type is allowed).</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>boolean</tt> on whether the argument is a <tt>object</tt> value or not,</li>
    
<li>a <tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li>a <tt>null</tt> if the argument is a <tt>null</tt> value.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{
  &quot;a&quot;: is_object(true),
  &quot;b&quot;: is_object(false),
  &quot;c&quot;: isobject(null),
  &quot;d&quot;: isobject(missing),
  &quot;e&quot;: isobj(&quot;d&quot;),
  &quot;f&quot;: isobj(4.0),
  &quot;g&quot;: isobj(5),
  &quot;h&quot;: isobj([&quot;1&quot;, 2]),
  &quot;i&quot;: isobj({&quot;a&quot;:1})
};
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
<p>{ &#x201c;a&#x201d;: false, &#x201c;b&#x201d;: false, &#x201c;c&#x201d;: null, &#x201c;e&#x201d;: false, &#x201c;f&#x201d;: false, &#x201c;g&#x201d;: false, &#x201c;h&#x201d;: false, &#x201c;i&#x201d;: true }</p></li>
</ul>
<p>The function has two aliases, <tt>isobject</tt> or <tt>isobj</tt>.</p></div>
<div class="section">
<h3><a name="is_string_isstring_isstr"></a>is_string (isstring, isstr)</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>is_string(expr)
</pre></div></div></li>
  
<li>
<p>Checks whether the given expression is evaluated to be a <tt>string</tt> value.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>expr</tt> : an expression (any type is allowed).</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>boolean</tt> on whether the argument is a <tt>string</tt> value or not,</li>
    
<li>a <tt>missing</tt> if the argument is a <tt>missing</tt> value,</li>
    
<li>a <tt>null</tt> if the argument is a <tt>null</tt> value.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{
  &quot;a&quot;: is_string(true),
  &quot;b&quot;: isstring(false),
  &quot;c&quot;: isstring(null),
  &quot;d&quot;: isstr(missing),
  &quot;e&quot;: isstr(&quot;d&quot;),
  &quot;f&quot;: isstr(4.0),
  &quot;g&quot;: isstr(5),
  &quot;h&quot;: isstr([&quot;1&quot;, 2]),
  &quot;i&quot;: isstr({&quot;a&quot;:1})
};
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;a&quot;: false, &quot;b&quot;: false, &quot;c&quot;: null, &quot;e&quot;: true, &quot;f&quot;: false, &quot;g&quot;: false, &quot;h&quot;: false, &quot;i&quot;: false }
</pre></div></div></li>
</ul>
<p>The function has two aliases, <tt>isstring</tt> or <tt>isstr</tt>.</p></div>
<div class="section">
<h3><a name="is_null"></a>is_null</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>is_null(expr)
</pre></div></div></li>
  
<li>
<p>Checks whether the given expression is evaluated to be a <tt>null</tt> value.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>expr</tt> : an expression (any type is allowed).</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>boolean</tt> on whether the variable is a <tt>null</tt> or not,</li>
    
<li>a <tt>missing</tt> if the input is <tt>missing</tt>.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: is_null(null), &quot;v2&quot;: is_null(1), &quot;v3&quot;: is_null(missing) };
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: true, &quot;v2&quot;: false }
</pre></div></div></li>
</ul>
<p>The function has an alias <tt>isnull</tt>.</p></div>
<div class="section">
<h3><a name="is_missing"></a>is_missing</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>is_missing(expr)
</pre></div></div></li>
  
<li>
<p>Checks whether the given expression is evaluated to be a <tt>missing</tt> value.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>expr</tt> : an expression (any type is allowed).</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>boolean</tt> on whether the variable is a <tt>missing</tt> or not.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: is_missing(null), &quot;v2&quot;: is_missing(1), &quot;v3&quot;: is_missing(missing) };
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: false, &quot;v2&quot;: false, &quot;v3&quot;: true }
</pre></div></div></li>
</ul>
<p>The function has an alias <tt>ismissing</tt>.</p></div>
<div class="section">
<h3><a name="is_unknown"></a>is_unknown</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>is_unknown(expr)
</pre></div></div></li>
  
<li>
<p>Checks whether the given variable is a <tt>null</tt> value or a <tt>missing</tt> value.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>expr</tt> : an expression (any type is allowed).</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>boolean</tt> on whether the variable is a <tt>null</tt>/`<tt>missing</tt> value (<tt>true</tt>) or not (<tt>false</tt>).</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: is_unknown(null), &quot;v2&quot;: is_unknown(1), &quot;v3&quot;: is_unknown(missing) };
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: true, &quot;v2&quot;: false, &quot;v3&quot;: true }
</pre></div></div></li>
</ul>
<p>The function has an alias <tt>isunknown</tt>.</p></div>
<div class="section">
<h3><a name="to_boolean"></a>to_boolean</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>to_boolean(expr)
</pre></div></div></li>
  
<li>
<p>Converts input value to a <tt>boolean</tt> value</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>expr</tt> : an expression</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>if the argument is <tt>missing</tt> then <tt>missing</tt> is returned</li>
    
<li>if the argument is <tt>null</tt> then <tt>null</tt> is returned</li>
    
<li>if the argument is of <tt>boolean</tt> type then it is returned as is</li>
    
<li>if the argument is of numeric type then <tt>false</tt> is returned if it is <tt>0</tt> or <tt>NaN</tt>, otherwise <tt>true</tt></li>
    
<li>if the argument is of <tt>string</tt> type then <tt>false</tt> is returned if it&#x2019;s empty, otherwise <tt>true</tt></li>
    
<li>if the argument is of <tt>array</tt> or <tt>multiset</tt> type then <tt>false</tt> is returned if it&#x2019;s size is <tt>0</tt>, otherwise <tt>true</tt></li>
    
<li>if the argument is of <tt>object</tt> type then <tt>false</tt> is returned if it has no fields, otherwise <tt>true</tt></li>
    
<li>type error is raised for all other input types</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{
  &quot;v1&quot;: to_boolean(0),
  &quot;v2&quot;: to_boolean(1),
  &quot;v3&quot;: to_boolean(&quot;&quot;),
  &quot;v4&quot;: to_boolean(&quot;asterix&quot;)
};
</pre></div></div></li>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: false, &quot;v2&quot;: true, &quot;v3&quot;: false, &quot;v4&quot;: true }
</pre></div></div></li>
</ul>
<p>The function has an alias <tt>toboolean</tt>.</p></div>
<div class="section">
<h3><a name="to_bigint"></a>to_bigint</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>to_bigint(expr)
</pre></div></div></li>
  
<li>
<p>Converts input value to an integer value</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>expr</tt> : an expression</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>if the argument is <tt>missing</tt> then <tt>missing</tt> is returned</li>
    
<li>if the argument is <tt>null</tt> then <tt>null</tt> is returned</li>
    
<li>if the argument is of <tt>boolean</tt> type then <tt>1</tt> is returned if it is <tt>true</tt>, <tt>0</tt> if it is <tt>false</tt></li>
    
<li>if the argument is of numeric integer type then it is returned as the same value of <tt>bigint</tt> type</li>
    
<li>if the argument is of numeric <tt>float</tt>/<tt>double</tt> type then it is converted to <tt>bigint</tt> type</li>
    
<li>if the argument is of <tt>string</tt> type and can be parsed as integer then that integer value is returned,  otherwise <tt>null</tt> is returned</li>
    
<li>if the argument is of <tt>array</tt>/<tt>multiset</tt>/<tt>object</tt> type then <tt>null</tt> is returned</li>
    
<li>type error is raised for all other input types</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{
  &quot;v1&quot;: to_bigint(false),
  &quot;v2&quot;: to_bigint(true),
  &quot;v3&quot;: to_bigint(10),
  &quot;v4&quot;: to_bigint(float(&quot;1e100&quot;)),
  &quot;v5&quot;: to_bigint(double(&quot;1e1000&quot;)),
  &quot;v6&quot;: to_bigint(&quot;20&quot;)
};
</pre></div></div></li>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: 0, &quot;v2&quot;: 1, &quot;v3&quot;: 10, &quot;v4&quot;: 9223372036854775807, &quot;v5&quot;: 9223372036854775807, &quot;v6&quot;: 20 }
</pre></div></div></li>
</ul>
<p>The function has an alias <tt>tobigint</tt>.</p></div>
<div class="section">
<h3><a name="to_double"></a>to_double</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>to_double(expr)
</pre></div></div></li>
  
<li>
<p>Converts input value to a <tt>double</tt> value</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>expr</tt> : an expression</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>if the argument is <tt>missing</tt> then <tt>missing</tt> is returned</li>
    
<li>if the argument is <tt>null</tt> then <tt>null</tt> is returned</li>
    
<li>if the argument is of <tt>boolean</tt> type then <tt>1.0</tt> is returned if it is <tt>true</tt>, <tt>0.0</tt> if it is <tt>false</tt></li>
    
<li>if the argument is of numeric type then it is returned as the value of <tt>double</tt> type</li>
    
<li>if the argument is of <tt>string</tt> type and can be parsed as <tt>double</tt> then that <tt>double</tt> value is returned,  otherwise <tt>null</tt> is returned</li>
    
<li>if the argument is of <tt>array</tt>/<tt>multiset</tt>/<tt>object</tt> type then <tt>null</tt> is returned</li>
    
<li>type error is raised for all other input types</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{
  &quot;v1&quot;: to_double(false),
  &quot;v2&quot;: to_double(true),
  &quot;v3&quot;: to_double(10),
  &quot;v4&quot;: to_double(11.5),
  &quot;v5&quot;: to_double(&quot;12.5&quot;)
};
</pre></div></div></li>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: 0.0, &quot;v2&quot;: 1.0, &quot;v3&quot;: 10.0, &quot;v4&quot;: 11.5, &quot;v5&quot;: 12.5 }
</pre></div></div></li>
</ul>
<p>The function has an alias <tt>todouble</tt>.</p></div>
<div class="section">
<h3><a name="to_string"></a>to_string</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>to_string(expr)
</pre></div></div></li>
  
<li>
<p>Converts input value to a string value</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>expr</tt> : an expression</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>if the argument is <tt>missing</tt> then <tt>missing</tt> is returned</li>
    
<li>if the argument is <tt>null</tt> then <tt>null</tt> is returned</li>
    
<li>if the argument is of <tt>boolean</tt> type then <tt>&quot;true&quot;</tt> is returned if it is <tt>true</tt>, <tt>&quot;false&quot;</tt> if it is <tt>false</tt></li>
    
<li>if the argument is of numeric type then its string representation is returned</li>
    
<li>if the argument is of <tt>string</tt> type then it is returned as is</li>
    
<li>if the argument is of <tt>array</tt>/<tt>multiset</tt>/<tt>object</tt> type then <tt>null</tt> is returned</li>
    
<li>type error is raised for all other input types</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{
  &quot;v1&quot;: to_string(false),
  &quot;v2&quot;: to_string(true),
  &quot;v3&quot;: to_string(10),
  &quot;v4&quot;: to_string(11.5),
  &quot;v5&quot;: to_string(&quot;asterix&quot;)
};
</pre></div></div></li>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: &quot;false&quot;, &quot;v2&quot;: &quot;true&quot;, &quot;v3&quot;: &quot;10&quot;, &quot;v4&quot;: &quot;11.5&quot;, &quot;v5&quot;: &quot;asterix&quot; }
</pre></div></div></li>
</ul>
<p>The function has an alias <tt>tostring</tt>. <!-- ! 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.
 ! --></p></div></div>
<div class="section">
<h2><a name="Conditional_Functions"></a><a name="ConditionalFunctions" id="ConditionalFunctions">Conditional Functions</a></h2>
<div class="section">
<h3><a name="if_null_ifnull"></a>if_null (ifnull)</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>if_null(expression1, expression2, ... expressionN)
</pre></div></div></li>
  
<li>
<p>Finds first argument which value is not <tt>null</tt> and returns that value</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>expressionI</tt> : an expression (any type is allowed).</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>null</tt> if all arguments evaluate to <tt>null</tt> or no arguments specified</li>
    
<li>a value of the first non-<tt>null</tt> argument otherwise</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{
    &quot;a&quot;: if_null(),
    &quot;b&quot;: if_null(null),
    &quot;c&quot;: if_null(null, &quot;asterixdb&quot;),
    &quot;d&quot;: is_missing(if_null(missing))
};
</pre></div></div></li>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;a&quot;: null, &quot;b&quot;: null, &quot;c&quot;: &quot;asterixdb&quot;, &quot;d&quot;: true }
</pre></div></div></li>
</ul>
<p>The function has an alias <tt>ifnull</tt>.</p></div>
<div class="section">
<h3><a name="if_missing_ifmissing"></a>if_missing (ifmissing)</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>if_missing(expression1, expression2, ... expressionN)
</pre></div></div></li>
  
<li>
<p>Finds first argument which value is not <tt>missing</tt> and returns that value</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>expressionI</tt> : an expression (any type is allowed).</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>null</tt> if all arguments evaluate to <tt>missing</tt> or no arguments specified</li>
    
<li>a value of the first non-<tt>missing</tt> argument otherwise</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{
    &quot;a&quot;: if_missing(),
    &quot;b&quot;: if_missing(missing),
    &quot;c&quot;: if_missing(missing, &quot;asterixdb&quot;),
    &quot;d&quot;: if_missing(null, &quot;asterixdb&quot;)
};
</pre></div></div></li>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;a&quot;: null, &quot;b&quot;: null, &quot;c&quot;: &quot;asterixdb&quot;, &quot;d&quot;: null }
</pre></div></div></li>
</ul>
<p>The function has an alias <tt>ifmissing</tt>.</p></div>
<div class="section">
<h3><a name="if_missing_or_null_ifmissingornull"></a>if_missing_or_null (ifmissingornull)</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>if_missing_or_null(expression1, expression2, ... expressionN)
</pre></div></div></li>
  
<li>
<p>Finds first argument which value is not <tt>null</tt> or <tt>missing</tt> and returns that value</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>expressionI</tt> : an expression (any type is allowed).</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>null</tt> if all arguments evaluate to either <tt>null</tt> or <tt>missing</tt>, or no arguments specified</li>
    
<li>a value of the first non-<tt>null</tt>, non-<tt>missing</tt> argument otherwise</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{
    &quot;a&quot;: if_missing_or_null(),
    &quot;b&quot;: if_missing_or_null(null, missing),
    &quot;c&quot;: if_missing_or_null(null, missing, &quot;asterixdb&quot;)
};
</pre></div></div></li>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;a&quot;: null, &quot;b&quot;: null, &quot;c&quot;: &quot;asterixdb&quot; }
</pre></div></div></li>
</ul>
<p>The function has an alias <tt>ifmissingornull</tt>. <!-- ! 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.
 ! --></p></div></div>
<div class="section">
<h2><a name="Miscellaneous_Functions"></a><a name="MiscFunctions" id="MiscFunctions">Miscellaneous Functions</a></h2>
<div class="section">
<h3><a name="uuid"></a>uuid</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>uuid()
</pre></div></div></li>
  
<li>
<p>Generates a <tt>uuid</tt>.</p></li>
  
<li>Arguments:
  
<ul>
    
<li>none</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a generated, random <tt>uuid</tt>.</li>
  </ul></li>
</ul></div>
<div class="section">
<h3><a name="len"></a>len</h3>

<ul>
  
<li>
<p>Syntax:</p>
<p>len(array)</p></li>
  
<li>
<p>Returns the length of the array array.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>array</tt> : an <tt>array</tt>, <tt>multiset</tt>, <tt>null</tt>, or <tt>missing</tt>, represents the collection that needs to be checked.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>an <tt>integer</tt> that represents the length of input array or the size of the input multiset,</li>
    
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>len([&quot;Hello&quot;, &quot;World&quot;])
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>2
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="not"></a>not</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>not(expr)
</pre></div></div></li>
  
<li>
<p>Inverts a <tt>boolean</tt> value</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>expr</tt> : an expression</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li>a <tt>boolean</tt>, the inverse of <tt>expr</tt>,</li>
    
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value,</li>
    
<li>other non-boolean argument value will cause a type error.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: `not`(true), &quot;v2&quot;: `not`(false), &quot;v3&quot;: `not`(null), &quot;v4&quot;: `not`(missing) };
</pre></div></div></li>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>{ &quot;v1&quot;: false, &quot;v2&quot;: true, &quot;v3&quot;: null }
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="range"></a>range</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>range(start_numeric_value, end_numeric_value)
</pre></div></div></li>
  
<li>
<p>Generates a series of <tt>bigint</tt> values based start the <tt>start_numeric_value</tt> until the <tt>end_numeric_value</tt>.</p></li>
  
<li>Arguments:</li>
  
<li><tt>start_numeric_value</tt>: a <tt>tinyint</tt>/<tt>smallint</tt>/<tt>integer</tt>/<tt>bigint</tt> value representing the start value.</li>
  
<li><tt>end_numeric_value</tt>: a <tt>tinyint</tt>/<tt>smallint</tt>/<tt>integer</tt>/<tt>bigint</tt> value representing the max final value.</li>
  
<li>Return Value:
  
<ul>
    
<li>an array that starts with the integer value of <tt>start_numeric_value</tt> and ends with  the integer value of <tt>end_numeric_value</tt>, where the value of each entry in the array is  the integer successor of the value in the preceding entry.</li>
  </ul></li>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>range(0, 3);
</pre></div></div></li>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>[ 0, 1, 2, 3 ]
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="switch_case"></a>switch_case</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>switch_case(
    condition,
    case1, case1_result,
    case2, case2_result,
    ...,
    default, default_result
)
</pre></div></div></li>
  
<li>
<p>Switches amongst a sequence of cases and returns the result of the first matching case. If no match is found, the result of the default case is returned.</p></li>
  
<li>Arguments:
  
<ul>
    
<li><tt>condition</tt>: a variable (any type is allowed).</li>
    
<li><tt>caseI/default</tt>: a variable (any type is allowed).</li>
    
<li><tt>caseI/default_result</tt>: a variable (any type is allowed).</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li><tt>caseI_result</tt> if <tt>condition</tt> matches <tt>caseI</tt>, otherwise <tt>default_result</tt>.</li>
  </ul></li>
  
<li>
<p>Example 1:</p>
  
<div class="source">
<div class="source">
<pre>switch_case(
    &quot;a&quot;,
    &quot;a&quot;, 0,
    &quot;x&quot;, 1,
    &quot;y&quot;, 2,
    &quot;z&quot;, 3
);
</pre></div></div></li>
</ul>

<ul>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>0
</pre></div></div></li>
  
<li>
<p>Example 2:</p>
  
<div class="source">
<div class="source">
<pre>switch_case(
    &quot;a&quot;,
    &quot;x&quot;, 1,
    &quot;y&quot;, 2,
    &quot;z&quot;, 3
);
</pre></div></div></li>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>3
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="deep_equal"></a>deep_equal</h3>

<ul>
  
<li>
<p>Syntax:</p>
  
<div class="source">
<div class="source">
<pre>deep_equal(expr1, expr2)
</pre></div></div></li>
</ul>

<ul>
  
<li>Assess the equality between two expressions of any type (e.g., object, arrays, or multiset).  Two objects are deeply equal iff both their types and values are equal.</li>
  
<li>Arguments:
  
<ul>
    
<li><tt>expr1</tt> : an expression,</li>
    
<li><tt>expr2</tt> : an expression.</li>
  </ul></li>
  
<li>Return Value:
  
<ul>
    
<li><tt>true</tt> or <tt>false</tt> depending on the data equality,</li>
    
<li><tt>missing</tt> if any argument is a <tt>missing</tt> value,</li>
    
<li><tt>null</tt> if any argument is a <tt>null</tt> value but no argument is a <tt>missing</tt> value.</li>
  </ul></li>
</ul>

<ul>
  
<li>
<p>Example:</p>
  
<div class="source">
<div class="source">
<pre>deep_equal(
           {
             &quot;id&quot;:1,
             &quot;project&quot;:&quot;AsterixDB&quot;,
             &quot;address&quot;:{&quot;city&quot;:&quot;Irvine&quot;, &quot;state&quot;:&quot;CA&quot;},
             &quot;related&quot;:[&quot;Hivestrix&quot;, &quot;Preglix&quot;, &quot;Apache VXQuery&quot;]
           },
           {
             &quot;id&quot;:1,
             &quot;project&quot;:&quot;AsterixDB&quot;,
             &quot;address&quot;:{&quot;city&quot;:&quot;San Diego&quot;, &quot;state&quot;:&quot;CA&quot;},
             &quot;related&quot;:[&quot;Hivestrix&quot;, &quot;Preglix&quot;, &quot;Apache VXQuery&quot;]
           }
);
</pre></div></div></li>
  
<li>
<p>The expected result is:</p>
  
<div class="source">
<div class="source">
<pre>false
</pre></div></div></li>
</ul></div></div>
                  </div>
            </div>
          </div>

    <hr/>

    <footer>
            <div class="container-fluid">
              <div class="row span12">Copyright &copy;                    2017
                        <a href="https://www.apache.org/">The Apache Software Foundation</a>.
            All Rights Reserved.      
                    
      </div>

                                                                  <?xml version="1.0" encoding="UTF-8"?>
<div class="row-fluid">Apache AsterixDB, AsterixDB, Apache, the Apache
        feather logo, and the Apache AsterixDB project logo are either
        registered trademarks or trademarks of The Apache Software
        Foundation in the United States and other countries.
        All other marks mentioned may be trademarks or registered
        trademarks of their respective owners.</div>
                  
        
                </div>
    </footer>
  </body>
</html>
