|  | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> | 
|  | <html xmlns="http://www.w3.org/1999/xhtml"> | 
|  | <head> | 
|  | <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> | 
|  | <meta http-equiv="X-UA-Compatible" content="IE=9"/> | 
|  | <meta name="generator" content="Doxygen 1.8.6"/> | 
|  | <title>Impala: be/src/exec/delimited-text-parser.cc Source File</title> | 
|  | <link href="tabs.css" rel="stylesheet" type="text/css"/> | 
|  | <script type="text/javascript" src="jquery.js"></script> | 
|  | <script type="text/javascript" src="dynsections.js"></script> | 
|  | <link href="navtree.css" rel="stylesheet" type="text/css"/> | 
|  | <script type="text/javascript" src="resize.js"></script> | 
|  | <script type="text/javascript" src="navtree.js"></script> | 
|  | <script type="text/javascript"> | 
|  | $(document).ready(initResizable); | 
|  | $(window).load(resizeHeight); | 
|  | </script> | 
|  | <link href="search/search.css" rel="stylesheet" type="text/css"/> | 
|  | <script type="text/javascript" src="search/search.js"></script> | 
|  | <script type="text/javascript"> | 
|  | $(document).ready(function() { searchBox.OnSelectItem(0); }); | 
|  | </script> | 
|  | <link href="doxygen.css" rel="stylesheet" type="text/css" /> | 
|  | </head> | 
|  | <body> | 
|  | <div id="top"><!-- do not remove this div, it is closed by doxygen! --> | 
|  | <div id="titlearea"> | 
|  | <table cellspacing="0" cellpadding="0"> | 
|  | <tbody> | 
|  | <tr style="height: 56px;"> | 
|  | <td style="padding-left: 0.5em;"> | 
|  | <div id="projectname">Impala | 
|  | </div> | 
|  | <div id="projectbrief">Impalaistheopensource,nativeanalyticdatabaseforApacheHadoop.</div> | 
|  | </td> | 
|  | </tr> | 
|  | </tbody> | 
|  | </table> | 
|  | </div> | 
|  | <!-- end header part --> | 
|  | <!-- Generated by Doxygen 1.8.6 --> | 
|  | <script type="text/javascript"> | 
|  | var searchBox = new SearchBox("searchBox", "search",false,'Search'); | 
|  | </script> | 
|  | <div id="navrow1" class="tabs"> | 
|  | <ul class="tablist"> | 
|  | <li><a href="index.html"><span>Main Page</span></a></li> | 
|  | <li><a href="namespaces.html"><span>Namespaces</span></a></li> | 
|  | <li><a href="annotated.html"><span>Classes</span></a></li> | 
|  | <li class="current"><a href="files.html"><span>Files</span></a></li> | 
|  | <li> | 
|  | <div id="MSearchBox" class="MSearchBoxInactive"> | 
|  | <span class="left"> | 
|  | <img id="MSearchSelect" src="search/mag_sel.png" | 
|  | onmouseover="return searchBox.OnSearchSelectShow()" | 
|  | onmouseout="return searchBox.OnSearchSelectHide()" | 
|  | alt=""/> | 
|  | <input type="text" id="MSearchField" value="Search" accesskey="S" | 
|  | onfocus="searchBox.OnSearchFieldFocus(true)" | 
|  | onblur="searchBox.OnSearchFieldFocus(false)" | 
|  | onkeyup="searchBox.OnSearchFieldChange(event)"/> | 
|  | </span><span class="right"> | 
|  | <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a> | 
|  | </span> | 
|  | </div> | 
|  | </li> | 
|  | </ul> | 
|  | </div> | 
|  | <div id="navrow2" class="tabs2"> | 
|  | <ul class="tablist"> | 
|  | <li><a href="files.html"><span>File List</span></a></li> | 
|  | <li><a href="globals.html"><span>File Members</span></a></li> | 
|  | </ul> | 
|  | </div> | 
|  | </div><!-- top --> | 
|  | <div id="side-nav" class="ui-resizable side-nav-resizable"> | 
|  | <div id="nav-tree"> | 
|  | <div id="nav-tree-contents"> | 
|  | <div id="nav-sync" class="sync"></div> | 
|  | </div> | 
|  | </div> | 
|  | <div id="splitbar" style="-moz-user-select:none;" | 
|  | class="ui-resizable-handle"> | 
|  | </div> | 
|  | </div> | 
|  | <script type="text/javascript"> | 
|  | $(document).ready(function(){initNavTree('delimited-text-parser_8cc_source.html','');}); | 
|  | </script> | 
|  | <div id="doc-content"> | 
|  | <!-- window showing the filter options --> | 
|  | <div id="MSearchSelectWindow" | 
|  | onmouseover="return searchBox.OnSearchSelectShow()" | 
|  | onmouseout="return searchBox.OnSearchSelectHide()" | 
|  | onkeydown="return searchBox.OnSearchSelectKey(event)"> | 
|  | <a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark"> </span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark"> </span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark"> </span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark"> </span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark"> </span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(8)"><span class="SelectionMark"> </span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(9)"><span class="SelectionMark"> </span>Friends</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(10)"><span class="SelectionMark"> </span>Macros</a></div> | 
|  |  | 
|  | <!-- iframe showing the search results (closed by default) --> | 
|  | <div id="MSearchResultsWindow"> | 
|  | <iframe src="javascript:void(0)" frameborder="0" | 
|  | name="MSearchResults" id="MSearchResults"> | 
|  | </iframe> | 
|  | </div> | 
|  |  | 
|  | <div class="header"> | 
|  | <div class="headertitle"> | 
|  | <div class="title">delimited-text-parser.cc</div>  </div> | 
|  | </div><!--header--> | 
|  | <div class="contents"> | 
|  | <a href="delimited-text-parser_8cc.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span> <span class="comment">// Copyright 2012 Cloudera Inc.</span></div> | 
|  | <div class="line"><a name="l00002"></a><span class="lineno">    2</span> <span class="comment">//</span></div> | 
|  | <div class="line"><a name="l00003"></a><span class="lineno">    3</span> <span class="comment">// Licensed under the Apache License, Version 2.0 (the "License");</span></div> | 
|  | <div class="line"><a name="l00004"></a><span class="lineno">    4</span> <span class="comment">// you may not use this file except in compliance with the License.</span></div> | 
|  | <div class="line"><a name="l00005"></a><span class="lineno">    5</span> <span class="comment">// You may obtain a copy of the License at</span></div> | 
|  | <div class="line"><a name="l00006"></a><span class="lineno">    6</span> <span class="comment">//</span></div> | 
|  | <div class="line"><a name="l00007"></a><span class="lineno">    7</span> <span class="comment">// http://www.apache.org/licenses/LICENSE-2.0</span></div> | 
|  | <div class="line"><a name="l00008"></a><span class="lineno">    8</span> <span class="comment">//</span></div> | 
|  | <div class="line"><a name="l00009"></a><span class="lineno">    9</span> <span class="comment">// Unless required by applicable law or agreed to in writing, software</span></div> | 
|  | <div class="line"><a name="l00010"></a><span class="lineno">   10</span> <span class="comment">// distributed under the License is distributed on an "AS IS" BASIS,</span></div> | 
|  | <div class="line"><a name="l00011"></a><span class="lineno">   11</span> <span class="comment">// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span></div> | 
|  | <div class="line"><a name="l00012"></a><span class="lineno">   12</span> <span class="comment">// See the License for the specific language governing permissions and</span></div> | 
|  | <div class="line"><a name="l00013"></a><span class="lineno">   13</span> <span class="comment">// limitations under the License.</span></div> | 
|  | <div class="line"><a name="l00014"></a><span class="lineno">   14</span> </div> | 
|  | <div class="line"><a name="l00015"></a><span class="lineno">   15</span> <span class="preprocessor">#include "<a class="code" href="delimited-text-parser_8inline_8h.html">exec/delimited-text-parser.inline.h</a>"</span></div> | 
|  | <div class="line"><a name="l00016"></a><span class="lineno">   16</span> </div> | 
|  | <div class="line"><a name="l00017"></a><span class="lineno">   17</span> <span class="preprocessor">#include "<a class="code" href="hdfs-scanner_8h.html">exec/hdfs-scanner.h</a>"</span></div> | 
|  | <div class="line"><a name="l00018"></a><span class="lineno">   18</span> <span class="preprocessor">#include "<a class="code" href="cpu-info_8h.html">util/cpu-info.h</a>"</span></div> | 
|  | <div class="line"><a name="l00019"></a><span class="lineno">   19</span> </div> | 
|  | <div class="line"><a name="l00020"></a><span class="lineno">   20</span> <span class="preprocessor">#include "<a class="code" href="names_8h.html">common/names.h</a>"</span></div> | 
|  | <div class="line"><a name="l00021"></a><span class="lineno">   21</span> </div> | 
|  | <div class="line"><a name="l00022"></a><span class="lineno">   22</span> <span class="keyword">using namespace </span>impala;</div> | 
|  | <div class="line"><a name="l00023"></a><span class="lineno">   23</span> </div> | 
|  | <div class="line"><a name="l00024"></a><span class="lineno"><a class="line" href="classimpala_1_1DelimitedTextParser.html#a0dc08dae91fdf873d66e546019e07395">   24</a></span> <a class="code" href="classimpala_1_1DelimitedTextParser.html#a0dc08dae91fdf873d66e546019e07395">DelimitedTextParser::DelimitedTextParser</a>(</div> | 
|  | <div class="line"><a name="l00025"></a><span class="lineno">   25</span>     <span class="keywordtype">int</span> num_cols, <span class="keywordtype">int</span> num_partition_keys, <span class="keyword">const</span> <span class="keywordtype">bool</span>* is_materialized_col,</div> | 
|  | <div class="line"><a name="l00026"></a><span class="lineno">   26</span>     <span class="keywordtype">char</span> tuple_delim, <span class="keywordtype">char</span> field_delim, <span class="keywordtype">char</span> collection_item_delim, <span class="keywordtype">char</span> escape_char)</div> | 
|  | <div class="line"><a name="l00027"></a><span class="lineno">   27</span>     : num_delims_(0),</div> | 
|  | <div class="line"><a name="l00028"></a><span class="lineno">   28</span>       field_delim_(field_delim),</div> | 
|  | <div class="line"><a name="l00029"></a><span class="lineno">   29</span>       process_escapes_(escape_char != <span class="stringliteral">'\0'</span>),</div> | 
|  | <div class="line"><a name="l00030"></a><span class="lineno">   30</span>       escape_char_(escape_char),</div> | 
|  | <div class="line"><a name="l00031"></a><span class="lineno">   31</span>       collection_item_delim_(collection_item_delim),</div> | 
|  | <div class="line"><a name="l00032"></a><span class="lineno">   32</span>       tuple_delim_(tuple_delim),</div> | 
|  | <div class="line"><a name="l00033"></a><span class="lineno">   33</span>       current_column_has_escape_(false),</div> | 
|  | <div class="line"><a name="l00034"></a><span class="lineno">   34</span>       last_char_is_escape_(false),</div> | 
|  | <div class="line"><a name="l00035"></a><span class="lineno">   35</span>       last_row_delim_offset_(-1),</div> | 
|  | <div class="line"><a name="l00036"></a><span class="lineno">   36</span>       num_cols_(num_cols),</div> | 
|  | <div class="line"><a name="l00037"></a><span class="lineno">   37</span>       num_partition_keys_(num_partition_keys),</div> | 
|  | <div class="line"><a name="l00038"></a><span class="lineno">   38</span>       is_materialized_col_(is_materialized_col),</div> | 
|  | <div class="line"><a name="l00039"></a><span class="lineno">   39</span>       column_idx_(0),</div> | 
|  | <div class="line"><a name="l00040"></a><span class="lineno">   40</span>       unfinished_tuple_(false){</div> | 
|  | <div class="line"><a name="l00041"></a><span class="lineno">   41</span>   <span class="comment">// Escape character should not be the same as tuple or col delim unless it is the</span></div> | 
|  | <div class="line"><a name="l00042"></a><span class="lineno">   42</span>   <span class="comment">// empty delimiter.</span></div> | 
|  | <div class="line"><a name="l00043"></a><span class="lineno">   43</span>   DCHECK(escape_char == <span class="charliteral">'\0'</span> || escape_char != tuple_delim);</div> | 
|  | <div class="line"><a name="l00044"></a><span class="lineno">   44</span>   DCHECK(escape_char == <span class="charliteral">'\0'</span> || escape_char != field_delim);</div> | 
|  | <div class="line"><a name="l00045"></a><span class="lineno">   45</span>   DCHECK(escape_char == <span class="charliteral">'\0'</span> || escape_char != collection_item_delim);</div> | 
|  | <div class="line"><a name="l00046"></a><span class="lineno">   46</span> </div> | 
|  | <div class="line"><a name="l00047"></a><span class="lineno">   47</span>   <span class="comment">// Initialize the sse search registers.</span></div> | 
|  | <div class="line"><a name="l00048"></a><span class="lineno">   48</span>   <span class="keywordtype">char</span> search_chars[<a class="code" href="namespaceimpala_1_1SSEUtil.html#ad5d1b2f68ee72d2002ebdbf58177a944">SSEUtil::CHARS_PER_128_BIT_REGISTER</a>];</div> | 
|  | <div class="line"><a name="l00049"></a><span class="lineno">   49</span>   memset(search_chars, 0, <span class="keyword">sizeof</span>(search_chars));</div> | 
|  | <div class="line"><a name="l00050"></a><span class="lineno">   50</span>   <span class="keywordflow">if</span> (<a class="code" href="classimpala_1_1DelimitedTextParser.html#a90b891102dc9bc8e5465831ae382a5cb">process_escapes_</a>) {</div> | 
|  | <div class="line"><a name="l00051"></a><span class="lineno">   51</span>     search_chars[0] = <a class="code" href="classimpala_1_1DelimitedTextParser.html#ae249b2c21125183c7d6144a0286ac9ef">escape_char_</a>;</div> | 
|  | <div class="line"><a name="l00052"></a><span class="lineno">   52</span>     <a class="code" href="classimpala_1_1DelimitedTextParser.html#a49637d59453e03a3ed19420b0bd65c3a">xmm_escape_search_</a> = _mm_loadu_si128(reinterpret_cast<__m128i*>(search_chars));</div> | 
|  | <div class="line"><a name="l00053"></a><span class="lineno">   53</span> </div> | 
|  | <div class="line"><a name="l00054"></a><span class="lineno">   54</span>     <span class="comment">// To process escape characters, we need to check if there was an escape</span></div> | 
|  | <div class="line"><a name="l00055"></a><span class="lineno">   55</span>     <span class="comment">// character between (col_start,col_end).  The SSE instructions return</span></div> | 
|  | <div class="line"><a name="l00056"></a><span class="lineno">   56</span>     <span class="comment">// a bit mask for 16 bits so we need to mask off the bits below col_start</span></div> | 
|  | <div class="line"><a name="l00057"></a><span class="lineno">   57</span>     <span class="comment">// and after col_end.</span></div> | 
|  | <div class="line"><a name="l00058"></a><span class="lineno">   58</span>     <a class="code" href="classimpala_1_1DelimitedTextParser.html#a3b47697ec0f5ee137f48b4b40ffbef06">low_mask_</a>[0] = 0xffff;</div> | 
|  | <div class="line"><a name="l00059"></a><span class="lineno">   59</span>     <a class="code" href="classimpala_1_1DelimitedTextParser.html#a7dbdea45da5c530f066969ed5dbe8f55">high_mask_</a>[15] = 0xffff;</div> | 
|  | <div class="line"><a name="l00060"></a><span class="lineno">   60</span>     <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 1; i < 16; ++i) {</div> | 
|  | <div class="line"><a name="l00061"></a><span class="lineno">   61</span>       <a class="code" href="classimpala_1_1DelimitedTextParser.html#a3b47697ec0f5ee137f48b4b40ffbef06">low_mask_</a>[i] = <a class="code" href="classimpala_1_1DelimitedTextParser.html#a3b47697ec0f5ee137f48b4b40ffbef06">low_mask_</a>[i - 1] << 1;</div> | 
|  | <div class="line"><a name="l00062"></a><span class="lineno">   62</span>     }</div> | 
|  | <div class="line"><a name="l00063"></a><span class="lineno">   63</span>     <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 14; i >= 0; --i) {</div> | 
|  | <div class="line"><a name="l00064"></a><span class="lineno">   64</span>       <a class="code" href="classimpala_1_1DelimitedTextParser.html#a7dbdea45da5c530f066969ed5dbe8f55">high_mask_</a>[i] = <a class="code" href="classimpala_1_1DelimitedTextParser.html#a7dbdea45da5c530f066969ed5dbe8f55">high_mask_</a>[i + 1] >> 1;</div> | 
|  | <div class="line"><a name="l00065"></a><span class="lineno">   65</span>     }</div> | 
|  | <div class="line"><a name="l00066"></a><span class="lineno">   66</span>   } <span class="keywordflow">else</span> {</div> | 
|  | <div class="line"><a name="l00067"></a><span class="lineno">   67</span>     memset(<a class="code" href="classimpala_1_1DelimitedTextParser.html#a7dbdea45da5c530f066969ed5dbe8f55">high_mask_</a>, 0, <span class="keyword">sizeof</span>(<a class="code" href="classimpala_1_1DelimitedTextParser.html#a7dbdea45da5c530f066969ed5dbe8f55">high_mask_</a>));</div> | 
|  | <div class="line"><a name="l00068"></a><span class="lineno">   68</span>     memset(<a class="code" href="classimpala_1_1DelimitedTextParser.html#a3b47697ec0f5ee137f48b4b40ffbef06">low_mask_</a>, 0, <span class="keyword">sizeof</span>(<a class="code" href="classimpala_1_1DelimitedTextParser.html#a3b47697ec0f5ee137f48b4b40ffbef06">low_mask_</a>));</div> | 
|  | <div class="line"><a name="l00069"></a><span class="lineno">   69</span>   }</div> | 
|  | <div class="line"><a name="l00070"></a><span class="lineno">   70</span> </div> | 
|  | <div class="line"><a name="l00071"></a><span class="lineno">   71</span>   <span class="keywordflow">if</span> (tuple_delim != <span class="charliteral">'\0'</span>) {</div> | 
|  | <div class="line"><a name="l00072"></a><span class="lineno">   72</span>     search_chars[<a class="code" href="classimpala_1_1DelimitedTextParser.html#ab76d3428a7bb9ad6aa1850b80f243d28">num_delims_</a>++] = <a class="code" href="classimpala_1_1DelimitedTextParser.html#a5e6f5a82b0c51692fbc51b428597d0d4">tuple_delim_</a>;</div> | 
|  | <div class="line"><a name="l00073"></a><span class="lineno">   73</span>     <span class="comment">// Hive will treats \r (^M) as an alternate tuple delimiter, but \r\n is a</span></div> | 
|  | <div class="line"><a name="l00074"></a><span class="lineno">   74</span>     <span class="comment">// single tuple delimiter.</span></div> | 
|  | <div class="line"><a name="l00075"></a><span class="lineno">   75</span>     <span class="keywordflow">if</span> (<a class="code" href="classimpala_1_1DelimitedTextParser.html#a5e6f5a82b0c51692fbc51b428597d0d4">tuple_delim_</a> == <span class="charliteral">'\n'</span>) search_chars[<a class="code" href="classimpala_1_1DelimitedTextParser.html#ab76d3428a7bb9ad6aa1850b80f243d28">num_delims_</a>++] = <span class="charliteral">'\r'</span>;</div> | 
|  | <div class="line"><a name="l00076"></a><span class="lineno">   76</span>     <a class="code" href="classimpala_1_1DelimitedTextParser.html#a0936a25431098faa81f5ed29ca9a0dd0">xmm_tuple_search_</a> = _mm_loadu_si128(reinterpret_cast<__m128i*>(search_chars));</div> | 
|  | <div class="line"><a name="l00077"></a><span class="lineno">   77</span>   }</div> | 
|  | <div class="line"><a name="l00078"></a><span class="lineno">   78</span> </div> | 
|  | <div class="line"><a name="l00079"></a><span class="lineno">   79</span>   <span class="keywordflow">if</span> (field_delim != <span class="charliteral">'\0'</span> || collection_item_delim != <span class="charliteral">'\0'</span>) {</div> | 
|  | <div class="line"><a name="l00080"></a><span class="lineno">   80</span>     search_chars[<a class="code" href="classimpala_1_1DelimitedTextParser.html#ab76d3428a7bb9ad6aa1850b80f243d28">num_delims_</a>++] = <a class="code" href="classimpala_1_1DelimitedTextParser.html#a3d1863cc77840f2210b18b2856bdd079">field_delim_</a>;</div> | 
|  | <div class="line"><a name="l00081"></a><span class="lineno">   81</span>     search_chars[<a class="code" href="classimpala_1_1DelimitedTextParser.html#ab76d3428a7bb9ad6aa1850b80f243d28">num_delims_</a>++] = <a class="code" href="classimpala_1_1DelimitedTextParser.html#a536f4958ff143714c86aa36f9fd0eafc">collection_item_delim_</a>;</div> | 
|  | <div class="line"><a name="l00082"></a><span class="lineno">   82</span>   }</div> | 
|  | <div class="line"><a name="l00083"></a><span class="lineno">   83</span> </div> | 
|  | <div class="line"><a name="l00084"></a><span class="lineno">   84</span>   DCHECK_GT(<a class="code" href="classimpala_1_1DelimitedTextParser.html#ab76d3428a7bb9ad6aa1850b80f243d28">num_delims_</a>, 0);</div> | 
|  | <div class="line"><a name="l00085"></a><span class="lineno">   85</span>   <a class="code" href="classimpala_1_1DelimitedTextParser.html#af57576143f76df3152dc58b34cc2aee5">xmm_delim_search_</a> = _mm_loadu_si128(reinterpret_cast<__m128i*>(search_chars));</div> | 
|  | <div class="line"><a name="l00086"></a><span class="lineno">   86</span> </div> | 
|  | <div class="line"><a name="l00087"></a><span class="lineno">   87</span>   <a class="code" href="classimpala_1_1DelimitedTextParser.html#af1b586109f27c8284758f7c99151b93b">ParserReset</a>();</div> | 
|  | <div class="line"><a name="l00088"></a><span class="lineno">   88</span> }</div> | 
|  | <div class="line"><a name="l00089"></a><span class="lineno">   89</span> </div> | 
|  | <div class="line"><a name="l00090"></a><span class="lineno"><a class="line" href="classimpala_1_1DelimitedTextParser.html#af1b586109f27c8284758f7c99151b93b">   90</a></span> <span class="keywordtype">void</span> <a class="code" href="classimpala_1_1DelimitedTextParser.html#af1b586109f27c8284758f7c99151b93b">DelimitedTextParser::ParserReset</a>() {</div> | 
|  | <div class="line"><a name="l00091"></a><span class="lineno">   91</span>   <a class="code" href="classimpala_1_1DelimitedTextParser.html#acacd7799b6a245c30ee25dcb34ee9810">current_column_has_escape_</a> = <span class="keyword">false</span>;</div> | 
|  | <div class="line"><a name="l00092"></a><span class="lineno">   92</span>   <a class="code" href="classimpala_1_1DelimitedTextParser.html#a9083e73358436888ad756c74e216a928">last_char_is_escape_</a> = <span class="keyword">false</span>;</div> | 
|  | <div class="line"><a name="l00093"></a><span class="lineno">   93</span>   <a class="code" href="classimpala_1_1DelimitedTextParser.html#a893aaa8252b433080c1b0415298c1ba2">last_row_delim_offset_</a> = -1;</div> | 
|  | <div class="line"><a name="l00094"></a><span class="lineno">   94</span>   <a class="code" href="classimpala_1_1DelimitedTextParser.html#a7dec5b1a3046f87e59b491f84f0f69fe">column_idx_</a> = <a class="code" href="classimpala_1_1DelimitedTextParser.html#a474d30148a664e0398635f46151be2a3">num_partition_keys_</a>;</div> | 
|  | <div class="line"><a name="l00095"></a><span class="lineno">   95</span> }</div> | 
|  | <div class="line"><a name="l00096"></a><span class="lineno">   96</span> </div> | 
|  | <div class="line"><a name="l00097"></a><span class="lineno">   97</span> <span class="comment">// Parsing raw csv data into FieldLocation descriptors.</span></div> | 
|  | <div class="line"><a name="l00098"></a><span class="lineno"><a class="line" href="classimpala_1_1DelimitedTextParser.html#a5c0e2f5d09e4871280dbfd3bdf823718">   98</a></span> <a class="code" href="classimpala_1_1Status.html">Status</a> <a class="code" href="classimpala_1_1DelimitedTextParser.html#a5c0e2f5d09e4871280dbfd3bdf823718">DelimitedTextParser::ParseFieldLocations</a>(<span class="keywordtype">int</span> max_tuples, int64_t remaining_len,</div> | 
|  | <div class="line"><a name="l00099"></a><span class="lineno">   99</span>     <span class="keywordtype">char</span>** byte_buffer_ptr, <span class="keywordtype">char</span>** row_end_locations,</div> | 
|  | <div class="line"><a name="l00100"></a><span class="lineno">  100</span>     <a class="code" href="structimpala_1_1FieldLocation.html">FieldLocation</a>* field_locations,</div> | 
|  | <div class="line"><a name="l00101"></a><span class="lineno">  101</span>     <span class="keywordtype">int</span>* num_tuples, <span class="keywordtype">int</span>* num_fields, <span class="keywordtype">char</span>** next_column_start) {</div> | 
|  | <div class="line"><a name="l00102"></a><span class="lineno">  102</span>   <span class="comment">// Start of this batch.</span></div> | 
|  | <div class="line"><a name="l00103"></a><span class="lineno">  103</span>   *next_column_start = *byte_buffer_ptr;</div> | 
|  | <div class="line"><a name="l00104"></a><span class="lineno">  104</span>   <span class="comment">// If there was a '\r' at the end of the last batch, set the offset to</span></div> | 
|  | <div class="line"><a name="l00105"></a><span class="lineno">  105</span>   <span class="comment">// just before the beginning. Otherwise make it invalid.</span></div> | 
|  | <div class="line"><a name="l00106"></a><span class="lineno">  106</span>   <span class="keywordflow">if</span> (<a class="code" href="classimpala_1_1DelimitedTextParser.html#a893aaa8252b433080c1b0415298c1ba2">last_row_delim_offset_</a> == 0) {</div> | 
|  | <div class="line"><a name="l00107"></a><span class="lineno">  107</span>     <a class="code" href="classimpala_1_1DelimitedTextParser.html#a893aaa8252b433080c1b0415298c1ba2">last_row_delim_offset_</a> = remaining_len;</div> | 
|  | <div class="line"><a name="l00108"></a><span class="lineno">  108</span>   } <span class="keywordflow">else</span> {</div> | 
|  | <div class="line"><a name="l00109"></a><span class="lineno">  109</span>     <a class="code" href="classimpala_1_1DelimitedTextParser.html#a893aaa8252b433080c1b0415298c1ba2">last_row_delim_offset_</a> = -1;</div> | 
|  | <div class="line"><a name="l00110"></a><span class="lineno">  110</span>   }</div> | 
|  | <div class="line"><a name="l00111"></a><span class="lineno">  111</span> </div> | 
|  | <div class="line"><a name="l00112"></a><span class="lineno">  112</span>   <span class="keywordflow">if</span> (<a class="code" href="classimpala_1_1CpuInfo.html#a251ae7245ccb0d678601bb6d8d6fb63a">CpuInfo::IsSupported</a>(<a class="code" href="classimpala_1_1CpuInfo.html#a0cf1356c27b33ca4d428df026209e6fd">CpuInfo::SSE4_2</a>)) {</div> | 
|  | <div class="line"><a name="l00113"></a><span class="lineno">  113</span>     <span class="keywordflow">if</span> (<a class="code" href="classimpala_1_1DelimitedTextParser.html#a90b891102dc9bc8e5465831ae382a5cb">process_escapes_</a>) {</div> | 
|  | <div class="line"><a name="l00114"></a><span class="lineno">  114</span>       ParseSse<true>(max_tuples, &remaining_len, byte_buffer_ptr, row_end_locations,</div> | 
|  | <div class="line"><a name="l00115"></a><span class="lineno">  115</span>           field_locations, num_tuples, num_fields, next_column_start);</div> | 
|  | <div class="line"><a name="l00116"></a><span class="lineno">  116</span>     } <span class="keywordflow">else</span> {</div> | 
|  | <div class="line"><a name="l00117"></a><span class="lineno">  117</span>       ParseSse<false>(max_tuples, &remaining_len, byte_buffer_ptr, row_end_locations,</div> | 
|  | <div class="line"><a name="l00118"></a><span class="lineno">  118</span>           field_locations, num_tuples, num_fields, next_column_start);</div> | 
|  | <div class="line"><a name="l00119"></a><span class="lineno">  119</span>     }</div> | 
|  | <div class="line"><a name="l00120"></a><span class="lineno">  120</span>   }</div> | 
|  | <div class="line"><a name="l00121"></a><span class="lineno">  121</span> </div> | 
|  | <div class="line"><a name="l00122"></a><span class="lineno">  122</span>   <span class="keywordflow">if</span> (*num_tuples == max_tuples) <span class="keywordflow">return</span> <a class="code" href="classimpala_1_1Status.html#a580565665ea944eb64f3f495b1bee1e0">Status::OK</a>;</div> | 
|  | <div class="line"><a name="l00123"></a><span class="lineno">  123</span> </div> | 
|  | <div class="line"><a name="l00124"></a><span class="lineno">  124</span>   <span class="comment">// Handle the remaining characters</span></div> | 
|  | <div class="line"><a name="l00125"></a><span class="lineno">  125</span>   <span class="keywordflow">while</span> (remaining_len > 0) {</div> | 
|  | <div class="line"><a name="l00126"></a><span class="lineno">  126</span>     <span class="keywordtype">bool</span> new_tuple = <span class="keyword">false</span>;</div> | 
|  | <div class="line"><a name="l00127"></a><span class="lineno">  127</span>     <span class="keywordtype">bool</span> new_col = <span class="keyword">false</span>;</div> | 
|  | <div class="line"><a name="l00128"></a><span class="lineno">  128</span>     <a class="code" href="classimpala_1_1DelimitedTextParser.html#a163201ab3b9a50974f1fcd1b0fb9d3b5">unfinished_tuple_</a> = <span class="keyword">true</span>;</div> | 
|  | <div class="line"><a name="l00129"></a><span class="lineno">  129</span> </div> | 
|  | <div class="line"><a name="l00130"></a><span class="lineno">  130</span>     <span class="keywordflow">if</span> (!<a class="code" href="classimpala_1_1DelimitedTextParser.html#a9083e73358436888ad756c74e216a928">last_char_is_escape_</a>) {</div> | 
|  | <div class="line"><a name="l00131"></a><span class="lineno">  131</span>       <span class="keywordflow">if</span> (<a class="code" href="classimpala_1_1DelimitedTextParser.html#a5e6f5a82b0c51692fbc51b428597d0d4">tuple_delim_</a> != <span class="charliteral">'\0'</span> && (**byte_buffer_ptr == <a class="code" href="classimpala_1_1DelimitedTextParser.html#a5e6f5a82b0c51692fbc51b428597d0d4">tuple_delim_</a> ||</div> | 
|  | <div class="line"><a name="l00132"></a><span class="lineno">  132</span>            (<a class="code" href="classimpala_1_1DelimitedTextParser.html#a5e6f5a82b0c51692fbc51b428597d0d4">tuple_delim_</a> == <span class="charliteral">'\n'</span> && **byte_buffer_ptr == <span class="charliteral">'\r'</span>))) {</div> | 
|  | <div class="line"><a name="l00133"></a><span class="lineno">  133</span>         new_tuple = <span class="keyword">true</span>;</div> | 
|  | <div class="line"><a name="l00134"></a><span class="lineno">  134</span>         new_col = <span class="keyword">true</span>;</div> | 
|  | <div class="line"><a name="l00135"></a><span class="lineno">  135</span>       } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (**byte_buffer_ptr == <a class="code" href="classimpala_1_1DelimitedTextParser.html#a3d1863cc77840f2210b18b2856bdd079">field_delim_</a></div> | 
|  | <div class="line"><a name="l00136"></a><span class="lineno">  136</span>                  || **byte_buffer_ptr == <a class="code" href="classimpala_1_1DelimitedTextParser.html#a536f4958ff143714c86aa36f9fd0eafc">collection_item_delim_</a>) {</div> | 
|  | <div class="line"><a name="l00137"></a><span class="lineno">  137</span>         new_col = <span class="keyword">true</span>;</div> | 
|  | <div class="line"><a name="l00138"></a><span class="lineno">  138</span>       }</div> | 
|  | <div class="line"><a name="l00139"></a><span class="lineno">  139</span>     }</div> | 
|  | <div class="line"><a name="l00140"></a><span class="lineno">  140</span> </div> | 
|  | <div class="line"><a name="l00141"></a><span class="lineno">  141</span>     <span class="keywordflow">if</span> (<a class="code" href="classimpala_1_1DelimitedTextParser.html#a90b891102dc9bc8e5465831ae382a5cb">process_escapes_</a> && **byte_buffer_ptr == <a class="code" href="classimpala_1_1DelimitedTextParser.html#ae249b2c21125183c7d6144a0286ac9ef">escape_char_</a>) {</div> | 
|  | <div class="line"><a name="l00142"></a><span class="lineno">  142</span>       <a class="code" href="classimpala_1_1DelimitedTextParser.html#acacd7799b6a245c30ee25dcb34ee9810">current_column_has_escape_</a> = <span class="keyword">true</span>;</div> | 
|  | <div class="line"><a name="l00143"></a><span class="lineno">  143</span>       <a class="code" href="classimpala_1_1DelimitedTextParser.html#a9083e73358436888ad756c74e216a928">last_char_is_escape_</a> = !<a class="code" href="classimpala_1_1DelimitedTextParser.html#a9083e73358436888ad756c74e216a928">last_char_is_escape_</a>;</div> | 
|  | <div class="line"><a name="l00144"></a><span class="lineno">  144</span>     } <span class="keywordflow">else</span> {</div> | 
|  | <div class="line"><a name="l00145"></a><span class="lineno">  145</span>       <a class="code" href="classimpala_1_1DelimitedTextParser.html#a9083e73358436888ad756c74e216a928">last_char_is_escape_</a> = <span class="keyword">false</span>;</div> | 
|  | <div class="line"><a name="l00146"></a><span class="lineno">  146</span>     }</div> | 
|  | <div class="line"><a name="l00147"></a><span class="lineno">  147</span> </div> | 
|  | <div class="line"><a name="l00148"></a><span class="lineno">  148</span>     <span class="keywordflow">if</span> (new_tuple) {</div> | 
|  | <div class="line"><a name="l00149"></a><span class="lineno">  149</span>       <span class="keywordflow">if</span> (<a class="code" href="classimpala_1_1DelimitedTextParser.html#a893aaa8252b433080c1b0415298c1ba2">last_row_delim_offset_</a> == remaining_len && **byte_buffer_ptr == <span class="charliteral">'\n'</span>) {</div> | 
|  | <div class="line"><a name="l00150"></a><span class="lineno">  150</span>         <span class="comment">// If the row ended in \r\n then move to the \n</span></div> | 
|  | <div class="line"><a name="l00151"></a><span class="lineno">  151</span>         ++*next_column_start;</div> | 
|  | <div class="line"><a name="l00152"></a><span class="lineno">  152</span>       } <span class="keywordflow">else</span> {</div> | 
|  | <div class="line"><a name="l00153"></a><span class="lineno">  153</span>         AddColumn<true>(*byte_buffer_ptr - *next_column_start,</div> | 
|  | <div class="line"><a name="l00154"></a><span class="lineno">  154</span>             next_column_start, num_fields, field_locations);</div> | 
|  | <div class="line"><a name="l00155"></a><span class="lineno">  155</span>         FillColumns<false>(0, NULL, num_fields, field_locations);</div> | 
|  | <div class="line"><a name="l00156"></a><span class="lineno">  156</span>         <a class="code" href="classimpala_1_1DelimitedTextParser.html#a7dec5b1a3046f87e59b491f84f0f69fe">column_idx_</a> = <a class="code" href="classimpala_1_1DelimitedTextParser.html#a474d30148a664e0398635f46151be2a3">num_partition_keys_</a>;</div> | 
|  | <div class="line"><a name="l00157"></a><span class="lineno">  157</span>         row_end_locations[*num_tuples] = *byte_buffer_ptr;</div> | 
|  | <div class="line"><a name="l00158"></a><span class="lineno">  158</span>         ++(*num_tuples);</div> | 
|  | <div class="line"><a name="l00159"></a><span class="lineno">  159</span>       }</div> | 
|  | <div class="line"><a name="l00160"></a><span class="lineno">  160</span>       <a class="code" href="classimpala_1_1DelimitedTextParser.html#a163201ab3b9a50974f1fcd1b0fb9d3b5">unfinished_tuple_</a> = <span class="keyword">false</span>;</div> | 
|  | <div class="line"><a name="l00161"></a><span class="lineno">  161</span>       <a class="code" href="classimpala_1_1DelimitedTextParser.html#a893aaa8252b433080c1b0415298c1ba2">last_row_delim_offset_</a> = **byte_buffer_ptr == <span class="charliteral">'\r'</span> ? remaining_len - 1 : -1;</div> | 
|  | <div class="line"><a name="l00162"></a><span class="lineno">  162</span>       <span class="keywordflow">if</span> (*num_tuples == max_tuples) {</div> | 
|  | <div class="line"><a name="l00163"></a><span class="lineno">  163</span>         ++*byte_buffer_ptr;</div> | 
|  | <div class="line"><a name="l00164"></a><span class="lineno">  164</span>         --remaining_len;</div> | 
|  | <div class="line"><a name="l00165"></a><span class="lineno">  165</span>         <span class="keywordflow">if</span> (<a class="code" href="classimpala_1_1DelimitedTextParser.html#a893aaa8252b433080c1b0415298c1ba2">last_row_delim_offset_</a> == remaining_len) <a class="code" href="classimpala_1_1DelimitedTextParser.html#a893aaa8252b433080c1b0415298c1ba2">last_row_delim_offset_</a> = 0;</div> | 
|  | <div class="line"><a name="l00166"></a><span class="lineno">  166</span>         <span class="keywordflow">return</span> <a class="code" href="classimpala_1_1Status.html#a580565665ea944eb64f3f495b1bee1e0">Status::OK</a>;</div> | 
|  | <div class="line"><a name="l00167"></a><span class="lineno">  167</span>       }</div> | 
|  | <div class="line"><a name="l00168"></a><span class="lineno">  168</span>     } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (new_col) {</div> | 
|  | <div class="line"><a name="l00169"></a><span class="lineno">  169</span>       AddColumn<true>(*byte_buffer_ptr - *next_column_start,</div> | 
|  | <div class="line"><a name="l00170"></a><span class="lineno">  170</span>           next_column_start, num_fields, field_locations);</div> | 
|  | <div class="line"><a name="l00171"></a><span class="lineno">  171</span>     }</div> | 
|  | <div class="line"><a name="l00172"></a><span class="lineno">  172</span> </div> | 
|  | <div class="line"><a name="l00173"></a><span class="lineno">  173</span>     --remaining_len;</div> | 
|  | <div class="line"><a name="l00174"></a><span class="lineno">  174</span>     ++*byte_buffer_ptr;</div> | 
|  | <div class="line"><a name="l00175"></a><span class="lineno">  175</span>   }</div> | 
|  | <div class="line"><a name="l00176"></a><span class="lineno">  176</span> </div> | 
|  | <div class="line"><a name="l00177"></a><span class="lineno">  177</span>   <span class="comment">// For formats that store the length of the row, the row is not delimited:</span></div> | 
|  | <div class="line"><a name="l00178"></a><span class="lineno">  178</span>   <span class="comment">// e.g. Sequence files.</span></div> | 
|  | <div class="line"><a name="l00179"></a><span class="lineno">  179</span>   <span class="keywordflow">if</span> (<a class="code" href="classimpala_1_1DelimitedTextParser.html#a5e6f5a82b0c51692fbc51b428597d0d4">tuple_delim_</a> == <span class="charliteral">'\0'</span>) {</div> | 
|  | <div class="line"><a name="l00180"></a><span class="lineno">  180</span>     DCHECK_EQ(remaining_len, 0);</div> | 
|  | <div class="line"><a name="l00181"></a><span class="lineno">  181</span>     AddColumn<true>(*byte_buffer_ptr - *next_column_start,</div> | 
|  | <div class="line"><a name="l00182"></a><span class="lineno">  182</span>         next_column_start, num_fields, field_locations);</div> | 
|  | <div class="line"><a name="l00183"></a><span class="lineno">  183</span>     FillColumns<false>(0, NULL, num_fields, field_locations);</div> | 
|  | <div class="line"><a name="l00184"></a><span class="lineno">  184</span>     <a class="code" href="classimpala_1_1DelimitedTextParser.html#a7dec5b1a3046f87e59b491f84f0f69fe">column_idx_</a> = <a class="code" href="classimpala_1_1DelimitedTextParser.html#a474d30148a664e0398635f46151be2a3">num_partition_keys_</a>;</div> | 
|  | <div class="line"><a name="l00185"></a><span class="lineno">  185</span>     ++(*num_tuples);</div> | 
|  | <div class="line"><a name="l00186"></a><span class="lineno">  186</span>     <a class="code" href="classimpala_1_1DelimitedTextParser.html#a163201ab3b9a50974f1fcd1b0fb9d3b5">unfinished_tuple_</a> = <span class="keyword">false</span>;</div> | 
|  | <div class="line"><a name="l00187"></a><span class="lineno">  187</span>   }</div> | 
|  | <div class="line"><a name="l00188"></a><span class="lineno">  188</span>   <span class="keywordflow">return</span> <a class="code" href="classimpala_1_1Status.html#a580565665ea944eb64f3f495b1bee1e0">Status::OK</a>;</div> | 
|  | <div class="line"><a name="l00189"></a><span class="lineno">  189</span> }</div> | 
|  | <div class="line"><a name="l00190"></a><span class="lineno">  190</span> </div> | 
|  | <div class="line"><a name="l00191"></a><span class="lineno">  191</span> <span class="comment">// Find the first instance of the tuple delimiter.  This will</span></div> | 
|  | <div class="line"><a name="l00192"></a><span class="lineno">  192</span> <span class="comment">// find the start of the first full tuple in buffer by looking for the end of</span></div> | 
|  | <div class="line"><a name="l00193"></a><span class="lineno">  193</span> <span class="comment">// the previous tuple.</span></div> | 
|  | <div class="line"><a name="l00194"></a><span class="lineno"><a class="line" href="classimpala_1_1DelimitedTextParser.html#a46a04d3e77bd8430cb14647922d0da97">  194</a></span> <span class="keywordtype">int</span> <a class="code" href="classimpala_1_1DelimitedTextParser.html#a46a04d3e77bd8430cb14647922d0da97">DelimitedTextParser::FindFirstInstance</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* buffer, <span class="keywordtype">int</span> len) {</div> | 
|  | <div class="line"><a name="l00195"></a><span class="lineno">  195</span>   <span class="keywordtype">int</span> tuple_start = 0;</div> | 
|  | <div class="line"><a name="l00196"></a><span class="lineno">  196</span>   <span class="keyword">const</span> <span class="keywordtype">char</span>* buffer_start = buffer;</div> | 
|  | <div class="line"><a name="l00197"></a><span class="lineno">  197</span>   <span class="keywordtype">bool</span> found = <span class="keyword">false</span>;</div> | 
|  | <div class="line"><a name="l00198"></a><span class="lineno">  198</span> </div> | 
|  | <div class="line"><a name="l00199"></a><span class="lineno">  199</span>   <span class="comment">// If the last char in the previous buffer was \r then either return the start of</span></div> | 
|  | <div class="line"><a name="l00200"></a><span class="lineno">  200</span>   <span class="comment">// this buffer or skip a \n at the beginning of the buffer.</span></div> | 
|  | <div class="line"><a name="l00201"></a><span class="lineno">  201</span>   <span class="keywordflow">if</span> (<a class="code" href="classimpala_1_1DelimitedTextParser.html#a893aaa8252b433080c1b0415298c1ba2">last_row_delim_offset_</a> != -1) {</div> | 
|  | <div class="line"><a name="l00202"></a><span class="lineno">  202</span>     <span class="keywordflow">if</span> (*buffer_start == <span class="charliteral">'\n'</span>) <span class="keywordflow">return</span> 1;</div> | 
|  | <div class="line"><a name="l00203"></a><span class="lineno">  203</span>     <span class="keywordflow">return</span> 0;</div> | 
|  | <div class="line"><a name="l00204"></a><span class="lineno">  204</span>   }</div> | 
|  | <div class="line"><a name="l00205"></a><span class="lineno">  205</span> restart:</div> | 
|  | <div class="line"><a name="l00206"></a><span class="lineno">  206</span>   found = <span class="keyword">false</span>;</div> | 
|  | <div class="line"><a name="l00207"></a><span class="lineno">  207</span> </div> | 
|  | <div class="line"><a name="l00208"></a><span class="lineno">  208</span>   <span class="keywordflow">if</span> (<a class="code" href="classimpala_1_1CpuInfo.html#a251ae7245ccb0d678601bb6d8d6fb63a">CpuInfo::IsSupported</a>(<a class="code" href="classimpala_1_1CpuInfo.html#a0cf1356c27b33ca4d428df026209e6fd">CpuInfo::SSE4_2</a>)) {</div> | 
|  | <div class="line"><a name="l00209"></a><span class="lineno">  209</span>     __m128i xmm_buffer, xmm_tuple_mask;</div> | 
|  | <div class="line"><a name="l00210"></a><span class="lineno">  210</span>     <span class="keywordflow">while</span> (len - tuple_start >= <a class="code" href="namespaceimpala_1_1SSEUtil.html#ad5d1b2f68ee72d2002ebdbf58177a944">SSEUtil::CHARS_PER_128_BIT_REGISTER</a>) {</div> | 
|  | <div class="line"><a name="l00211"></a><span class="lineno">  211</span>       <span class="comment">// TODO: can we parallelize this as well?  Are there multiple sse execution units?</span></div> | 
|  | <div class="line"><a name="l00212"></a><span class="lineno">  212</span>       <span class="comment">// Load the next 16 bytes into the xmm register and do strchr for the</span></div> | 
|  | <div class="line"><a name="l00213"></a><span class="lineno">  213</span>       <span class="comment">// tuple delimiter.</span></div> | 
|  | <div class="line"><a name="l00214"></a><span class="lineno">  214</span>       xmm_buffer = _mm_loadu_si128(reinterpret_cast<const __m128i*>(buffer));</div> | 
|  | <div class="line"><a name="l00215"></a><span class="lineno">  215</span>       xmm_tuple_mask = <a class="code" href="namespaceimpala.html#ad9dc935408c04dc3eb969eb8791cadda">SSE4_cmpestrm</a>(<a class="code" href="classimpala_1_1DelimitedTextParser.html#a0936a25431098faa81f5ed29ca9a0dd0">xmm_tuple_search_</a>, 1, xmm_buffer,</div> | 
|  | <div class="line"><a name="l00216"></a><span class="lineno">  216</span>           <a class="code" href="namespaceimpala_1_1SSEUtil.html#ad5d1b2f68ee72d2002ebdbf58177a944">SSEUtil::CHARS_PER_128_BIT_REGISTER</a>, <a class="code" href="namespaceimpala_1_1SSEUtil.html#a6dcf118705dfd9d6f4a1e3e339431d2b">SSEUtil::STRCHR_MODE</a>);</div> | 
|  | <div class="line"><a name="l00217"></a><span class="lineno">  217</span>       <span class="keywordtype">int</span> tuple_mask = _mm_extract_epi16(xmm_tuple_mask, 0);</div> | 
|  | <div class="line"><a name="l00218"></a><span class="lineno">  218</span>       <span class="keywordflow">if</span> (tuple_mask != 0) {</div> | 
|  | <div class="line"><a name="l00219"></a><span class="lineno">  219</span>         found = <span class="keyword">true</span>;</div> | 
|  | <div class="line"><a name="l00220"></a><span class="lineno">  220</span>         <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < <a class="code" href="namespaceimpala_1_1SSEUtil.html#ad5d1b2f68ee72d2002ebdbf58177a944">SSEUtil::CHARS_PER_128_BIT_REGISTER</a>; ++i) {</div> | 
|  | <div class="line"><a name="l00221"></a><span class="lineno">  221</span>           <span class="keywordflow">if</span> ((tuple_mask & <a class="code" href="namespaceimpala_1_1SSEUtil.html#a05185ef6da126b67aeac9aa78fbaf19c">SSEUtil::SSE_BITMASK</a>[i]) != 0) {</div> | 
|  | <div class="line"><a name="l00222"></a><span class="lineno">  222</span>             tuple_start += i + 1;</div> | 
|  | <div class="line"><a name="l00223"></a><span class="lineno">  223</span>             buffer += i + 1;</div> | 
|  | <div class="line"><a name="l00224"></a><span class="lineno">  224</span>             <span class="keywordflow">break</span>;</div> | 
|  | <div class="line"><a name="l00225"></a><span class="lineno">  225</span>           }</div> | 
|  | <div class="line"><a name="l00226"></a><span class="lineno">  226</span>         }</div> | 
|  | <div class="line"><a name="l00227"></a><span class="lineno">  227</span>         <span class="keywordflow">break</span>;</div> | 
|  | <div class="line"><a name="l00228"></a><span class="lineno">  228</span>       }</div> | 
|  | <div class="line"><a name="l00229"></a><span class="lineno">  229</span>       tuple_start += <a class="code" href="namespaceimpala_1_1SSEUtil.html#ad5d1b2f68ee72d2002ebdbf58177a944">SSEUtil::CHARS_PER_128_BIT_REGISTER</a>;</div> | 
|  | <div class="line"><a name="l00230"></a><span class="lineno">  230</span>       buffer += <a class="code" href="namespaceimpala_1_1SSEUtil.html#ad5d1b2f68ee72d2002ebdbf58177a944">SSEUtil::CHARS_PER_128_BIT_REGISTER</a>;</div> | 
|  | <div class="line"><a name="l00231"></a><span class="lineno">  231</span>     }</div> | 
|  | <div class="line"><a name="l00232"></a><span class="lineno">  232</span>   }</div> | 
|  | <div class="line"><a name="l00233"></a><span class="lineno">  233</span>   <span class="keywordflow">if</span> (!found) {</div> | 
|  | <div class="line"><a name="l00234"></a><span class="lineno">  234</span>     <span class="keywordflow">for</span> (; tuple_start < len; ++tuple_start) {</div> | 
|  | <div class="line"><a name="l00235"></a><span class="lineno">  235</span>       <span class="keywordtype">char</span> c = *buffer++;</div> | 
|  | <div class="line"><a name="l00236"></a><span class="lineno">  236</span>       <span class="keywordflow">if</span> (c == <a class="code" href="classimpala_1_1DelimitedTextParser.html#a5e6f5a82b0c51692fbc51b428597d0d4">tuple_delim_</a> || (c == <span class="charliteral">'\r'</span> && <a class="code" href="classimpala_1_1DelimitedTextParser.html#a5e6f5a82b0c51692fbc51b428597d0d4">tuple_delim_</a> == <span class="charliteral">'\n'</span>)) {</div> | 
|  | <div class="line"><a name="l00237"></a><span class="lineno">  237</span>         ++tuple_start;</div> | 
|  | <div class="line"><a name="l00238"></a><span class="lineno">  238</span>         found = <span class="keyword">true</span>;</div> | 
|  | <div class="line"><a name="l00239"></a><span class="lineno">  239</span>         <span class="keywordflow">break</span>;</div> | 
|  | <div class="line"><a name="l00240"></a><span class="lineno">  240</span>       }</div> | 
|  | <div class="line"><a name="l00241"></a><span class="lineno">  241</span>     }</div> | 
|  | <div class="line"><a name="l00242"></a><span class="lineno">  242</span>   }</div> | 
|  | <div class="line"><a name="l00243"></a><span class="lineno">  243</span> </div> | 
|  | <div class="line"><a name="l00244"></a><span class="lineno">  244</span>   <span class="keywordflow">if</span> (!found) <span class="keywordflow">return</span> -1;</div> | 
|  | <div class="line"><a name="l00245"></a><span class="lineno">  245</span> </div> | 
|  | <div class="line"><a name="l00246"></a><span class="lineno">  246</span>   <span class="keywordflow">if</span> (<a class="code" href="classimpala_1_1DelimitedTextParser.html#a90b891102dc9bc8e5465831ae382a5cb">process_escapes_</a>) {</div> | 
|  | <div class="line"><a name="l00247"></a><span class="lineno">  247</span>     <span class="comment">// Scan backwards for escape characters.  We do this after</span></div> | 
|  | <div class="line"><a name="l00248"></a><span class="lineno">  248</span>     <span class="comment">// finding the tuple break rather than during the (above)</span></div> | 
|  | <div class="line"><a name="l00249"></a><span class="lineno">  249</span>     <span class="comment">// forward scan to make the forward scan faster.  This will</span></div> | 
|  | <div class="line"><a name="l00250"></a><span class="lineno">  250</span>     <span class="comment">// perform worse if there are many characters right before the</span></div> | 
|  | <div class="line"><a name="l00251"></a><span class="lineno">  251</span>     <span class="comment">// tuple break that are all escape characters, but that is</span></div> | 
|  | <div class="line"><a name="l00252"></a><span class="lineno">  252</span>     <span class="comment">// unlikely.</span></div> | 
|  | <div class="line"><a name="l00253"></a><span class="lineno">  253</span>     <span class="keywordtype">int</span> num_escape_chars = 0;</div> | 
|  | <div class="line"><a name="l00254"></a><span class="lineno">  254</span>     <span class="keywordtype">int</span> before_tuple_end = tuple_start - 2;</div> | 
|  | <div class="line"><a name="l00255"></a><span class="lineno">  255</span>     <span class="comment">// TODO: If scan range is split between escape character and tuple delimiter,</span></div> | 
|  | <div class="line"><a name="l00256"></a><span class="lineno">  256</span>     <span class="comment">// before_tuple_end will be -1. Need to scan previous range for escape characters</span></div> | 
|  | <div class="line"><a name="l00257"></a><span class="lineno">  257</span>     <span class="comment">// in this case.</span></div> | 
|  | <div class="line"><a name="l00258"></a><span class="lineno">  258</span>     <span class="keywordflow">for</span> (; before_tuple_end >= 0; --before_tuple_end) {</div> | 
|  | <div class="line"><a name="l00259"></a><span class="lineno">  259</span>       <span class="keywordflow">if</span> (buffer_start[before_tuple_end] == <a class="code" href="classimpala_1_1DelimitedTextParser.html#ae249b2c21125183c7d6144a0286ac9ef">escape_char_</a>) {</div> | 
|  | <div class="line"><a name="l00260"></a><span class="lineno">  260</span>         ++num_escape_chars;</div> | 
|  | <div class="line"><a name="l00261"></a><span class="lineno">  261</span>       } <span class="keywordflow">else</span> {</div> | 
|  | <div class="line"><a name="l00262"></a><span class="lineno">  262</span>         <span class="keywordflow">break</span>;</div> | 
|  | <div class="line"><a name="l00263"></a><span class="lineno">  263</span>       }</div> | 
|  | <div class="line"><a name="l00264"></a><span class="lineno">  264</span>     }</div> | 
|  | <div class="line"><a name="l00265"></a><span class="lineno">  265</span> </div> | 
|  | <div class="line"><a name="l00266"></a><span class="lineno">  266</span>     <span class="comment">// TODO: This sucks.  All the preceding characters before the tuple delim were</span></div> | 
|  | <div class="line"><a name="l00267"></a><span class="lineno">  267</span>     <span class="comment">// escape characters.  We need to read from the previous block to see what to do.</span></div> | 
|  | <div class="line"><a name="l00268"></a><span class="lineno">  268</span>     <span class="keywordflow">if</span> (before_tuple_end < 0) {</div> | 
|  | <div class="line"><a name="l00269"></a><span class="lineno">  269</span>       <span class="keyword">static</span> <span class="keywordtype">bool</span> warning_logged = <span class="keyword">false</span>;</div> | 
|  | <div class="line"><a name="l00270"></a><span class="lineno">  270</span>       <span class="keywordflow">if</span> (!warning_logged) {</div> | 
|  | <div class="line"><a name="l00271"></a><span class="lineno">  271</span>         LOG(WARNING) << <span class="stringliteral">"Unhandled code path.  This might cause a tuple to be "</span></div> | 
|  | <div class="line"><a name="l00272"></a><span class="lineno">  272</span>                      << <span class="stringliteral">"skipped or repeated."</span>;</div> | 
|  | <div class="line"><a name="l00273"></a><span class="lineno">  273</span>         warning_logged = <span class="keyword">true</span>;</div> | 
|  | <div class="line"><a name="l00274"></a><span class="lineno">  274</span>       }</div> | 
|  | <div class="line"><a name="l00275"></a><span class="lineno">  275</span>     }</div> | 
|  | <div class="line"><a name="l00276"></a><span class="lineno">  276</span> </div> | 
|  | <div class="line"><a name="l00277"></a><span class="lineno">  277</span>     <span class="comment">// An even number of escape characters means they cancel out and this tuple break</span></div> | 
|  | <div class="line"><a name="l00278"></a><span class="lineno">  278</span>     <span class="comment">// is *not* escaped.</span></div> | 
|  | <div class="line"><a name="l00279"></a><span class="lineno">  279</span>     <span class="keywordflow">if</span> (num_escape_chars % 2 != 0) <span class="keywordflow">goto</span> restart;</div> | 
|  | <div class="line"><a name="l00280"></a><span class="lineno">  280</span>   }</div> | 
|  | <div class="line"><a name="l00281"></a><span class="lineno">  281</span> </div> | 
|  | <div class="line"><a name="l00282"></a><span class="lineno">  282</span>   <span class="keywordflow">if</span> (tuple_start == len - 1 && buffer_start[tuple_start] == <span class="charliteral">'\r'</span>) {</div> | 
|  | <div class="line"><a name="l00283"></a><span class="lineno">  283</span>     <span class="comment">// If \r is the last char we need to wait to see if the next one is \n or not.</span></div> | 
|  | <div class="line"><a name="l00284"></a><span class="lineno">  284</span>     <a class="code" href="classimpala_1_1DelimitedTextParser.html#a893aaa8252b433080c1b0415298c1ba2">last_row_delim_offset_</a> = 0;</div> | 
|  | <div class="line"><a name="l00285"></a><span class="lineno">  285</span>     <span class="keywordflow">return</span> -1;</div> | 
|  | <div class="line"><a name="l00286"></a><span class="lineno">  286</span>   }</div> | 
|  | <div class="line"><a name="l00287"></a><span class="lineno">  287</span>   <span class="keywordflow">if</span> (tuple_start < len && buffer_start[tuple_start] == <span class="charliteral">'\n'</span> &&</div> | 
|  | <div class="line"><a name="l00288"></a><span class="lineno">  288</span>       buffer_start[tuple_start - 1] == <span class="charliteral">'\r'</span>) {</div> | 
|  | <div class="line"><a name="l00289"></a><span class="lineno">  289</span>     <span class="comment">// We have \r\n, move to the next character.</span></div> | 
|  | <div class="line"><a name="l00290"></a><span class="lineno">  290</span>     ++tuple_start;</div> | 
|  | <div class="line"><a name="l00291"></a><span class="lineno">  291</span>   }</div> | 
|  | <div class="line"><a name="l00292"></a><span class="lineno">  292</span>   <span class="keywordflow">return</span> tuple_start;</div> | 
|  | <div class="line"><a name="l00293"></a><span class="lineno">  293</span> }</div> | 
|  | <div class="ttc" id="namespaceimpala_1_1SSEUtil_html_a05185ef6da126b67aeac9aa78fbaf19c"><div class="ttname"><a href="namespaceimpala_1_1SSEUtil.html#a05185ef6da126b67aeac9aa78fbaf19c">impala::SSEUtil::SSE_BITMASK</a></div><div class="ttdeci">static const int SSE_BITMASK[CHARS_PER_128_BIT_REGISTER]</div><div class="ttdoc">Precomputed mask values up to 16 bits. </div><div class="ttdef"><b>Definition:</b> <a href="sse-util_8h_source.html#l00048">sse-util.h:48</a></div></div> | 
|  | <div class="ttc" id="classimpala_1_1DelimitedTextParser_html_a3b47697ec0f5ee137f48b4b40ffbef06"><div class="ttname"><a href="classimpala_1_1DelimitedTextParser.html#a3b47697ec0f5ee137f48b4b40ffbef06">impala::DelimitedTextParser::low_mask_</a></div><div class="ttdeci">uint16_t low_mask_[16]</div><div class="ttdoc">Precomputed masks to process escape characters. </div><div class="ttdef"><b>Definition:</b> <a href="delimited-text-parser_8h_source.html#l00197">delimited-text-parser.h:197</a></div></div> | 
|  | <div class="ttc" id="classimpala_1_1DelimitedTextParser_html_af57576143f76df3152dc58b34cc2aee5"><div class="ttname"><a href="classimpala_1_1DelimitedTextParser.html#af57576143f76df3152dc58b34cc2aee5">impala::DelimitedTextParser::xmm_delim_search_</a></div><div class="ttdeci">__m128i xmm_delim_search_</div><div class="ttdoc">SSE(xmm) register containing the delimiter search character. </div><div class="ttdef"><b>Definition:</b> <a href="delimited-text-parser_8h_source.html#l00157">delimited-text-parser.h:157</a></div></div> | 
|  | <div class="ttc" id="classimpala_1_1DelimitedTextParser_html_a0dc08dae91fdf873d66e546019e07395"><div class="ttname"><a href="classimpala_1_1DelimitedTextParser.html#a0dc08dae91fdf873d66e546019e07395">impala::DelimitedTextParser::DelimitedTextParser</a></div><div class="ttdeci">DelimitedTextParser(int num_cols, int num_partition_keys, const bool *is_materialized_col, char tuple_delim, char field_delim_= '\0', char collection_item_delim= '^', char escape_char= '\0')</div><div class="ttdoc">num_cols is the total number of columns including partition keys. </div><div class="ttdef"><b>Definition:</b> <a href="delimited-text-parser_8cc_source.html#l00024">delimited-text-parser.cc:24</a></div></div> | 
|  | <div class="ttc" id="structimpala_1_1FieldLocation_html"><div class="ttname"><a href="structimpala_1_1FieldLocation.html">impala::FieldLocation</a></div><div class="ttdef"><b>Definition:</b> <a href="hdfs-scanner_8h_source.html#l00052">hdfs-scanner.h:52</a></div></div> | 
|  | <div class="ttc" id="classimpala_1_1DelimitedTextParser_html_a5e6f5a82b0c51692fbc51b428597d0d4"><div class="ttname"><a href="classimpala_1_1DelimitedTextParser.html#a5e6f5a82b0c51692fbc51b428597d0d4">impala::DelimitedTextParser::tuple_delim_</a></div><div class="ttdeci">char tuple_delim_</div><div class="ttdoc">Character delimiting tuples. </div><div class="ttdef"><b>Definition:</b> <a href="delimited-text-parser_8h_source.html#l00178">delimited-text-parser.h:178</a></div></div> | 
|  | <div class="ttc" id="hdfs-scanner_8h_html"><div class="ttname"><a href="hdfs-scanner_8h.html">hdfs-scanner.h</a></div></div> | 
|  | <div class="ttc" id="classimpala_1_1DelimitedTextParser_html_ab76d3428a7bb9ad6aa1850b80f243d28"><div class="ttname"><a href="classimpala_1_1DelimitedTextParser.html#ab76d3428a7bb9ad6aa1850b80f243d28">impala::DelimitedTextParser::num_delims_</a></div><div class="ttdeci">int num_delims_</div><div class="ttdoc">The number of delimiters contained in xmm_delim_search_, i.e. its length. </div><div class="ttdef"><b>Definition:</b> <a href="delimited-text-parser_8h_source.html#l00160">delimited-text-parser.h:160</a></div></div> | 
|  | <div class="ttc" id="classimpala_1_1DelimitedTextParser_html_a49637d59453e03a3ed19420b0bd65c3a"><div class="ttname"><a href="classimpala_1_1DelimitedTextParser.html#a49637d59453e03a3ed19420b0bd65c3a">impala::DelimitedTextParser::xmm_escape_search_</a></div><div class="ttdeci">__m128i xmm_escape_search_</div><div class="ttdoc">SSE(xmm) register containing the escape search character. </div><div class="ttdef"><b>Definition:</b> <a href="delimited-text-parser_8h_source.html#l00163">delimited-text-parser.h:163</a></div></div> | 
|  | <div class="ttc" id="classimpala_1_1DelimitedTextParser_html_a9083e73358436888ad756c74e216a928"><div class="ttname"><a href="classimpala_1_1DelimitedTextParser.html#a9083e73358436888ad756c74e216a928">impala::DelimitedTextParser::last_char_is_escape_</a></div><div class="ttdeci">bool last_char_is_escape_</div><div class="ttdoc">Whether or not the previous character was the escape character. </div><div class="ttdef"><b>Definition:</b> <a href="delimited-text-parser_8h_source.html#l00185">delimited-text-parser.h:185</a></div></div> | 
|  | <div class="ttc" id="classimpala_1_1DelimitedTextParser_html_a536f4958ff143714c86aa36f9fd0eafc"><div class="ttname"><a href="classimpala_1_1DelimitedTextParser.html#a536f4958ff143714c86aa36f9fd0eafc">impala::DelimitedTextParser::collection_item_delim_</a></div><div class="ttdeci">char collection_item_delim_</div><div class="ttdoc">Character delimiting collection items (to become slots). </div><div class="ttdef"><b>Definition:</b> <a href="delimited-text-parser_8h_source.html#l00175">delimited-text-parser.h:175</a></div></div> | 
|  | <div class="ttc" id="namespaceimpala_1_1SSEUtil_html_a6dcf118705dfd9d6f4a1e3e339431d2b"><div class="ttname"><a href="namespaceimpala_1_1SSEUtil.html#a6dcf118705dfd9d6f4a1e3e339431d2b">impala::SSEUtil::STRCHR_MODE</a></div><div class="ttdeci">static const int STRCHR_MODE</div><div class="ttdef"><b>Definition:</b> <a href="sse-util_8h_source.html#l00040">sse-util.h:40</a></div></div> | 
|  | <div class="ttc" id="classimpala_1_1DelimitedTextParser_html_a0936a25431098faa81f5ed29ca9a0dd0"><div class="ttname"><a href="classimpala_1_1DelimitedTextParser.html#a0936a25431098faa81f5ed29ca9a0dd0">impala::DelimitedTextParser::xmm_tuple_search_</a></div><div class="ttdeci">__m128i xmm_tuple_search_</div><div class="ttdoc">SSE(xmm) register containing the tuple search character. </div><div class="ttdef"><b>Definition:</b> <a href="delimited-text-parser_8h_source.html#l00154">delimited-text-parser.h:154</a></div></div> | 
|  | <div class="ttc" id="classimpala_1_1DelimitedTextParser_html_ae249b2c21125183c7d6144a0286ac9ef"><div class="ttname"><a href="classimpala_1_1DelimitedTextParser.html#ae249b2c21125183c7d6144a0286ac9ef">impala::DelimitedTextParser::escape_char_</a></div><div class="ttdeci">char escape_char_</div><div class="ttdoc">Escape character. Only used if process_escapes_ is true. </div><div class="ttdef"><b>Definition:</b> <a href="delimited-text-parser_8h_source.html#l00172">delimited-text-parser.h:172</a></div></div> | 
|  | <div class="ttc" id="classimpala_1_1Status_html"><div class="ttname"><a href="classimpala_1_1Status.html">impala::Status</a></div><div class="ttdef"><b>Definition:</b> <a href="status_8h_source.html#l00081">status.h:81</a></div></div> | 
|  | <div class="ttc" id="classimpala_1_1DelimitedTextParser_html_a7dbdea45da5c530f066969ed5dbe8f55"><div class="ttname"><a href="classimpala_1_1DelimitedTextParser.html#a7dbdea45da5c530f066969ed5dbe8f55">impala::DelimitedTextParser::high_mask_</a></div><div class="ttdeci">uint16_t high_mask_[16]</div><div class="ttdef"><b>Definition:</b> <a href="delimited-text-parser_8h_source.html#l00198">delimited-text-parser.h:198</a></div></div> | 
|  | <div class="ttc" id="classimpala_1_1DelimitedTextParser_html_a46a04d3e77bd8430cb14647922d0da97"><div class="ttname"><a href="classimpala_1_1DelimitedTextParser.html#a46a04d3e77bd8430cb14647922d0da97">impala::DelimitedTextParser::FindFirstInstance</a></div><div class="ttdeci">int FindFirstInstance(const char *buffer, int len)</div><div class="ttdef"><b>Definition:</b> <a href="delimited-text-parser_8cc_source.html#l00194">delimited-text-parser.cc:194</a></div></div> | 
|  | <div class="ttc" id="classimpala_1_1CpuInfo_html_a0cf1356c27b33ca4d428df026209e6fd"><div class="ttname"><a href="classimpala_1_1CpuInfo.html#a0cf1356c27b33ca4d428df026209e6fd">impala::CpuInfo::SSE4_2</a></div><div class="ttdeci">static const int64_t SSE4_2</div><div class="ttdef"><b>Definition:</b> <a href="cpu-info_8h_source.html#l00034">cpu-info.h:34</a></div></div> | 
|  | <div class="ttc" id="classimpala_1_1DelimitedTextParser_html_a3d1863cc77840f2210b18b2856bdd079"><div class="ttname"><a href="classimpala_1_1DelimitedTextParser.html#a3d1863cc77840f2210b18b2856bdd079">impala::DelimitedTextParser::field_delim_</a></div><div class="ttdeci">char field_delim_</div><div class="ttdoc">Character delimiting fields (to become slots). </div><div class="ttdef"><b>Definition:</b> <a href="delimited-text-parser_8h_source.html#l00166">delimited-text-parser.h:166</a></div></div> | 
|  | <div class="ttc" id="classimpala_1_1DelimitedTextParser_html_a5c0e2f5d09e4871280dbfd3bdf823718"><div class="ttname"><a href="classimpala_1_1DelimitedTextParser.html#a5c0e2f5d09e4871280dbfd3bdf823718">impala::DelimitedTextParser::ParseFieldLocations</a></div><div class="ttdeci">Status ParseFieldLocations(int max_tuples, int64_t remaining_len, char **byte_buffer_ptr, char **row_end_locations, FieldLocation *field_locations, int *num_tuples, int *num_fields, char **next_column_start)</div><div class="ttdef"><b>Definition:</b> <a href="delimited-text-parser_8cc_source.html#l00098">delimited-text-parser.cc:98</a></div></div> | 
|  | <div class="ttc" id="delimited-text-parser_8inline_8h_html"><div class="ttname"><a href="delimited-text-parser_8inline_8h.html">delimited-text-parser.inline.h</a></div></div> | 
|  | <div class="ttc" id="classimpala_1_1DelimitedTextParser_html_acacd7799b6a245c30ee25dcb34ee9810"><div class="ttname"><a href="classimpala_1_1DelimitedTextParser.html#acacd7799b6a245c30ee25dcb34ee9810">impala::DelimitedTextParser::current_column_has_escape_</a></div><div class="ttdeci">bool current_column_has_escape_</div><div class="ttdef"><b>Definition:</b> <a href="delimited-text-parser_8h_source.html#l00182">delimited-text-parser.h:182</a></div></div> | 
|  | <div class="ttc" id="classimpala_1_1DelimitedTextParser_html_a90b891102dc9bc8e5465831ae382a5cb"><div class="ttname"><a href="classimpala_1_1DelimitedTextParser.html#a90b891102dc9bc8e5465831ae382a5cb">impala::DelimitedTextParser::process_escapes_</a></div><div class="ttdeci">bool process_escapes_</div><div class="ttdoc">True if this parser should handle escape characters. </div><div class="ttdef"><b>Definition:</b> <a href="delimited-text-parser_8h_source.html#l00169">delimited-text-parser.h:169</a></div></div> | 
|  | <div class="ttc" id="classimpala_1_1Status_html_a580565665ea944eb64f3f495b1bee1e0"><div class="ttname"><a href="classimpala_1_1Status.html#a580565665ea944eb64f3f495b1bee1e0">impala::Status::OK</a></div><div class="ttdeci">static const Status OK</div><div class="ttdef"><b>Definition:</b> <a href="status_8h_source.html#l00087">status.h:87</a></div></div> | 
|  | <div class="ttc" id="classimpala_1_1DelimitedTextParser_html_a163201ab3b9a50974f1fcd1b0fb9d3b5"><div class="ttname"><a href="classimpala_1_1DelimitedTextParser.html#a163201ab3b9a50974f1fcd1b0fb9d3b5">impala::DelimitedTextParser::unfinished_tuple_</a></div><div class="ttdeci">bool unfinished_tuple_</div><div class="ttdoc">True if the last tuple is unfinished (not ended with tuple delimiter). </div><div class="ttdef"><b>Definition:</b> <a href="delimited-text-parser_8h_source.html#l00214">delimited-text-parser.h:214</a></div></div> | 
|  | <div class="ttc" id="namespaceimpala_html_ad9dc935408c04dc3eb969eb8791cadda"><div class="ttname"><a href="namespaceimpala.html#ad9dc935408c04dc3eb969eb8791cadda">impala::SSE4_cmpestrm</a></div><div class="ttdeci">static SSE_ALWAYS_INLINE __m128i SSE4_cmpestrm(__m128i str1, int len1, __m128i str2, int len2, const int mode)</div><div class="ttdef"><b>Definition:</b> <a href="sse-util_8h_source.html#l00089">sse-util.h:89</a></div></div> | 
|  | <div class="ttc" id="names_8h_html"><div class="ttname"><a href="names_8h.html">names.h</a></div></div> | 
|  | <div class="ttc" id="classimpala_1_1DelimitedTextParser_html_af1b586109f27c8284758f7c99151b93b"><div class="ttname"><a href="classimpala_1_1DelimitedTextParser.html#af1b586109f27c8284758f7c99151b93b">impala::DelimitedTextParser::ParserReset</a></div><div class="ttdeci">void ParserReset()</div><div class="ttdoc">Called to initialize parser at beginning of scan range. </div><div class="ttdef"><b>Definition:</b> <a href="delimited-text-parser_8cc_source.html#l00090">delimited-text-parser.cc:90</a></div></div> | 
|  | <div class="ttc" id="classimpala_1_1DelimitedTextParser_html_a893aaa8252b433080c1b0415298c1ba2"><div class="ttname"><a href="classimpala_1_1DelimitedTextParser.html#a893aaa8252b433080c1b0415298c1ba2">impala::DelimitedTextParser::last_row_delim_offset_</a></div><div class="ttdeci">int32_t last_row_delim_offset_</div><div class="ttdef"><b>Definition:</b> <a href="delimited-text-parser_8h_source.html#l00194">delimited-text-parser.h:194</a></div></div> | 
|  | <div class="ttc" id="classimpala_1_1CpuInfo_html_a251ae7245ccb0d678601bb6d8d6fb63a"><div class="ttname"><a href="classimpala_1_1CpuInfo.html#a251ae7245ccb0d678601bb6d8d6fb63a">impala::CpuInfo::IsSupported</a></div><div class="ttdeci">static bool IsSupported(long flag)</div><div class="ttdoc">Returns whether of not the cpu supports this flag. </div><div class="ttdef"><b>Definition:</b> <a href="cpu-info_8h_source.html#l00058">cpu-info.h:58</a></div></div> | 
|  | <div class="ttc" id="classimpala_1_1DelimitedTextParser_html_a7dec5b1a3046f87e59b491f84f0f69fe"><div class="ttname"><a href="classimpala_1_1DelimitedTextParser.html#a7dec5b1a3046f87e59b491f84f0f69fe">impala::DelimitedTextParser::column_idx_</a></div><div class="ttdeci">int column_idx_</div><div class="ttdoc">Index to keep track of the current column in the current file. </div><div class="ttdef"><b>Definition:</b> <a href="delimited-text-parser_8h_source.html#l00211">delimited-text-parser.h:211</a></div></div> | 
|  | <div class="ttc" id="classimpala_1_1DelimitedTextParser_html_a474d30148a664e0398635f46151be2a3"><div class="ttname"><a href="classimpala_1_1DelimitedTextParser.html#a474d30148a664e0398635f46151be2a3">impala::DelimitedTextParser::num_partition_keys_</a></div><div class="ttdeci">int num_partition_keys_</div><div class="ttdoc">Number of partition columns in the table. </div><div class="ttdef"><b>Definition:</b> <a href="delimited-text-parser_8h_source.html#l00204">delimited-text-parser.h:204</a></div></div> | 
|  | <div class="ttc" id="cpu-info_8h_html"><div class="ttname"><a href="cpu-info_8h.html">cpu-info.h</a></div></div> | 
|  | <div class="ttc" id="namespaceimpala_1_1SSEUtil_html_ad5d1b2f68ee72d2002ebdbf58177a944"><div class="ttname"><a href="namespaceimpala_1_1SSEUtil.html#ad5d1b2f68ee72d2002ebdbf58177a944">impala::SSEUtil::CHARS_PER_128_BIT_REGISTER</a></div><div class="ttdeci">static const int CHARS_PER_128_BIT_REGISTER</div><div class="ttdef"><b>Definition:</b> <a href="sse-util_8h_source.html#l00028">sse-util.h:28</a></div></div> | 
|  | </div><!-- fragment --></div><!-- contents --> | 
|  | </div><!-- doc-content --> | 
|  | <!-- start footer part --> | 
|  | <div id="nav-path" class="navpath"><!-- id is needed for treeview function! --> | 
|  | <ul> | 
|  | <li class="navelem"><a class="el" href="dir_e5d120be6b5e8a44336cbfd013b25604.html">be</a></li><li class="navelem"><a class="el" href="dir_68cf7cafb51a962d5bc4848b83cab0de.html">src</a></li><li class="navelem"><a class="el" href="dir_479336c0a15f2c0737bcafcf969f884c.html">exec</a></li><li class="navelem"><a class="el" href="delimited-text-parser_8cc.html">delimited-text-parser.cc</a></li> | 
|  | <li class="footer">Generated on Thu May 7 2015 16:10:35 for Impala by | 
|  | <a href="http://www.doxygen.org/index.html"> | 
|  | <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.6 </li> | 
|  | </ul> | 
|  | </div> | 
|  | </body> | 
|  | </html> |