blob: c71bdfb870df4c5b5e7df3380068a83d8443e6fe [file] [log] [blame]
<!DOCTYPE HTML>
<!-- NewPage -->
<html lang="en">
<head>
<!-- Generated by javadoc -->
<title>org.apache.calcite.sql.validate.implicit (Apache Calcite API)</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
<link rel="stylesheet" type="text/css" href="../../../../../../jquery/jquery-ui.css" title="Style">
<script type="text/javascript" src="../../../../../../script.js"></script>
<script type="text/javascript" src="../../../../../../jquery/jszip/dist/jszip.min.js"></script>
<script type="text/javascript" src="../../../../../../jquery/jszip-utils/dist/jszip-utils.min.js"></script>
<!--[if IE]>
<script type="text/javascript" src="../../../../../../jquery/jszip-utils/dist/jszip-utils-ie.min.js"></script>
<![endif]-->
<script type="text/javascript" src="../../../../../../jquery/jquery-3.3.1.js"></script>
<script type="text/javascript" src="../../../../../../jquery/jquery-migrate-3.0.1.js"></script>
<script type="text/javascript" src="../../../../../../jquery/jquery-ui.js"></script>
</head>
<body>
<script type="text/javascript"><!--
try {
if (location.href.indexOf('is-external=true') == -1) {
parent.document.title="org.apache.calcite.sql.validate.implicit (Apache Calcite API)";
}
}
catch(err) {
}
//-->
var pathtoroot = "../../../../../../";
var useModuleDirectories = true;
loadScripts(document, 'script');</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
<header role="banner">
<nav role="navigation">
<div class="fixedNav">
<!-- ========= START OF TOP NAVBAR ======= -->
<div class="topNav"><a id="navbar.top">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
<a id="navbar.top.firstrow">
<!-- -->
</a>
<ul class="navList" title="Navigation">
<li><a href="../../../../../../index.html">Overview</a></li>
<li class="navBarCell1Rev">Package</li>
<li>Class</li>
<li><a href="package-use.html">Use</a></li>
<li><a href="package-tree.html">Tree</a></li>
<li><a href="../../../../../../deprecated-list.html">Deprecated</a></li>
<li><a href="../../../../../../index-all.html">Index</a></li>
<li><a href="../../../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList" id="allclasses_navbar_top">
<li><a href="../../../../../../allclasses.html">All&nbsp;Classes</a></li>
</ul>
<ul class="navListSearch">
<li><label for="search">SEARCH:</label>
<input type="text" id="search" value="search" disabled="disabled">
<input type="reset" id="reset" value="reset" disabled="disabled">
</li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_top");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
</div>
<a id="skip.navbar.top">
<!-- -->
</a></div>
<!-- ========= END OF TOP NAVBAR ========= -->
</div>
<div class="navPadding">&nbsp;</div>
<script type="text/javascript"><!--
$('.navPadding').css('padding-top', $('.fixedNav').css("height"));
//-->
</script>
</nav>
</header>
<main role="main">
<div class="header">
<h1 title="Package" class="title">Package&nbsp;org.apache.calcite.sql.validate.implicit</h1>
</div>
<div class="contentContainer">
<section role="region"><a id="package.description">
<!-- -->
</a>
<div class="block">Sql implicit type cast.
<h2>Work Flow</h2>
This package contains rules for implicit type coercion, it works during the process of sql
validation. The transformation entrance are all kinds of checkers. i.e.
<a href="../../type/AssignableOperandTypeChecker.html" title="class in org.apache.calcite.sql.type"><code>AssignableOperandTypeChecker</code></a>,
<a href="../../type/ComparableOperandTypeChecker.html" title="class in org.apache.calcite.sql.type"><code>ComparableOperandTypeChecker</code></a>
<a href="../../type/CompositeOperandTypeChecker.html" title="class in org.apache.calcite.sql.type"><code>CompositeOperandTypeChecker</code></a>,
<a href="../../type/FamilyOperandTypeChecker.html" title="class in org.apache.calcite.sql.type"><code>FamilyOperandTypeChecker</code></a>,
<a href="../../type/SameOperandTypeChecker.html" title="class in org.apache.calcite.sql.type"><code>SameOperandTypeChecker</code></a>,
<a href="../../type/SetopOperandTypeChecker.html" title="class in org.apache.calcite.sql.type"><code>SetopOperandTypeChecker</code></a>.
<ul>
<li>
When user do validation for a <a href="../../SqlNode.html" title="class in org.apache.calcite.sql"><code>SqlNode</code></a>,
and the type coercion is turned on(default), the validator will check the
operands/return types of all kinds of operators, if the validation passes through,
the validator will just cache the data type (say RelDataType) for the
<a href="../../SqlNode.html" title="class in org.apache.calcite.sql"><code>SqlNode</code></a> it has validated;</li>
<li>If the validation fails, the validator will ask the
<a href="TypeCoercion.html" title="interface in org.apache.calcite.sql.validate.implicit"><code>TypeCoercion</code></a> about
if there can make implicit type coercion, if the coercion rules passed, the
<a href="TypeCoercion.html" title="interface in org.apache.calcite.sql.validate.implicit"><code>TypeCoercion</code></a> component
will replace the <a href="../../SqlNode.html" title="class in org.apache.calcite.sql"><code>SqlNode</code></a> with a casted one,
(the node may be an operand of an operator or a column field of a selected row).</li>
<li><a href="TypeCoercion.html" title="interface in org.apache.calcite.sql.validate.implicit"><code>TypeCoercion</code></a>
will then update the inferred type for the casted node and
the containing operator/row column type.</li>
<li>If the coercion rule fails again, the validator will just throw
the exception as is before.</li>
</ul>
<p> For some cases, although the validation passes, we still need the type coercion, e.g. for
expression 1 &gt; '1', Calcite will just return false without type coercion, we do type coercion
eagerly here: the result expression would be transformed to "1 &gt; cast('1' as int)" and
the result would be true.
<h2>Conversion Expressions</h2>
The supported conversion contexts are:
<a href="https://docs.google.com/document/d/1g2RUnLXyp_LjUlO-wbblKuP5hqEu3a_2Mt2k4dh6RwU/edit?usp=sharing">Conversion Expressions</a>
<p>Strategies for finding common type:</p>
<ul>
<li>If the operator has expected data types, just take them as the desired one. i.e. the UDF.
</li>
<li>If there is no expected data type but data type families are registered, try to coerce
operand to the family's default data type, i.e. the String family will have a VARCHAR type.
</li>
<li>If neither expected data type nor families are specified, try to find the tightest common
type of the node types, i.e. int and double will return double, the numeric precision does not
lose for this case.</li>
<li>If no tightest common type found, try to find a wider type, i.e. string and int
will return int, we allow some precision loss when widening decimal to fractional,
or promote to string type.</li>
</ul>
<h2>Types Conversion Matrix</h2>
See <a href="https://docs.google.com/spreadsheets/d/1GhleX5h5W8-kJKh7NMJ4vtoE78pwfaZRJl88ULX_MgU/edit?usp=sharing">CalciteImplicitCasts</a></div>
</section>
<ul class="blockList">
<li class="blockList">
<table class="typeSummary">
<caption><span>Interface Summary</span><span class="tabEnd">&nbsp;</span></caption>
<tr>
<th class="colFirst" scope="col">Interface</th>
<th class="colLast" scope="col">Description</th>
</tr>
<tbody>
<tr class="altColor">
<th class="colFirst" scope="row"><a href="TypeCoercion.html" title="interface in org.apache.calcite.sql.validate.implicit">TypeCoercion</a></th>
<td class="colLast">
<div class="block">Default Strategies to coerce differing types that participate in
operations into compatible ones.</div>
</td>
</tr>
</tbody>
</table>
</li>
<li class="blockList">
<table class="typeSummary">
<caption><span>Class Summary</span><span class="tabEnd">&nbsp;</span></caption>
<tr>
<th class="colFirst" scope="col">Class</th>
<th class="colLast" scope="col">Description</th>
</tr>
<tbody>
<tr class="altColor">
<th class="colFirst" scope="row"><a href="AbstractTypeCoercion.html" title="class in org.apache.calcite.sql.validate.implicit">AbstractTypeCoercion</a></th>
<td class="colLast">
<div class="block">Base class for all the type coercion rules.</div>
</td>
</tr>
<tr class="rowColor">
<th class="colFirst" scope="row"><a href="TypeCoercionImpl.html" title="class in org.apache.calcite.sql.validate.implicit">TypeCoercionImpl</a></th>
<td class="colLast">
<div class="block">Default implementation of Calcite implicit type cast.</div>
</td>
</tr>
<tr class="altColor">
<th class="colFirst" scope="row"><a href="TypeCoercions.html" title="class in org.apache.calcite.sql.validate.implicit">TypeCoercions</a></th>
<td class="colLast">
<div class="block">Factory class for type coercion instantiation of different sql dialects.</div>
</td>
</tr>
</tbody>
</table>
</li>
</ul>
</div>
</main>
<footer role="contentinfo">
<nav role="navigation">
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<div class="bottomNav"><a id="navbar.bottom">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
<a id="navbar.bottom.firstrow">
<!-- -->
</a>
<ul class="navList" title="Navigation">
<li><a href="../../../../../../index.html">Overview</a></li>
<li class="navBarCell1Rev">Package</li>
<li>Class</li>
<li><a href="package-use.html">Use</a></li>
<li><a href="package-tree.html">Tree</a></li>
<li><a href="../../../../../../deprecated-list.html">Deprecated</a></li>
<li><a href="../../../../../../index-all.html">Index</a></li>
<li><a href="../../../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList" id="allclasses_navbar_bottom">
<li><a href="../../../../../../allclasses.html">All&nbsp;Classes</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_bottom");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
</div>
<a id="skip.navbar.bottom">
<!-- -->
</a></div>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
</nav>
<p class="legalCopy"><small>Copyright &#169; 2012&#x2013;2019 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All rights reserved.</small></p>
</footer>
</body>
</html>