{"id":1325,"date":"2023-03-19T08:35:45","date_gmt":"2023-03-19T00:35:45","guid":{"rendered":"http:\/\/viplao.com\/?p=1325"},"modified":"2023-03-19T08:36:59","modified_gmt":"2023-03-19T00:36:59","slug":"flink-sql-%e7%ba%a6%e4%bc%9a-calcite","status":"publish","type":"post","link":"http:\/\/viplao.com\/index.php\/2023\/03\/19\/flink-sql-%e7%ba%a6%e4%bc%9a-calcite\/","title":{"rendered":"\u3010\u8fd0\u7ef4\u5de5\u5177\u3011Flink SQL\u00a0\u5b9e\u8df56 flink sql \u7ea6\u4f1a calcite"},"content":{"rendered":"\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_71 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">\u6587\u7ae0\u76ee\u5f55<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 eztoc-toggle-hide-by-default' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"http:\/\/viplao.com\/index.php\/2023\/03\/19\/flink-sql-%e7%ba%a6%e4%bc%9a-calcite\/#1%E5%BA%8F%E7%AF%87-%E6%9C%AC%E6%96%87%E7%BB%93%E6%9E%84\" title=\"1.\u5e8f\u7bc7-\u672c\u6587\u7ed3\u6784\">1.\u5e8f\u7bc7-\u672c\u6587\u7ed3\u6784<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"http:\/\/viplao.com\/index.php\/2023\/03\/19\/flink-sql-%e7%ba%a6%e4%bc%9a-calcite\/#2%E8%83%8C%E6%99%AF%E7%AF%87-%E4%B8%80%E6%9D%A1_flink_sql_%E7%9A%84%E6%89%A7%E8%A1%8C%E8%BF%87%E7%A8%8B\" title=\"2.\u80cc\u666f\u7bc7-\u4e00\u6761 flink sql \u7684\u6267\u884c\u8fc7\u7a0b\">2.\u80cc\u666f\u7bc7-\u4e00\u6761 flink sql \u7684\u6267\u884c\u8fc7\u7a0b<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"http:\/\/viplao.com\/index.php\/2023\/03\/19\/flink-sql-%e7%ba%a6%e4%bc%9a-calcite\/#21%E5%85%88%E5%8F%91%E6%8C%A5%E8%87%AA%E5%B7%B1%E7%9A%84%E6%83%B3%E8%B1%A1%E5%8A%9B\" title=\"2.1.\u5148\u53d1\u6325\u81ea\u5df1\u7684\u60f3\u8c61\u529b\">2.1.\u5148\u53d1\u6325\u81ea\u5df1\u7684\u60f3\u8c61\u529b<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"http:\/\/viplao.com\/index.php\/2023\/03\/19\/flink-sql-%e7%ba%a6%e4%bc%9a-calcite\/#22%E7%9C%8B%E7%9C%8B_flink_%E7%9A%84%E5%AE%9E%E7%8E%B0\" title=\"2.2.\u770b\u770b flink \u7684\u5b9e\u73b0\">2.2.\u770b\u770b flink \u7684\u5b9e\u73b0<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"http:\/\/viplao.com\/index.php\/2023\/03\/19\/flink-sql-%e7%ba%a6%e4%bc%9a-calcite\/#3%E7%AE%80%E4%BB%8B%E7%AF%87-calcite_%E5%9C%A8_flink_sql_%E4%B8%AD%E7%9A%84%E8%A7%92%E8%89%B2\" title=\"3.\u7b80\u4ecb\u7bc7-calcite \u5728 flink sql \u4e2d\u7684\u89d2\u8272\">3.\u7b80\u4ecb\u7bc7-calcite \u5728 flink sql \u4e2d\u7684\u89d2\u8272<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"http:\/\/viplao.com\/index.php\/2023\/03\/19\/flink-sql-%e7%ba%a6%e4%bc%9a-calcite\/#31calcite_%E6%98%AF%E5%95%A5%EF%BC%9F\" title=\"3.1.calcite \u662f\u5565\uff1f\">3.1.calcite \u662f\u5565\uff1f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"http:\/\/viplao.com\/index.php\/2023\/03\/19\/flink-sql-%e7%ba%a6%e4%bc%9a-calcite\/#32flink_sql_%E4%B8%BA%E4%BB%80%E4%B9%88%E9%80%89%E6%8B%A9_calcite%EF%BC%9F\" title=\"3.2.flink sql \u4e3a\u4ec0\u4e48\u9009\u62e9 calcite\uff1f\">3.2.flink sql \u4e3a\u4ec0\u4e48\u9009\u62e9 calcite\uff1f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"http:\/\/viplao.com\/index.php\/2023\/03\/19\/flink-sql-%e7%ba%a6%e4%bc%9a-calcite\/#4%E6%A1%88%E4%BE%8B%E7%AF%87-calcite_%E7%9A%84%E8%83%BD%E5%8A%9B%E3%80%81%E6%A1%88%E4%BE%8B\" title=\"4.\u6848\u4f8b\u7bc7-calcite \u7684\u80fd\u529b\u3001\u6848\u4f8b\">4.\u6848\u4f8b\u7bc7-calcite \u7684\u80fd\u529b\u3001\u6848\u4f8b<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"http:\/\/viplao.com\/index.php\/2023\/03\/19\/flink-sql-%e7%ba%a6%e4%bc%9a-calcite\/#41%E5%85%88%E7%94%A8%E7%94%A8_calcite\" title=\"4.1.\u5148\u7528\u7528 calcite\">4.1.\u5148\u7528\u7528 calcite<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"http:\/\/viplao.com\/index.php\/2023\/03\/19\/flink-sql-%e7%ba%a6%e4%bc%9a-calcite\/#42%E5%85%B3%E7%B3%BB%E4%BB%A3%E6%95%B0\" title=\"4.2.\u5173\u7cfb\u4ee3\u6570\">4.2.\u5173\u7cfb\u4ee3\u6570<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"http:\/\/viplao.com\/index.php\/2023\/03\/19\/flink-sql-%e7%ba%a6%e4%bc%9a-calcite\/#421%E5%B8%B8%E7%94%A8%E5%85%B3%E7%B3%BB%E4%BB%A3%E6%95%B0\" title=\"4.2.1.\u5e38\u7528\u5173\u7cfb\u4ee3\u6570\">4.2.1.\u5e38\u7528\u5173\u7cfb\u4ee3\u6570<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"http:\/\/viplao.com\/index.php\/2023\/03\/19\/flink-sql-%e7%ba%a6%e4%bc%9a-calcite\/#422sql_%E4%BC%98%E5%8C%96%E6%94%AF%E6%9F%B1%E4%B9%8B%E5%85%B3%E7%B3%BB%E4%BB%A3%E6%95%B0%E7%AD%89%E4%BB%B7%E5%8F%98%E6%8D%A2\" title=\"4.2.2.sql \u4f18\u5316\u652f\u67f1\u4e4b\u5173\u7cfb\u4ee3\u6570\u7b49\u4ef7\u53d8\u6362\">4.2.2.sql \u4f18\u5316\u652f\u67f1\u4e4b\u5173\u7cfb\u4ee3\u6570\u7b49\u4ef7\u53d8\u6362<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"http:\/\/viplao.com\/index.php\/2023\/03\/19\/flink-sql-%e7%ba%a6%e4%bc%9a-calcite\/#43calcite_%E5%BF%85%E7%9F%A5%E7%9A%84%E5%9F%BA%E7%A1%80_model\" title=\"4.3.calcite \u5fc5\u77e5\u7684\u57fa\u7840 model\">4.3.calcite \u5fc5\u77e5\u7684\u57fa\u7840 model<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"http:\/\/viplao.com\/index.php\/2023\/03\/19\/flink-sql-%e7%ba%a6%e4%bc%9a-calcite\/#44calcite_%E7%9A%84%E5%A4%84%E7%90%86%E6%B5%81%E7%A8%8B%EF%BC%88%E4%BB%A5_flink_sql_%E4%B8%BA%E4%BE%8B%EF%BC%89\" title=\"4.4.calcite \u7684\u5904\u7406\u6d41\u7a0b\uff08\u4ee5 flink sql \u4e3a\u4f8b\uff09\">4.4.calcite \u7684\u5904\u7406\u6d41\u7a0b\uff08\u4ee5 flink sql \u4e3a\u4f8b\uff09<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"http:\/\/viplao.com\/index.php\/2023\/03\/19\/flink-sql-%e7%ba%a6%e4%bc%9a-calcite\/#441flink_sql_demo\" title=\"4.4.1.flink sql demo\">4.4.1.flink sql demo<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"http:\/\/viplao.com\/index.php\/2023\/03\/19\/flink-sql-%e7%ba%a6%e4%bc%9a-calcite\/#442sql_%E8%A7%A3%E6%9E%90%E9%98%B6%E6%AE%B5%EF%BC%88sql_%E2%80%93%3E_SqlNode%EF%BC%89\" title=\"4.4.2.sql \u89e3\u6790\u9636\u6bb5\uff08sql \u2013&gt; SqlNode\uff09\">4.4.2.sql \u89e3\u6790\u9636\u6bb5\uff08sql \u2013&gt; SqlNode\uff09<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-17\" href=\"http:\/\/viplao.com\/index.php\/2023\/03\/19\/flink-sql-%e7%ba%a6%e4%bc%9a-calcite\/#443SqlNode_%E9%AA%8C%E8%AF%81%EF%BC%88SqlNode_%E2%80%93%3E_SqlNode%EF%BC%89\" title=\"4.4.3.SqlNode \u9a8c\u8bc1\uff08SqlNode \u2013&gt; SqlNode\uff09\">4.4.3.SqlNode \u9a8c\u8bc1\uff08SqlNode \u2013&gt; SqlNode\uff09<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-18\" href=\"http:\/\/viplao.com\/index.php\/2023\/03\/19\/flink-sql-%e7%ba%a6%e4%bc%9a-calcite\/#444%E8%AF%AD%E4%B9%89%E5%88%86%E6%9E%90%EF%BC%88SqlNode_%E2%80%93%3E_RelNode%EF%BC%89\" title=\"4.4.4.\u8bed\u4e49\u5206\u6790\uff08SqlNode \u2013&gt; RelNode\uff09\">4.4.4.\u8bed\u4e49\u5206\u6790\uff08SqlNode \u2013&gt; RelNode\uff09<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-19\" href=\"http:\/\/viplao.com\/index.php\/2023\/03\/19\/flink-sql-%e7%ba%a6%e4%bc%9a-calcite\/#445%E4%BC%98%E5%8C%96%E9%98%B6%E6%AE%B5%EF%BC%88RelNode_%E2%80%93%3E_RelNode%EF%BC%89\" title=\"4.4.5.\u4f18\u5316\u9636\u6bb5\uff08RelNode \u2013&gt; RelNode\uff09\">4.4.5.\u4f18\u5316\u9636\u6bb5\uff08RelNode \u2013&gt; RelNode\uff09<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-20\" href=\"http:\/\/viplao.com\/index.php\/2023\/03\/19\/flink-sql-%e7%ba%a6%e4%bc%9a-calcite\/#45calcite_%E6%80%8E%E4%B9%88%E5%81%9A%E5%88%B0%E8%BF%99%E4%B9%88%E9%80%9A%E7%94%A8%EF%BC%9F\" title=\"4.5.calcite \u600e\u4e48\u505a\u5230\u8fd9\u4e48\u901a\u7528\uff1f\">4.5.calcite \u600e\u4e48\u505a\u5230\u8fd9\u4e48\u901a\u7528\uff1f<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-21\" href=\"http:\/\/viplao.com\/index.php\/2023\/03\/19\/flink-sql-%e7%ba%a6%e4%bc%9a-calcite\/#451javacc_%E6%98%AF%E5%95%A5%EF%BC%9F\" title=\"4.5.1.javacc \u662f\u5565\uff1f\">4.5.1.javacc \u662f\u5565\uff1f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-22\" href=\"http:\/\/viplao.com\/index.php\/2023\/03\/19\/flink-sql-%e7%ba%a6%e4%bc%9a-calcite\/#452%E8%B7%91%E8%B7%91_javacc\" title=\"4.5.2.\u8dd1\u8dd1 javacc\">4.5.2.\u8dd1\u8dd1 javacc<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-23\" href=\"http:\/\/viplao.com\/index.php\/2023\/03\/19\/flink-sql-%e7%ba%a6%e4%bc%9a-calcite\/#453fmpp_%E6%98%AF%E5%95%A5%EF%BC%9F\" title=\"4.5.3.fmpp \u662f\u5565\uff1f\">4.5.3.fmpp \u662f\u5565\uff1f<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-24\" href=\"http:\/\/viplao.com\/index.php\/2023\/03\/19\/flink-sql-%e7%ba%a6%e4%bc%9a-calcite\/#5%E5%8E%9F%E7%90%86%E5%89%96%E6%9E%90%E7%AF%87-calcite_%E5%9C%A8_flink_sql_%E4%B8%AD%E5%A4%A7%E5%B1%95%E8%BA%AB%E6%89%8B\" title=\"5.\u539f\u7406\u5256\u6790\u7bc7-calcite \u5728 flink sql \u4e2d\u5927\u5c55\u8eab\u624b\">5.\u539f\u7406\u5256\u6790\u7bc7-calcite \u5728 flink sql \u4e2d\u5927\u5c55\u8eab\u624b<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-25\" href=\"http:\/\/viplao.com\/index.php\/2023\/03\/19\/flink-sql-%e7%ba%a6%e4%bc%9a-calcite\/#51FlinkSqlParserImpl\" title=\"5.1.FlinkSqlParserImpl\">5.1.FlinkSqlParserImpl<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-26\" href=\"http:\/\/viplao.com\/index.php\/2023\/03\/19\/flink-sql-%e7%ba%a6%e4%bc%9a-calcite\/#52FlinkSqlParserImpl_%E7%9A%84%E7%94%9F%E6%88%90\" title=\"5.2.FlinkSqlParserImpl \u7684\u751f\u6210\">5.2.FlinkSqlParserImpl \u7684\u751f\u6210<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-27\" href=\"http:\/\/viplao.com\/index.php\/2023\/03\/19\/flink-sql-%e7%ba%a6%e4%bc%9a-calcite\/#521flink_%E5%BC%95%E5%85%A5_calcite\" title=\"5.2.1.flink \u5f15\u5165 calcite\">5.2.1.flink \u5f15\u5165 calcite<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-28\" href=\"http:\/\/viplao.com\/index.php\/2023\/03\/19\/flink-sql-%e7%ba%a6%e4%bc%9a-calcite\/#522fmpp_%E7%94%9F%E6%88%90_Parserjj\" title=\"5.2.2.fmpp \u751f\u6210 Parser.jj\">5.2.2.fmpp \u751f\u6210 Parser.jj<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-29\" href=\"http:\/\/viplao.com\/index.php\/2023\/03\/19\/flink-sql-%e7%ba%a6%e4%bc%9a-calcite\/#523javacc_%E7%94%9F%E6%88%90_parser\" title=\"5.2.3.javacc \u751f\u6210 parser\">5.2.3.javacc \u751f\u6210 parser<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-30\" href=\"http:\/\/viplao.com\/index.php\/2023\/03\/19\/flink-sql-%e7%ba%a6%e4%bc%9a-calcite\/#524%E7%9C%8B%E7%9C%8B_Parser\" title=\"5.2.4.\u770b\u770b Parser\">5.2.4.\u770b\u770b Parser<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-31\" href=\"http:\/\/viplao.com\/index.php\/2023\/03\/19\/flink-sql-%e7%ba%a6%e4%bc%9a-calcite\/#525blink_planner_%E5%BC%95%E5%85%A5_flink-sql-parser\" title=\"5.2.5.blink planner \u5f15\u5165 flink-sql-parser\">5.2.5.blink planner \u5f15\u5165 flink-sql-parser<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-32\" href=\"http:\/\/viplao.com\/index.php\/2023\/03\/19\/flink-sql-%e7%ba%a6%e4%bc%9a-calcite\/#6%E6%80%BB%E7%BB%93%E4%B8%8E%E5%B1%95%E6%9C%9B%E7%AF%87\" title=\"6.\u603b\u7ed3\u4e0e\u5c55\u671b\u7bc7\">6.\u603b\u7ed3\u4e0e\u5c55\u671b\u7bc7<\/a><\/li><\/ul><\/nav><\/div>\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"1%E5%BA%8F%E7%AF%87-%E6%9C%AC%E6%96%87%E7%BB%93%E6%9E%84\"><\/span>1.\u5e8f\u7bc7-\u672c\u6587\u7ed3\u6784<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>\u672c\u6587\u4e3b\u8981\u4ecb\u7ecd flink sql \u4e0e calcite \u4e4b\u95f4\u7684\u5173\u7cfb\u3002flink sql \u7684\u89e3\u6790\u4e3b\u8981\u4f9d\u8d56 calcite\u3002<\/p>\n\n\n\n<p>\u800c\u535a\u4e3b\u901a\u8fc7\u6b64\u6587\u629b\u7816\u5f15\u7389\u5e2e\u52a9\u5927\u5bb6\u7406\u89e3 flink sql \u5728\u89e3\u6790\u4e2d\u662f\u600e\u6837\u4f9d\u8d56 calcite \u7684\uff0c\u4ee5\u53ca flink sql \u89e3\u6790\u7684\u6d41\u7a0b\uff0csql parser \u76f8\u5173\u5185\u5bb9\u3002\u5e0c\u671b\u5bf9\u5927\u5bb6\u6709\u6240\u5e2e\u52a9\u3002<\/p>\n\n\n\n<p>\u672c\u6587\u901a\u8fc7\u4ee5\u4e0b\u51e0\u8282\u8fdb\u884c\u4ecb\u7ecd\uff0c\u5bf9\u67d0\u4e2a\u7ae0\u8282\u611f\u5174\u8da3\u7684\u53ef\u4ee5\u76f4\u63a5\u5212\u5230\u5bf9\u5e94\u7ae0\u8282\u3002<\/p>\n\n\n\n<ol>\n<li>\u80cc\u666f\u7bc7-\u4e00\u6761 flink sql \u7684\u6267\u884c\u8fc7\u7a0b<br><\/li>\n<\/ol>\n\n\n\n<ul>\n<li>\u53d1\u6325\u81ea\u5df1\u7684\u60f3\u8c61\u529b<\/li>\n\n\n\n<li>\u770b\u770b flink \u7684\u5b9e\u73b0<\/li>\n\n\n\n<li>\u7b80\u4ecb\u7bc7-calcite \u626e\u6f14\u7684\u89d2\u8272<br><\/li>\n\n\n\n<li>calcite \u662f\u5565\uff1f<\/li>\n\n\n\n<li>flink sql \u4e3a\u5565\u9009\u62e9 calcite\uff1f<\/li>\n\n\n\n<li>\u6848\u4f8b\u7bc7-calcite \u7684\u80fd\u529b\u3001\u6848\u4f8b<br><\/li>\n\n\n\n<li>\u5148\u7528\u7528 calcite<\/li>\n\n\n\n<li>\u5173\u7cfb\u4ee3\u6570<\/li>\n\n\n\n<li>calcite \u5fc5\u77e5\u7684\u57fa\u7840 model<\/li>\n\n\n\n<li>calcite \u7684\u5904\u7406\u6d41\u7a0b\uff08\u4ee5 flink sql \u4e3a\u4f8b\uff09<\/li>\n\n\n\n<li>calcite \u600e\u4e48\u505a\u5230\u8fd9\u4e48\u901a\u7528\uff1f<\/li>\n\n\n\n<li>\u539f\u7406\u5256\u6790\u7bc7-calcite \u5728 flink sql \u4e2d\u5927\u5c55\u8eab\u624b<br><\/li>\n\n\n\n<li>FlinkSqlParserImpl<\/li>\n\n\n\n<li>FlinkSqlParserImpl \u7684\u751f\u6210<\/li>\n\n\n\n<li>\u603b\u7ed3\u4e0e\u5c55\u671b\u7bc7<br><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"2%E8%83%8C%E6%99%AF%E7%AF%87-%E4%B8%80%E6%9D%A1_flink_sql_%E7%9A%84%E6%89%A7%E8%A1%8C%E8%BF%87%E7%A8%8B\"><\/span>2.\u80cc\u666f\u7bc7-\u4e00\u6761 flink sql \u7684\u6267\u884c\u8fc7\u7a0b<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>\u672c\u8282\u5148\u7ed9\u5927\u5bb6\u5927\u81f4\u63cf\u8ff0<code>\u4e00\u6761 flink sql \u7684\u6267\u884c\u8fc7\u7a0b<\/code>\uff0c\u4e0d\u4e86\u89e3\u8be6\u7ec6\u5185\u5bb9\u4e0d\u8981\u7d27\uff0c\u4e3b\u8981\u5148\u4e86\u89e3\u6574\u4e2a\u6d41\u7a0b\uff0c\u6709\u4e86\u5168\u5c40\u89c6\u89d2\u4e4b\u540e\uff0c\u540e\u7eed\u4f1a\u8be6\u8ff0\u7ec6\u8282\u3002<\/p>\n\n\n\n<p>\u5728\u4ecb\u7ecd\u4e00\u6761 flink sql \u7684\u6267\u884c\u8fc7\u7a0b\u4e4b\u524d\uff0c\u5148\u6765\u770b\u770b flink datastream \u4efb\u52a1\u7684\u6267\u884c\u8fc7\u7a0b\uff0c\u8fd9\u5bf9\u7406\u89e3\u4e00\u6761 flink sql \u7684\u6267\u884c\u8fc7\u7a0b\u6709\u5f88\u5927\u7684\u5e2e\u52a9\u3002<\/p>\n\n\n\n<ul>\n<li><strong>datastream<\/strong>\uff1adatastream \u5728\u4f7f\u7528\u65f6\u8981\u5728 flink datastream api \u63d0\u4f9b\u7684\u5404\u79cd udf\uff08\u6bd4\u5982 flatmap\uff0ckeyedprocessfunction \u7b49\uff09\u4e2d\u81ea\u5b9a\u4e49\u5904\u7406\u903b\u8f91\uff0c\u5177\u4f53\u7684\u4e1a\u52a1\u6267\u884c\u903b\u8f91\u90fd\u662f\u6572\u4ee3\u7801\u3001 java \u6587\u4ef6\u5199\u7684\uff0c\u7136\u540e\u7f16\u8bd1\u5728 jvm \u4e2d\u6267\u884c\uff0c\u5c31\u548c\u4e00\u4e2a\u666e\u901a\u7684 main \u51fd\u6570\u5e94\u7528\u4e00\u6a21\u4e00\u6837\u7684\u6d41\u7a0b\u3002\u56e0\u4e3a\u4ee3\u7801\u6267\u884c\u903b\u8f91\u90fd\u662f\u81ea\u5df1\u5199\u7684\uff0c\u6240\u4ee5\u8fd9\u4e00\u90e8\u5206\u76f8\u5bf9\u597d\u7406\u89e3\u3002<br><\/li>\n\n\n\n<li><strong>sql<\/strong>\uff1ajava \u7f16\u8bd1\u5668\u4e0d\u80fd\u8bc6\u522b\u548c\u7f16\u8bd1\u4e00\u6761 sql \u8fdb\u884c\u6267\u884c\uff0c\u90a3\u4e48\u4e00\u6761 SQL \u662f\u548b\u6267\u884c\u7684\u5462\uff1f<br><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"21%E5%85%88%E5%8F%91%E6%8C%A5%E8%87%AA%E5%B7%B1%E7%9A%84%E6%83%B3%E8%B1%A1%E5%8A%9B\"><\/span>2.1.\u5148\u53d1\u6325\u81ea\u5df1\u7684\u60f3\u8c61\u529b<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>\u6211\u4eec\u9006\u5411\u601d\u7ef4\u8fdb\u884c\u8003\u8651\uff0c\u5982\u679c\u60f3\u8ba9\u4e00\u6761 flink sql \u6309\u7167\u6211\u4eec\u7684\u9884\u671f\u5728 jvm \u4e2d\u6267\u884c\uff0c\u9700\u8981\u54ea\u4e9b\u8fc7\u7a0b\u3002<\/p>\n\n\n\n<ol>\n<li><strong>\u6574\u4f53\u6765\u8bf4<\/strong>\uff1a\u53c2\u8003 datastream\uff0c\u5982\u679c jvm \u80fd\u6267\u884c datastream java code \u7f16\u8bd1\u540e\u7684 class \u6587\u4ef6\uff0c\u90a3\u4e48\u52a0\u4e00\u4e2a sql \u89e3\u6790\u5c42\uff0c\u80fd\u5c06 sql \u903b\u8f91\u89e3\u6790\u4e3a datastream \u7684\u5404\u79cd\u7b97\u5b50\uff0c\u7136\u540e\u7f16\u8bd1\u6267\u884c\u4e0d\u5c31 vans \u4e86\u3002<\/li>\n\n\n\n<li><strong>sql parser<\/strong>\uff1a\u9996\u5148\u5f97\u6709\u4e00\u4e2a sql parser \u5427\uff0c\u5f97\u5148\u80fd\u8bc6\u522b sql \u8bed\u6cd5\uff0c\u5c06 sql \u8bed\u6cd5\u8f6c\u5316\u4e3a AST\u3001\u5177\u4f53\u7684\u5173\u7cfb\u4ee3\u6570\u3002<\/li>\n\n\n\n<li><strong>\u5173\u7cfb\u4ee3\u6570\u5230 datastream \u7b97\u5b50\u7684\u6620\u5c04<\/strong>\uff1asql \u903b\u8f91\u89e3\u6790\u4e3a datastream\uff0c\u9700\u8981\u6709\u4e00\u4e2a\u89e3\u6790\u7684\u6620\u5c04\u903b\u8f91\u5427\u3002sql \u662f\u57fa\u4e8e\u5173\u7cfb\u4ee3\u6570\u7684\uff0c\u53ef\u4ee5\u7ef4\u62a4\u4e00\u4e2a sql \u4e2d\u7684\u6bcf\u4e2a\u5173\u7cfb\u4ee3\u6570\u5230\u5177\u4f53 datastream \u63a5\u53e3\u7684\u6620\u5c04\u5173\u7cfb\uff0c\u6709\u4e86\u8fd9\u4e9b\u6620\u5c04\u5173\u7cfb\u6211\u4eec\u5c31\u53ef\u4ee5\u5c06 sql \u6620\u5c04\u6210\u4e00\u6bb5\u53ef\u6267\u884c\u7684 datastream \u4ee3\u7801\u3002\u4e3e\u4e2a\u4f8b\u5b50\uff1a\u5176\u53ef\u4ee5\u5c06\uff1a<\/li>\n<\/ol>\n\n\n\n<ul>\n<li>sql select xxx \u89e3\u6790\u4e3a\u7c7b\u4f3c datastream \u4e2d\u7684 map<\/li>\n\n\n\n<li>where xxx \u89e3\u6790\u4e3a filter<\/li>\n\n\n\n<li>group by \u89e3\u6790\u6210 keyby<\/li>\n\n\n\n<li>sum\uff08xx\uff09\uff0ccount\uff08xxx\uff09\u53ef\u4ee5\u89e3\u6790\u4e3a datastream \u4e2d\u7684 aggregate function<\/li>\n\n\n\n<li>etc&#8230;<\/li>\n\n\n\n<li><strong>\u4ee3\u7801\u751f\u6210<\/strong>\uff1a\u6709\u4e86 sql AST\uff0csql \u5230 datasretam \u7b97\u5b50\u7684\u6620\u5c04\u5173\u7cfb\u4e4b\u540e\uff0c\u5c31\u8981\u8fdb\u884c\u5177\u4f53\u7684\u4ee3\u7801\u751f\u6210\u4e86\u3002\u6bd4\u5982\u53bb\u89e3\u6790 sql AST \u4e2d\u5177\u4f53\u54ea\u4e9b\u5b57\u6bb5\u7528\u4f5c where \u903b\u8f91\uff0c\u54ea\u4e9b\u5b57\u6bb5\u7528\u4f5c group by\uff0c\u90fd\u9700\u8981\u751f\u6210\u5bf9\u5e94\u5177\u4f53\u7684 datastream \u4ee3\u7801\u3002<\/li>\n\n\n\n<li><strong>\u8fd0\u884c<\/strong>\uff1a\u7ecf\u8fc7\u4e0a\u8ff0\u6d41\u7a0b\u4e4b\u540e\uff0c\u5c31\u53ef\u4ee5\u5c06\u4e00\u4e2a sql \u7ffb\u8bd1\u6210\u4e00\u4e2a datastream \u4f5c\u4e1a\u4e86\uff0chappy \u7684\u6267\u884c\u3002<\/li>\n<\/ul>\n\n\n\n<p>\u5982\u4e0b\u56fe\u6240\u793a\uff0c\u63cf\u7ed8\u4e86\u4e0a\u8ff0\u903b\u8f91\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic1.zhimg.com\/80\/v2-30d3e4f2234e5cf5fca95f950f6c9428_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>12<\/p>\n\n\n\n<p>\u90a3\u4e48\u8fd9\u4e2a\u548c flink \u5b9e\u9645\u5b9e\u73b0\u6709\u5565\u5f02\u540c\u5462\uff1f<\/p>\n\n\n\n<p>flink \u5927\u81f4\u662f\u8fd9\u6837\u505a\u7684\uff0c\u867d\u5728 flink \u672c\u8eab\u7684\u4e2d\u95f4\u8fd8\u6709\u4e00\u4e9b\u5176\u4ed6\u7684\u6d41\u7a0b\uff0c\u540e\u6765\u7684\u7248\u672c\u4e5f\u4e0d\u662f\u57fa\u4e8e datastream\uff0c\u4f46\u662f\u6574\u4f53\u7684\u5904\u7406\u903b\u8f91\u8fd8\u662f\u548c\u4e0a\u8ff0\u4e00\u81f4\u7684\u3002<\/p>\n\n\n\n<p>\u6240\u4ee5\u4e0d\u4e86\u89e3\u6574\u4f53\u6d41\u7a0b\u7684\u540c\u5b66\u53ef\u4ee5\u5148\u6309\u7167\u4e0a\u8ff0\u6d41\u7a0b\u8fdb\u884c\u7406\u89e3\u3002<\/p>\n\n\n\n<p>\u6309\u7167&nbsp;<code>\u535a\u4e3b\u7684\u8111\u6d1e<\/code>&nbsp;\u6765\u603b\u7ed3\u4e00\u6761 sql \u7684\u4f7f\u547d\u5c31\u662f\uff1a<code>sql -&gt; AST -&gt; codegen(java code) -&gt; \u8ba9\u6211\u4eec run \u8d77\u6765\u597d\u5417<\/code><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"22%E7%9C%8B%E7%9C%8B_flink_%E7%9A%84%E5%AE%9E%E7%8E%B0\"><\/span>2.2.\u770b\u770b flink \u7684\u5b9e\u73b0<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic3.zhimg.com\/80\/v2-2c720783c6dd02bb3b2bb83143d5bc16_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>26<\/p>\n\n\n\n<p>\u4e0a\u9762\u624b\u7ed8\u53ef\u80fd\u770b\u4e0d\u6e05\uff0c\u4e0b\u9762\u8fd9\u5f20\u56fe\u66f4\u6e05\u695a\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic1.zhimg.com\/80\/v2-85c6aecc57524d1c2e839a231c27eb00_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>28<\/p>\n\n\n\n<p>\u6807\u51c6\u7684\u4e00\u6761 flink sql \u8fd0\u884c\u8d77\u6765\u7684\u6d41\u7a0b\u5982\u4e0b\uff1a<\/p>\n\n\n\n<blockquote class=\"wp-block-quote\">\n<p>Notes\uff1a\u521a\u5f00\u59cb\u5bf9\u5176\u4e2d\u7684 SqlNode\uff0cRelNode \u6982\u5ff5\u53ef\u80fd\u6bd4\u8f83\u6a21\u7cca\u3002\u5148\u7406\u89e3\u6574\u4e2a\u6d41\u7a0b\uff0c\u540e\u7eed\u4f1a\u8be6\u7ec6\u4ecb\u7ecd\u8fd9\u4e9b\u6982\u5ff5\u3002<\/p>\n<\/blockquote>\n\n\n\n<ol>\n<li><strong>sql \u89e3\u6790\u9636\u6bb5<\/strong>\uff1acalcite parser \u89e3\u6790\uff08sql -&gt; AST\uff0cAST \u5373 SqlNode Tree\uff09<br><\/li>\n\n\n\n<li><strong>SqlNode \u9a8c\u8bc1\u9636\u6bb5<\/strong>\uff1acalcite validator \u6821\u9a8c\uff08SqlNode -&gt; SqlNode\uff0c\u8bed\u6cd5\u3001\u8868\u8fbe\u5f0f\u3001\u8868\u4fe1\u606f\uff09<br><\/li>\n\n\n\n<li><strong>\u8bed\u4e49\u5206\u6790\u9636\u6bb5<\/strong>\uff1aSqlNode \u8f6c\u6362\u4e3a RelNode\uff0cRelNode \u5373 Logical Plan\uff08SqlNode -&gt; RelNode\uff09<br><\/li>\n\n\n\n<li><strong>\u4f18\u5316\u9636\u6bb5<\/strong>\uff1acalcite optimizer \u4f18\u5316\uff08RelNode -&gt; RelNode\uff0c\u526a\u679d\u3001\u8c13\u8bcd\u4e0b\u63a8\u7b49\uff09<br><\/li>\n\n\n\n<li><strong>\u7269\u7406\u8ba1\u5212\u751f\u6210\u9636\u6bb5<\/strong>\uff1aLogical Plan \u8f6c\u6362\u4e3a Physical Plan\uff08\u7b49\u540c\u4e8e RelNode \u8f6c\u6362\u6210 DataSet\\DataStream API\uff09<br><\/li>\n\n\n\n<li><strong>\u540e\u7eed\u7684\u8fd0\u884c\u903b\u8f91\u4e0e datastream \u4e00\u81f4<\/strong><br><\/li>\n<\/ol>\n\n\n\n<p>\u53ef\u4ee5\u53d1\u73b0&nbsp;<code>flink \u7684\u5b9e\u73b0<\/code>&nbsp;\u6bd4&nbsp;<code>\u535a\u4e3b\u7684\u8111\u6d1e<\/code>&nbsp;\u6574\u4f53\u4e3b\u8981\u6846\u67b6\u4e0a\u9762\u662f\u4e00\u81f4\u7684\u3002\u591a\u51fa\u6765\u7684\u90e8\u5206\u4e3b\u8981\u662f&nbsp;<strong>SqlNode \u9a8c\u8bc1\u9636\u6bb5<\/strong>\uff0c<strong>\u4f18\u5316\u9636\u6bb5<\/strong>\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"3%E7%AE%80%E4%BB%8B%E7%AF%87-calcite_%E5%9C%A8_flink_sql_%E4%B8%AD%E7%9A%84%E8%A7%92%E8%89%B2\"><\/span>3.\u7b80\u4ecb\u7bc7-calcite \u5728 flink sql \u4e2d\u7684\u89d2\u8272<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>\u5927\u81f4\u4e86\u89e3\u4e86&nbsp;<code>\u4e00\u6761 flink sql \u7684\u8fd0\u884c\u6d41\u7a0b<\/code>&nbsp;\u4e4b\u540e\uff0c\u6211\u4eec\u6765\u770b\u770b calcite \u8fd9\u73a9\u610f\u5230\u5e95\u5728 flink \u91cc\u5e72\u4e86\u4e9b\u5565\u3002<\/p>\n\n\n\n<p>\u6839\u636e\u4e0a\u6587\u603b\u7ed3\u6765\u8bf4 calcite \u5728 flink sql \u4e2d\u62c5\u5f53\u4e86&nbsp;<code>sql \u89e3\u6790\u3001\u9a8c\u8bc1\u3001\u4f18\u5316<\/code>\u529f\u80fd\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic1.zhimg.com\/80\/v2-88ba11c90fbebb85c23d6b5b719411a8_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>30<\/p>\n\n\n\n<p>\u770b\u7740 calcite \u5e72\u4e86\u8fd9\u4e48\u591a\u4e8b\uff0c\u90a3 calcite \u662f\u4e2a\u5565\u4e1c\u4e1c\uff0c\u5b83\u7684\u5b9a\u4f4d\u662f\u5565\uff1f<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"31calcite_%E6%98%AF%E5%95%A5%EF%BC%9F\"><\/span>3.1.calcite \u662f\u5565\uff1f<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>calcite \u662f\u4e00\u4e2a\u52a8\u6001\u6570\u636e\u7684\u7ba1\u7406\u6846\u67b6\uff0c\u5b83\u53ef\u4ee5\u7528\u6765\u6784\u5efa\u6570\u636e\u5e93\u7cfb\u7edf\u7684\u4e0d\u540c\u7684\u89e3\u6790\u7684\u6a21\u5757\uff0c\u4f46\u662f\u5b83\u4e0d\u5305\u542b\u6570\u636e\u5b58\u50a8\u6570\u636e\u5904\u7406\u7b49\u529f\u80fd\u3002<\/p>\n\n\n\n<p>calcite \u7684\u76ee\u6807\u662f\u4e00\u79cd\u65b9\u6848\uff0c\u9002\u5e94\u6240\u6709\u7684\u9700\u6c42\u573a\u666f\uff0c\u5e0c\u671b\u80fd\u4e3a\u4e0d\u540c\u8ba1\u7b97\u5e73\u53f0\u548c\u6570\u636e\u6e90\u63d0\u4f9b\u7edf\u4e00\u7684 sql \u89e3\u6790\u5f15\u64ce\uff0c\u4f46\u662f\u5b83\u53ea\u662f\u63d0\u4f9b\u67e5\u8be2\u5f15\u64ce\uff0c\u800c\u6ca1\u6709\u771f\u6b63\u7684\u53bb\u5b58\u50a8\u8fd9\u4e9b\u6570\u636e\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic3.zhimg.com\/80\/v2-6f0f40cea79455fda9d2e74f4b8178ba_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>61<\/p>\n\n\n\n<p>\u4e0b\u56fe\u662f\u76ee\u524d\u4f7f\u7528\u4e86 calcite \u80fd\u529b\u7684\u5176\u4ed6\u7ec4\u4ef6\uff0c\u4e5f\u53ef\u89c1\u5b98\u7f51&nbsp;<a href=\"https:\/\/link.zhihu.com\/?target=https%3A\/\/calcite.apache.org\/docs\/powered_by.html\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/calcite.apache.org\/docs\/powered_by.html<\/a>&nbsp;\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic2.zhimg.com\/80\/v2-47528a42af5218d233ae947cb8f315d1_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>4<\/p>\n\n\n\n<p>\u7b80\u5355\u6765\u8bf4\u7684\u8bdd\uff0c\u53ef\u4ee5\u5148\u7406\u89e3\u4e3a calcite \u5177\u6709\u8fd9\u51e0\u4e2a\u529f\u80fd\uff08\u5f53\u7136\u8fd8\u6709\u5176\u4ed6\u5f88\u725b\u903c\u7684\u529f\u80fd\uff0c\u611f\u5174\u8da3\u53ef\u4ee5\u81ea\u67e5\u5b98\u7f51\uff09\u3002<\/p>\n\n\n\n<ol>\n<li><strong>\u81ea\u5b9a\u4e49 sql \u89e3\u6790\u5668<\/strong>\uff1a\u6bd4\u5982\u8bf4\u6211\u4eec\u65b0\u53d1\u660e\u4e86\u4e00\u4e2a\u5f15\u64ce\uff0c\u7136\u540e\u6211\u4eec\u8981\u5728\u8fd9\u4e2a\u5f15\u64ce\u4e0a\u6765\u521b\u9020\u4e00\u5957\u57fa\u4e8e sql \u7684\u63a5\u53e3\uff0c\u90a3\u4e48\u6211\u4eec\u5c31\u53ef\u4ee5\u4f7f\u7528\u76f4\u63a5 calcite\uff0c\u4e0d\u7528\u81ea\u5df1\u53bb\u5199\u4e00\u5957\u4e13\u95e8\u7684 sql \u7684\u89e3\u6790\u5668\uff0c\u4ee5\u53ca\u6267\u884c\u4ee5\u53ca\u4f18\u5316\u5f15\u64ce\uff0ccalcite \u4eba\u90fd\u6709\u3002<\/li>\n\n\n\n<li><strong>sql parser\uff08extends SqlAbstractParserImpl\uff09<\/strong>\uff1a\u5c06 sql \u7684\u5404\u79cd\u5173\u7cfb\u4ee3\u6570\u89e3\u6790\u4e3a\u5177\u4f53\u7684 AST\uff0c\u8fd9\u4e9b AST \u90fd\u80fd\u5bf9\u5e94\u5230\u5177\u4f53\u7684 java model\uff0c\u5728 java \u7684\u4e16\u754c\u91cc\u9762\uff0c\u5bf9\u8c61\u5f88\u91cd\u8981\uff0c\u6709\u4e86\u8fd9\u4e9b\u5bf9\u8c61\uff08<code>SqlSelect<\/code>\u3001<code>SqlNode<\/code>\uff09\uff0c\u5c31\u53ef\u4ee5\u6839\u636e\u8fd9\u4e9b\u5bf9\u8c61\u505a\u5177\u4f53\u903b\u8f91\u5904\u7406\u4e86\u3002\u4e3e\u4e2a\u4f8b\u5b50\uff0c\u5982\u4e0b\u56fe\uff0c\u4e00\u6761\u7b80\u5355\u7684&nbsp;<code>select c,d from source where a = '6'<\/code>&nbsp;sql\uff0c\u7ecf\u8fc7 calcite \u7684\u89e3\u6790\u4e4b\u540e\uff0c\u5c31\u53ef\u4ee5\u5f97\u5230 AST model\uff08SqlNode\uff09\u3002\u53ef\u4ee5\u770b\u5230\u6709&nbsp;<code>SqlSelect<\/code>\u3001<code>SqlIdentifier<\/code>\u3001<code>SqlIdentifier<\/code>\u3001<code>SqlCharStringLiteral<\/code>\u3002<\/li>\n\n\n\n<li><strong>sql validator\uff08extends SqlValidatorImpl\uff09<\/strong>\uff1a\u6839\u636e\u8bed\u6cd5\u3001\u8868\u8fbe\u5f0f\u3001\u8868\u4fe1\u606f\u8fdb\u884c SqlNode \u6b63\u786e\u6027\u6821\u9a8c\u3002<\/li>\n\n\n\n<li><strong>sql optimizer<\/strong>\uff1a\u526a\u679d\u3001\u8c13\u8bcd\u4e0b\u63a8\u7b49\u4f18\u5316<\/li>\n<\/ol>\n\n\n\n<p>\u4e0a\u9762\u7684\u8fd9\u4e9b\u80fd\u529b\u6574\u4f53\u7ec4\u6210\u5982\u4e0b\u56fe\u6240\u793a\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic1.zhimg.com\/80\/v2-72a409b2c0852f01ce2e232fc0d3c134_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>29<\/p>\n\n\n\n<p>\u5b9e\u9645\u4f7f\u7528 calcite \u89e3\u6790\u4e00\u6761 sql\uff0c\u8dd1\u8d77\u6765\u770b\u770b\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic3.zhimg.com\/80\/v2-2847033038463bbb1ae9047154bfa7fa_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>2<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"32flink_sql_%E4%B8%BA%E4%BB%80%E4%B9%88%E9%80%89%E6%8B%A9_calcite%EF%BC%9F\"><\/span>3.2.flink sql \u4e3a\u4ec0\u4e48\u9009\u62e9 calcite\uff1f<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<ol>\n<li>\u4e0d\u7528\u91cd\u590d\u9020\u8f6e\u5b50\u3002\u6709\u9650\u7684\u7cbe\u529b\u5e94\u8be5\u653e\u5728\u6709\u4ef7\u503c\u7684\u4e8b\u60c5\u4e0a\u3002<\/li>\n\n\n\n<li>calcite \u6709\u9488\u5bf9 stream \u8868\u7684\u89e3\u51b3\u65b9\u6848\u3002\u5177\u4f53\u53ef\u89c1&nbsp;<a href=\"https:\/\/link.zhihu.com\/?target=https%3A\/\/calcite.apache.org\/docs\/stream.html\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/calcite.apache.org\/docs\/stream.html<\/a>\u3002<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"4%E6%A1%88%E4%BE%8B%E7%AF%87-calcite_%E7%9A%84%E8%83%BD%E5%8A%9B%E3%80%81%E6%A1%88%E4%BE%8B\"><\/span>4.\u6848\u4f8b\u7bc7-calcite \u7684\u80fd\u529b\u3001\u6848\u4f8b<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"41%E5%85%88%E7%94%A8%E7%94%A8_calcite\"><\/span>4.1.\u5148\u7528\u7528 calcite<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p><code>\u91cd\u4e2d\u4e4b\u91cd\uff0c\u5728\u4e86\u89e3\u539f\u7406\u4e4b\u524d\uff0c\u5148\u8dd1\u8d77\u6765\u662f\u738b\u9053\uff0c\u4e5f\u4f1a\u5e2e\u52a9\u6211\u4eec\u9010\u6b65\u7406\u89e3\u3002<\/code><\/p>\n\n\n\n<p>\u5b98\u7f51\u5df2\u7ecf\u6709\u4e00\u4e2a csv \u7684\u6848\u4f8b\u4e86\u3002\u611f\u5174\u8da3\u7684\u53ef\u4ee5\u76f4\u8fbe&nbsp;<a href=\"https:\/\/link.zhihu.com\/?target=https%3A\/\/calcite.apache.org\/docs\/tutorial.html\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/calcite.apache.org\/docs\/tutorial.html<\/a>&nbsp;\u3002<\/p>\n\n\n\n<p>\u8dd1\u5b8c\u4e00\u4e2a csv demo\uff0c\u5728\u8be6\u7ec6\u4e86\u89e3 calcite \u4e4b\u524d\u8fd8\u9700\u8981\u4e86\u89e3\u4e0b sql\uff0ccalcite \u7684\u652f\u67f1\uff1a\u5173\u7cfb\u4ee3\u6570\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"42%E5%85%B3%E7%B3%BB%E4%BB%A3%E6%95%B0\"><\/span>4.2.\u5173\u7cfb\u4ee3\u6570<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>sql \u662f\u57fa\u4e8e\u5173\u7cfb\u4ee3\u6570\u7684\u67e5\u8be2\u8bed\u8a00\uff0c\u662f\u5173\u7cfb\u4ee3\u6570\u5728\u5de5\u7a0b\u4e0a\u7684\u4e00\u79cd\u5f88\u597d\u7684\u5b9e\u73b0\u65b9\u6848\u3002\u5728\u5de5\u7a0b\u4e2d\uff0c\u5173\u7cfb\u4ee3\u6570\u96be\u8868\u8fbe\uff0c\u4f46\u662f sql \u5c31\u6613\u4e8e\u7406\u89e3\u3002\u5173\u7cfb\u4ee3\u6570\u548c sql \u7684\u5173\u7cfb\u5982\u4e0b\u3002<\/p>\n\n\n\n<ol>\n<li>\u53ef\u4ee5\u5c06\u4e00\u6761 sql \u89e3\u6790\u4e3a\u4e00\u4e2a\u5173\u7cfb\u4ee3\u6570\u8868\u8fbe\u5f0f\u7684\u7ec4\u5408\u3002\u5728 sql \u4e2d\u7684\u64cd\u4f5c\u90fd\u53ef\u4ee5\u8f6c\u5316\u6210\u5173\u7cfb\u4ee3\u6570\u7684\u8868\u8fbe\u5f0f\u3002<br><\/li>\n\n\n\n<li>sql \u7684\u6267\u884c\u4f18\u5316\uff08\u6240\u6709\u7684\u4f18\u5316\u7684\u524d\u63d0\u90fd\u662f\u4f18\u5316\u524d\u548c\u4f18\u5316\u540e\u6700\u7ec8\u6267\u884c\u7ed3\u679c\u76f8\u540c\uff0c\u5373\u7b49\u4ef7\u4ea4\u6362\uff09\u662f\u57fa\u4e8e\u5173\u7cfb\u4ee3\u6570\u8fd0\u7b97\u7684\u3002<br><\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"421%E5%B8%B8%E7%94%A8%E5%85%B3%E7%B3%BB%E4%BB%A3%E6%95%B0\"><\/span>4.2.1.\u5e38\u7528\u5173\u7cfb\u4ee3\u6570<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p><strong>\u603b\u7ed3\u4e0b\uff0c\u6709\u54ea\u4e9b\u5e38\u7528\u7684\u5173\u7cfb\u4ee3\u6570\uff1a<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic4.zhimg.com\/80\/v2-e6efd325be2d30f70ef08af9b118cbab_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>50<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"422sql_%E4%BC%98%E5%8C%96%E6%94%AF%E6%9F%B1%E4%B9%8B%E5%85%B3%E7%B3%BB%E4%BB%A3%E6%95%B0%E7%AD%89%E4%BB%B7%E5%8F%98%E6%8D%A2\"><\/span>4.2.2.sql \u4f18\u5316\u652f\u67f1\u4e4b\u5173\u7cfb\u4ee3\u6570\u7b49\u4ef7\u53d8\u6362<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>\u5173\u7cfb\u4ee3\u6570\u7b49\u4ef7\u53d8\u6362\u662f calcite optimizer \u7684\u57fa\u7840\u7406\u8bba\u3002<\/p>\n\n\n\n<p>\u4e0b\u9762\u662f\u4e00\u4e9b\u7b49\u4ef7\u53d8\u6362\u7684\u4f8b\u5b50\u3002<\/p>\n\n\n\n<p>1.\u8fde\u63a5\uff08<code>\u22c8<\/code>\uff09\uff0c\u7b1b\u5361\u5c14\u79ef\uff08<code>\u00d7<\/code>\uff09\u7684\u4ea4\u6362\u5f8b<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic3.zhimg.com\/80\/v2-5f068ab253525ee0641b883afe6cfdee_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>51<\/p>\n\n\n\n<p>2.\u8fde\u63a5\uff08<code>\u22c8<\/code>\uff09\uff0c\u7b1b\u5361\u5c14\u79ef\uff08<code>\u00d7<\/code>\uff09\u7684\u7ed3\u5408\u5f8b<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic4.zhimg.com\/80\/v2-747212a093d3378fac39a5d466f63d5f_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>3.\u6295\u5f71\uff08<code>\u03a0<\/code>\uff09\u7684\u4e32\u63a5\u5b9a\u5f8b<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic2.zhimg.com\/80\/v2-05eb5153c0e9fb1453001ef5cdcaf49d_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>4.\u9009\u62e9\uff08<code>\u03c3<\/code>\uff09\u7684\u4e32\u63a5\u5b9a\u5f8b<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic1.zhimg.com\/80\/v2-51ec31244d1df2118952c121cbf998e0_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>5.\u9009\u62e9\uff08<code>\u03c3<\/code>\uff09\u4e0e\u6295\u5f71\uff08<code>\u03a0<\/code>\uff09\u7684\u4ea4\u6362<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic4.zhimg.com\/80\/v2-66221921a6d5d4dc1cec472391ad6f9b_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>6.\u9009\u62e9\uff08<code>\u03c3<\/code>\uff09\u4e0e\u7b1b\u5361\u5c14\u79ef\uff08<code>\u00d7<\/code>\uff09\u7684\u4ea4\u6362<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic3.zhimg.com\/80\/v2-84bfe788db6d74801e1a6dea56daac26_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>7.\u9009\u62e9\uff08<code>\u03c3<\/code>\uff09\u4e0e\u5e76\uff08<code>\u222a<\/code>\uff09\u7684\u4ea4\u6362<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic1.zhimg.com\/80\/v2-b72934e88a2dbc5e218bc0a2f26fc4c8_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>8.\u9009\u62e9\uff08<code>\u03c3<\/code>\uff09\u4e0e\u5dee\uff08<code>-<\/code>\uff09\u7684\u4ea4\u6362<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic3.zhimg.com\/80\/v2-0196290ee952189e7dd017a8dea0e66e_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>9.\u6295\u5f71\uff08<code>\u03a0<\/code>\uff09\u4e0e\u7b1b\u5361\u5c14\u79ef\uff08<code>\u00d7<\/code>\uff09\u7684\u4ea4\u6362<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic4.zhimg.com\/80\/v2-5845e7ca8de729854167fa208fea7c43_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>10.\u6295\u5f71\uff08<code>\u03a0<\/code>\uff09\u4e0e\u5e76\uff08<code>\u222a<\/code>\uff09\u7684\u4ea4\u6362<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic4.zhimg.com\/80\/v2-df1e6cd1abf1f4eaaf98fa0eba59c06f_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p><strong>\u7136\u540e\u770b\u4e00\u4e2a\u57fa\u4e8e\u5173\u7cfb\u4ee3\u6570\u4f18\u5316\u7684\u5b9e\u9645 sql \u6848\u4f8b\uff1a<\/strong><\/p>\n\n\n\n<p>\u6709\u4e09\u4e2a\u5173\u7cfb&nbsp;<code>A\uff08a1,a2,a3,\u2026\uff09<\/code>\u3001<code>B\uff08b1,b2,b3, \u2026 \uff09<\/code>\u3001<code>C\uff08a1,b1,c1,c2, \u2026 \uff09<\/code><\/p>\n\n\n\n<p>\u6709\u4e00\u4e2a\u67e5\u8be2\u8bf7\u6c42\u5982\u4e0b\uff1a<\/p>\n\n\n\n<p><code>SELECT A.a1 FROM A\uff0cB\uff0cC WHERE A.a1 = C.a1 AND B.b1 = C.b1 AND f(c1)<\/code><\/p>\n\n\n\n<p>1.\u9996\u5148\u5c06 sql \u8f6c\u4e3a\u5173\u7cfb\u4ee3\u6570\u7684\u8bed\u6cd5\u6811\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic4.zhimg.com\/80\/v2-0b5d21508c63b1c97c3e1ac168fb33ff_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>36<\/p>\n\n\n\n<p>2.\u4f18\u5316\uff1a\u9009\u62e9\uff08<code>\u03c3<\/code>\uff09\u7684\u4e32\u63a5\u5b9a\u5f8b\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic1.zhimg.com\/80\/v2-51ec31244d1df2118952c121cbf998e0_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>47<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic1.zhimg.com\/80\/v2-dd8f941286e2e86737cb87d4e102cb14_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>37<\/p>\n\n\n\n<p>3.\u4f18\u5316\uff1a\u9009\u62e9\uff08<code>\u03c3<\/code>\uff09\u4e0e\u7b1b\u5361\u5c14\u79ef\uff08<code>\u00d7<\/code>\uff09\u7684\u4ea4\u6362\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic3.zhimg.com\/80\/v2-84bfe788db6d74801e1a6dea56daac26_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>48<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic2.zhimg.com\/80\/v2-4d7455765e5a2de3cbc04a19aaefcf11_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>38<\/p>\n\n\n\n<p>4.\u4f18\u5316\uff1a\u6295\u5f71\uff08<code>\u03c0<\/code>\uff09\u4e0e\u7b1b\u5361\u5c14\u79ef\uff08<code>\u00d7<\/code>\uff09\u7684\u4ea4\u6362\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic4.zhimg.com\/80\/v2-5845e7ca8de729854167fa208fea7c43_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>49<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic1.zhimg.com\/80\/v2-c45a05ca2b6ecebfd253d541e06f6c54_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic1.zhimg.com\/80\/v2-e44e237a90f491879149e4dda8b1dc5c_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic3.zhimg.com\/80\/v2-e0cdf7e1421cedab49c993557557fc2e_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic1.zhimg.com\/80\/v2-5b14150448d09ac1de5446760bc0d528_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic1.zhimg.com\/80\/v2-255033cde369d53b2242fdc9d3662a68_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic1.zhimg.com\/80\/v2-cbb56cd4c2be7647fd695ec9b8f78fb0_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic2.zhimg.com\/80\/v2-228f84e7278296e0a7ceb6ccd72e0875_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>\u5173\u4e8e\u5173\u7cfb\u4ee3\u6570\u6211\u4eec\u5c31\u6709\u4e86\u5927\u81f4\u7684\u4e86\u89e3\u3002<\/p>\n\n\n\n<p>\u9664\u6b64\u4e4b\u5916\uff0c\u5bf9\u4e8e\u66f4\u6df1\u5165\u4e86\u89e3 flink sql\uff0ccalcite \u800c\u8a00\uff0c\u6211\u4eec\u8fd8\u9700\u8981\u4e86\u89e3\u4e00\u4e0b\u5728 calcite \u4ee3\u7801\u4f53\u7cfb\u4e2d\u6709\u54ea\u4e9b\u91cd\u8981 model\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"43calcite_%E5%BF%85%E7%9F%A5%E7%9A%84%E5%9F%BA%E7%A1%80_model\"><\/span>4.3.calcite \u5fc5\u77e5\u7684\u57fa\u7840 model<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>calcite \u4e2d\u6709\u4e24\u4e2a\u6700\u6700\u57fa\u7840\u3001\u91cd\u8981\u7684 model \u5728\u6211\u4eec\u7406\u89e3 flink sql \u89e3\u6790\u6d41\u7a0b\u65f6\u9700\u8981\u77e5\u9053\u7684\u3002<\/p>\n\n\n\n<ol>\n<li><strong>SqlNode<\/strong>\uff1asql \u8f6c\u5316\u800c\u6210\uff0c\u53ef\u4ee5\u7406\u89e3\u4e3a\u76f4\u89c2\u8868\u8fbe sql \u5c42\u6b21\u7ed3\u6784\u7684\u7684 model<\/li>\n\n\n\n<li><strong>RelNode<\/strong>\uff1aSqlNode \u8f6c\u5316\u800c\u6210\uff0c\u53ef\u4ee5\u7406\u89e3\u4e3a\u5c06 SqlNode \u8f6c\u5316\u4e3a\u5173\u7cfb\u4ee3\u6570\uff0c\u8868\u8fbe\u5173\u7cfb\u4ee3\u6570\u5c42\u6b21\u7ed3\u6784\u7684 model<\/li>\n<\/ol>\n\n\n\n<p>\u4e3e\u4e2a\u4f8b\u5b50\u6765\u8bf4\u660e\u4e0b\uff0c\u4e0b\u9762\u8fd9\u6761 flink sql\uff0c\u7ecf\u8fc7\u89e3\u6790\u4e4b\u540e\u7684&nbsp;<strong>SqlNode<\/strong>\uff0c<strong>RelNode<\/strong>&nbsp;\u5982\u4e0b\u56fe\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT\n  sum(part_pv) as pv,\n  window_start\nFROM (\n SELECT\n   count(1) as part_pv,\n   cast(tumble_start(rowtime, INTERVAL '60' SECOND) as bigint) * 1000 as window_start\n FROM\n   source_db.source_table\n GROUP BY\n   tumble(rowtime, INTERVAL '60' SECOND)\n   , mod(id, 1024)\n)\nGROUP BY\n  window_start\n<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic1.zhimg.com\/80\/v2-063188f773c325fea434c47455a7cc88_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>62<\/p>\n\n\n\n<p>\u53ef\u4ee5\u770b\u5230 SqlNode \u5305\u542b\u7684\u5185\u5bb9\u662f sql \u7684\u5c42\u6b21\u7ed3\u6784\uff0c\u5305\u62ec&nbsp;<code>selectList<\/code>\uff0c<code>from<\/code>\uff0c<code>where<\/code>\uff0c<code>group by<\/code>&nbsp;\u7b49\u3002<\/p>\n\n\n\n<p>RelNode \u5305\u542b\u7684\u662f\u5173\u7cfb\u4ee3\u6570\u7684\u5c42\u6b21\u7ed3\u6784\uff0c\u6bcf\u4e00\u5c42\u90fd\u6709\u4e00\u4e2a input \u6765\u627f\u63a5\u3002\u7ed3\u5408\u4e0a\u9762\u4f18\u5316\u6848\u4f8b\u7684\u6811\u72b6\u7ed3\u6784\u4e00\u6837\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic1.zhimg.com\/80\/v2-677bd34a44bb4af41c0c80b49b3789d4_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>63<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"44calcite_%E7%9A%84%E5%A4%84%E7%90%86%E6%B5%81%E7%A8%8B%EF%BC%88%E4%BB%A5_flink_sql_%E4%B8%BA%E4%BE%8B%EF%BC%89\"><\/span>4.4.calcite \u7684\u5904\u7406\u6d41\u7a0b\uff08\u4ee5 flink sql \u4e3a\u4f8b\uff09<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic1.zhimg.com\/80\/v2-72a409b2c0852f01ce2e232fc0d3c134_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>29<\/p>\n\n\n\n<p>\u5982\u4e0a\u56fe\u6240\u793a\uff0c\u6b64\u5904\u6211\u4eec\u7ed3\u5408\u4e0a\u8282\u4ecb\u7ecd\u7684 calcite \u7684 model\uff0c\u4ee5\u53ca flink sql \u7684\u5b9e\u73b0\u6765\u8d70\u4e00\u904d\u5176\u5904\u7406\u6d41\u7a0b\uff1a<\/p>\n\n\n\n<ol>\n<li><strong>sql \u89e3\u6790\u9636\u6bb5\uff08sql \u2013&gt; SqlNode\uff09<\/strong><\/li>\n\n\n\n<li><strong>SqlNode \u9a8c\u8bc1\uff08SqlNode \u2013&gt; SqlNode\uff09<\/strong><\/li>\n\n\n\n<li><strong>\u8bed\u4e49\u5206\u6790\uff08SqlNode \u2013&gt; RelNode\uff09<\/strong><\/li>\n\n\n\n<li><strong>\u4f18\u5316\u9636\u6bb5\uff08RelNode \u2013&gt; RelNode\uff09<\/strong><\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"441flink_sql_demo\"><\/span>4.4.1.flink sql demo<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT\n  sum(part_pv) as pv,\n  window_start\nFROM (\n SELECT\n   count(1) as part_pv,\n   cast(tumble_start(rowtime, INTERVAL '60' SECOND) as bigint) * 1000 as window_start\n FROM\n   source_db.source_table\n GROUP BY\n   tumble(rowtime, INTERVAL '60' SECOND)\n   , mod(id, 1024)\n)\nGROUP BY\n  window_start\n<\/code><\/pre>\n\n\n\n<p>\u5176\u4e2d\u524d\u4e09\u6b65\u89e3\u6790\u548c\u8f6c\u5316\uff0c\u90fd\u5728 \u5728\u6267\u884c&nbsp;<code>TableEnvironment#sqlQuery<\/code>&nbsp;\u8fdb\u884c\u3002<\/p>\n\n\n\n<p>\u6700\u540e\u4e00\u6b65\u4f18\u5316\uff0c\u5728\u6267\u884c sink \u64cd\u4f5c\u65f6\u8fdb\u884c\uff0c\u5373\u5728\u8fd9\u4e2a\u4f8b\u5b50\u4e2d\u662f&nbsp;<code>tEnv.toRetractStream(result, Row.class)<\/code>\u3002<\/p>\n\n\n\n<p>\u6e90\u7801\u516c\u4f17\u53f7\u540e\u53f0\u56de\u590d<strong>flink sql \u77e5\u5176\u6240\u4ee5\u7136\uff08\u516d\uff09| flink sql \u7ea6\u4f1a calcite<\/strong>\u83b7\u53d6\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"442sql_%E8%A7%A3%E6%9E%90%E9%98%B6%E6%AE%B5%EF%BC%88sql_%E2%80%93%3E_SqlNode%EF%BC%89\"><\/span>4.4.2.sql \u89e3\u6790\u9636\u6bb5\uff08sql \u2013&gt; SqlNode\uff09<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>sql \u89e3\u6790\u9636\u6bb5\u4f7f\u7528 Sql Parser \u5c06 sql \u89e3\u6790\u4e3a&nbsp;<code>SqlNode<\/code>\u3002\u8fd9\u4e00\u6b65\u5728\u6267\u884c&nbsp;<code>TableEnvironment#sqlQuery<\/code>&nbsp;\u8fdb\u884c\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic4.zhimg.com\/80\/v2-12ecfe162ed2f37ad3a9d3b10fc68a27_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic2.zhimg.com\/80\/v2-171370458bf11ab61db7703cea1d9d25_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic1.zhimg.com\/80\/v2-7d2e03ed70c7d05dbd5ba9f5ac791ee8_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic3.zhimg.com\/80\/v2-d61f235c66728e255597f8e8284e5376_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>\u53ef\u4ee5\u4ece\u4e0a\u56fe\u770b\u5230 flink sql \u5177\u4f53\u5b9e\u73b0\u7c7b\u662f&nbsp;<code>FlinkSqlParserImpl<\/code>\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic1.zhimg.com\/80\/v2-ce2234f61663349fb6db148a51774f98_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>68<\/p>\n\n\n\n<p>\u5177\u4f53 parse \u5f97\u5230 SqlNode \u5982\u4e0a\u56fe\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"443SqlNode_%E9%AA%8C%E8%AF%81%EF%BC%88SqlNode_%E2%80%93%3E_SqlNode%EF%BC%89\"><\/span>4.4.3.SqlNode \u9a8c\u8bc1\uff08SqlNode \u2013&gt; SqlNode\uff09<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>\u4e0a\u9762\u7684\u7b2c\u4e00\u6b65\u751f\u4ea7\u7684 SqlNode \u5bf9\u8c61\u662f\u4e00\u4e2a\u672a\u7ecf\u9a8c\u8bc1\u7684\uff0c\u8fd9\u4e00\u6b65\u5c31\u662f\u8bed\u6cd5\u68c0\u67e5\u9636\u6bb5\uff0c\u8bed\u6cd5\u68c0\u67e5\u524d\u9700\u8981\u77e5\u9053\u5143\u6570\u636e\u4fe1\u606f\uff0c\u8fd9\u4e2a\u68c0\u67e5\u4f1a\u5305\u62ec\u8868\u540d\u3001\u5b57\u6bb5\u540d\u3001\u51fd\u6570\u540d\u3001\u6570\u636e\u7c7b\u578b\u7684\u68c0\u67e5\u3002\u8fdb\u884c\u8bed\u6cd5\u68c0\u67e5\u7684\u5b9e\u73b0\u5982\u4e0b\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic2.zhimg.com\/80\/v2-efc5b28b38f409de7f24ad797d6f1635_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic4.zhimg.com\/80\/v2-a30428f685820143018cc70a25b34a9b_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic1.zhimg.com\/80\/v2-331353bc1f8c7bd1e673e4671ad29934_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>\u53ef\u4ee5\u4ece\u4e0a\u56fe\u770b\u5230 flink sql \u6821\u9a8c\u5668\u7684\u5177\u4f53\u5b9e\u73b0\u7c7b\u662f&nbsp;<code>FlinkCalciteSqlValidator<\/code>\uff0c\u5176\u4e2d\u5305\u542b\u4e86\u5143\u6570\u636e\u4fe1\u606f\uff0c\u4ece\u800c\u53ef\u4ee5\u8fdb\u884c\u5143\u6570\u636e\u4fe1\u606f\u68c0\u67e5\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"444%E8%AF%AD%E4%B9%89%E5%88%86%E6%9E%90%EF%BC%88SqlNode_%E2%80%93%3E_RelNode%EF%BC%89\"><\/span>4.4.4.\u8bed\u4e49\u5206\u6790\uff08SqlNode \u2013&gt; RelNode\uff09<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>\u8fd9\u4e00\u6b65\u5c31\u662f\u5c06 SqlNode \u8f6c\u6362\u6210 RelNode\uff0c\u4e5f\u5c31\u662f\u751f\u6210\u76f8\u5e94\u7684\u5173\u7cfb\u4ee3\u6570\u5c42\u9762\u7684\u903b\u8f91\uff08\u8fd9\u91cc\u4e00\u822c\u90fd\u53eb\u505a\u903b\u8f91\u8ba1\u5212\uff1aLogical Plan\uff09\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic4.zhimg.com\/80\/v2-ae594fb4b8704e13bba65520bb93cdcb_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic3.zhimg.com\/80\/v2-02488f4fc74b819d0b2d12e2d28c2082_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic4.zhimg.com\/80\/v2-4ca179cbf5ae9792f790adb25309f5c3_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"445%E4%BC%98%E5%8C%96%E9%98%B6%E6%AE%B5%EF%BC%88RelNode_%E2%80%93%3E_RelNode%EF%BC%89\"><\/span>4.4.5.\u4f18\u5316\u9636\u6bb5\uff08RelNode \u2013&gt; RelNode\uff09<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>\u8fd9\u4e00\u6b65\u5c31\u662f\u4f18\u5316\u9636\u6bb5\u3002\u8be6\u7ec6\u5185\u5bb9\u53ef\u4ee5\u81ea\u5df1 debug \u4ee3\u7801\u67e5\u770b\uff0c\u6b64\u5904\u4e0d\u8d58\u8ff0\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic2.zhimg.com\/80\/v2-952dbc244c659c442d0829c2908e8d09_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic4.zhimg.com\/80\/v2-285130b818d7d03b5974ede7f011061b_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"45calcite_%E6%80%8E%E4%B9%88%E5%81%9A%E5%88%B0%E8%BF%99%E4%B9%88%E9%80%9A%E7%94%A8%EF%BC%9F\"><\/span>4.5.calcite \u600e\u4e48\u505a\u5230\u8fd9\u4e48\u901a\u7528\uff1f<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>\u6b64\u5904\u4ee5 calcite parser \u4e3e\u4f8b\u8bf4\u660e\uff0c\u5176\u6a21\u5757\u4e3a\u4ec0\u4e48\u8fd9\u901a\u7528\uff1f\u5176\u4ed6\u7684\u6a21\u5757\u90fd\u662f\u7c7b\u4f3c\u7684\u65b9\u5f0f\u3002<\/p>\n\n\n\n<p><code>\u5148\u8bf4\u7ed3\u8bba<\/code>\uff1a\u56e0\u4e3a calcite parser \u6a21\u5757\u63d0\u4f9b\u4e86\u63a5\u53e3\uff0c\u5177\u4f53\u7684 parse \u903b\u8f91\u3001\u89c4\u5219\u662f\u53ef\u4ee5\u6839\u636e\u7528\u6237\u81ea\u5b9a\u4e49\u8fdb\u884c\u914d\u7f6e\u7684\u3002\u5927\u5bb6\u53ef\u4ee5\u770b\u4e0b\u56fe\uff0c\u535a\u4e3b\u753b\u51fa\u4e86\u4e00\u5f20\u56fe\u8fdb\u884c\u8be6\u8ff0\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic2.zhimg.com\/80\/v2-4f137b902900bf9d68ef820981a3229d_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>5<\/p>\n\n\n\n<p>\u5982\u4e0a\u56fe\uff0c\u5f15\u64ce sql \u89e3\u6790\u5668\u7684\u751f\u6210\u662f\u6709\u4e00\u4e2a\u8f93\u5165\u7684\uff0c\u5c31\u662f&nbsp;<code>\u7528\u6237\u81ea\u5b9a\u4e49\u8bed\u6cd5\u5206\u6790\u89c4\u5219\u53d8\u91cf<\/code>\uff0c\u5177\u4f53\u5f15\u64ce\u7684 sql \u89e3\u6790\u5668\u5176\u5b9e\u4e5f\u662f\u6839\u636e\u7528\u6237\u81ea\u5b9a\u4e49\u7684&nbsp;<code>\u89e3\u6790\u89c4\u5219<\/code>&nbsp;\u53bb\u751f\u6210\u7684&nbsp;<code>\u89e3\u6790\u5668<\/code>\u3002\u5176&nbsp;<code>\u89e3\u6790\u5668<\/code>&nbsp;\u7684\u52a8\u6001\u751f\u6210\u4f9d\u8d56&nbsp;<code>javacc<\/code>&nbsp;\u8fd9\u6837\u7684\u7ec4\u4ef6\u3002calcite \u63d0\u4f9b\u7684\u662f\u7edf\u4e00\u7684 sql AST \u6a21\u578b\u3001\u4f18\u5316\u6a21\u578b\u63a5\u53e3\u7b49\uff0c\u800c\u5177\u4f53\u7684\u89e3\u6790\u5b9e\u73b0\u4ea4\u7ed9\u4e86\u7528\u6237\u81ea\u5df1\u53bb\u51b3\u5b9a\u3002<\/p>\n\n\n\n<p><code>javacc<\/code>&nbsp;\u4f1a\u6839\u636e calcite \u4e2d\u5b9a\u4e49\u7684&nbsp;<code>Parser.jj<\/code>&nbsp;\u6587\u4ef6\uff0c\u751f\u6210\u5177\u4f53\u7684 sql parser \u4ee3\u7801\uff08\u5982\u4e0a\u56fe\uff09\uff0c\u8fd9\u4e2a sql parser \u7684\u80fd\u529b\u5c31\u662f\u5c06 sql \u8f6c\u6362\u6210 AST \uff08SqlNode\uff09\u3002\u5173\u4e8e calcite \u80fd\u529b\u7684\u66f4\u8be6\u7ec6\u5185\u5bb9\u89c1&nbsp;<a href=\"https:\/\/link.zhihu.com\/?target=https%3A\/\/matt33.com\/2019\/03\/07\/apache-calcite-process-flow\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/matt33.com\/2019\/03\/07\/apache-calcite-process-flow\/<\/a>&nbsp;\u3002<\/p>\n\n\n\n<p>\u4e0a\u56fe\u6d89\u53ca\u5230\u7684\u6587\u4ef6\u5927\u5bb6\u53ef\u4ee5\u4e0b\u8f7d&nbsp;<code>calcite \u6e90\u7801<\/code>&nbsp;<a href=\"https:\/\/link.zhihu.com\/?target=https%3A\/\/github.com\/apache\/calcite.git\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/apache\/calcite.git<\/a>&nbsp;\u4e4b\u540e\uff0c\u5207\u6362\u5230&nbsp;<code>core<\/code>&nbsp;module \u4e4b\u540e\u67e5\u770b\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic1.zhimg.com\/80\/v2-92d4b7ebfc24e1774e7ba14a5fa1c3a8_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>31<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"451javacc_%E6%98%AF%E5%95%A5%EF%BC%9F\"><\/span>4.5.1.javacc \u662f\u5565\uff1f<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p><code>javacc<\/code>&nbsp;\u662f\u4e00\u4e2a\u7528 java \u5f00\u53d1\u7684\u6700\u53d7\u6b22\u8fce\u7684\u8bed\u6cd5\u5206\u6790\u751f\u6210\u5668\u3002\u8fd9\u4e2a\u5206\u6790\u751f\u6210\u5668\u5de5\u5177\u53ef\u4ee5\u8bfb\u53d6\u4e0a\u4e0b\u6587\u65e0\u5173\u4e14\u6709\u7740\u7279\u6b8a\u610f\u4e49\u7684\u8bed\u6cd5\u5e76\u628a\u5b83\u8f6c\u6362\u6210\u53ef\u4ee5\u8bc6\u522b\u4e14\u5339\u914d\u8be5\u8bed\u6cd5\u7684 java \u7a0b\u5e8f\u3002\u5b83\u662f 100% \u7684\u7eaf java \u4ee3\u7801\uff0c\u53ef\u4ee5\u5728\u591a\u79cd\u5e73\u53f0\u4e0a\u8fd0\u884c\u3002<\/p>\n\n\n\n<p>\u7b80\u5355\u89e3\u91ca&nbsp;<code>javacc<\/code>&nbsp;\u5c31\u662f\u5b83\u662f\u4e00\u4e2a\u901a\u7528\u7684\u8bed\u6cd5\u5206\u6790\u751f\u4ea7\u5668\uff0c\u7528\u6237\u53ef\u4ee5\u4f7f\u7528&nbsp;<code>javacc<\/code>&nbsp;\u4efb\u610f\u5b9a\u4e49\u4e00\u5957 DSL \u53ca\u89e3\u6790\u5668\u3002<\/p>\n\n\n\n<p>\u4e3e\u4e2a\u4f8b\u5b50\uff0c\u5982\u679c\u54ea\u5929\u4f60\u89c9\u5f97 sql \u4e5f\u4e0d\u591f\u7b80\u6d01\u901a\u7528\uff0c\u4f60\u53ef\u4ee5\u4f7f\u7528&nbsp;<code>javacc<\/code>&nbsp;\u81ea\u5df1\u5b9a\u4e49\u4e00\u5957\u66f4\u7b80\u6d01\u7684&nbsp;<code>user-define-ql<\/code>\u3002\u7136\u540e\u4f7f\u7528 javacc \u4f5c\u4e3a\u4f60\u7684&nbsp;<code>user-define-ql<\/code>&nbsp;\u7684\u89e3\u6790\u5668\u3002\u662f\u4e0d\u662f\u5f88\u6d41\u6279\uff0c\u53ef\u4ee5\u81ea\u5df1\u53bb\u641e\u7f16\u8bd1\u5668\u4e86\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"452%E8%B7%91%E8%B7%91_javacc\"><\/span>4.5.2.\u8dd1\u8dd1 javacc<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>\u8fd9\u91cc\u4e0d\u4ecb\u7ecd\u5177\u4f53\u7684 javacc \u8bed\u6cd5\uff0c\u76f4\u63a5\u4ee5\u5b98\u7f51\u7684&nbsp;<code>Simple1.jj<\/code>&nbsp;\u4e3a\u6848\u4f8b\u3002\u8be6\u7ec6\u8bed\u6cd5\u548c\u529f\u80fd\u53ef\u4ee5\u53c2\u8003\u5b98\u7f51\uff08<a href=\"https:\/\/link.zhihu.com\/?target=https%3A\/\/javacc.github.io\/javacc\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/javacc.github.io\/javacc\/<\/a>\uff09 \u6216\u8005\u4e00\u4e0b\u535a\u5ba2\u3002<\/p>\n\n\n\n<ol>\n<li><a href=\"https:\/\/link.zhihu.com\/?target=https%3A\/\/www.cnblogs.com\/Gavin_Liu\/archive\/2009\/03\/07\/1405029.html\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.cnblogs.com\/Gavin_Liu\/archive\/2009\/03\/07\/1405029.html<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/link.zhihu.com\/?target=https%3A\/\/www.yangguo.info\/2014\/12\/13\/%25E7%25BC%2596%25E8%25AF%2591%25E5%258E%259F%25E7%2590%2586-Javacc%25E4%25BD%25BF%25E7%2594%25A8\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.yangguo.info\/2014\/12\/13\/%E7%BC%96%E8%AF%91%E5%8E%9F%E7%90%86-Javacc%E4%BD%BF%E7%94%A8\/<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/link.zhihu.com\/?target=https%3A\/\/www.engr.mun.ca\/~theo\/JavaCC-Tutorial\/javacc-tutorial.pdf\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.engr.mun.ca\/~theo\/JavaCC-Tutorial\/javacc-tutorial.pdf<\/a><\/li>\n<\/ol>\n\n\n\n<p><code>Simple1.jj<\/code>&nbsp;\u662f\u7528\u4e8e\u8bc6\u522b\u4e00\u7cfb\u5217\u7684&nbsp;<code>{\u76f8\u540c\u6570\u91cf\u7684\u82b1\u62ec\u53f7}<\/code>\uff0c\u4e4b\u540e\u8ddf\u7740 0 \u4e2a\u6216\u591a\u4e2a\u884c\u7ec8\u7ed3\u7b26\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic1.zhimg.com\/80\/v2-afb9084528c9cfd59a21f4a737950558_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>7<\/p>\n\n\n\n<p>\u4e0b\u9762\u662f\u5408\u6cd5\u7684\u5b57\u7b26\u4e32\u4f8b\u5b50\uff1a<\/p>\n\n\n\n<p><code>{}<\/code>\uff0c<code>{{{{{}}}}}<\/code>\uff0cetc.<\/p>\n\n\n\n<p>\u4e0b\u9762\u662f\u4e0d\u5408\u6cd5\u7684\u5b57\u7b26\u4e32\u4f8b\u5b50\uff1a<\/p>\n\n\n\n<p><code>{{{{<\/code>\uff0c<code>{}{}<\/code>\uff0c<code>{}}<\/code>\uff0c<code>{{}{}}<\/code>\uff0cetc.<\/p>\n\n\n\n<p>\u63a5\u4e0b\u6765\u8ba9\u6211\u4eec\u5b9e\u9645\u5c06&nbsp;<code>Simple1.jj<\/code>&nbsp;\u7f16\u8bd1\u751f\u6210\u5177\u4f53\u7684\u89c4\u5219\u4ee3\u7801\u3002<\/p>\n\n\n\n<p>\u5728 pom \u4e2d\u52a0\u5165 javacc build \u63d2\u4ef6\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;plugin&gt;\n    &lt;!-- This must be run AFTER the fmpp-maven-plugin --&gt;\n    &lt;groupId&gt;org.codehaus.mojo&lt;\/groupId&gt;\n    &lt;artifactId&gt;javacc-maven-plugin&lt;\/artifactId&gt;\n    &lt;version&gt;2.4&lt;\/version&gt;\n    &lt;executions&gt;\n        &lt;execution&gt;\n            &lt;phase&gt;generate-sources&lt;\/phase&gt;\n            &lt;id&gt;javacc&lt;\/id&gt;\n            &lt;goals&gt;\n                &lt;goal&gt;javacc&lt;\/goal&gt;\n            &lt;\/goals&gt;\n            &lt;configuration&gt;\n                &lt;sourceDirectory&gt;${project.build.directory}\/generated-sources\/&lt;\/sourceDirectory&gt;\n                &lt;includes&gt;\n                    &lt;include&gt;**\/Simple1.jj&lt;\/include&gt;\n                &lt;\/includes&gt;\n                &lt;!-- This must be kept synced with Apache Calcite. --&gt;\n                &lt;lookAhead&gt;1&lt;\/lookAhead&gt;\n                &lt;isStatic&gt;false&lt;\/isStatic&gt;\n                &lt;outputDirectory&gt;${project.build.directory}\/generated-sources\/&lt;\/outputDirectory&gt;\n            &lt;\/configuration&gt;\n        &lt;\/execution&gt;\n    &lt;\/executions&gt;\n&lt;\/plugin&gt;\n<\/code><\/pre>\n\n\n\n<p>\u5728 compile \u4e4b\u540e\uff0c\u5c31\u4f1a\u5728&nbsp;<code>generated-sources<\/code>&nbsp;\u4e0b\u751f\u6210\u4ee3\u7801\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic1.zhimg.com\/80\/v2-9ec77d323f562c0478ac7ecdbc9bc598_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>8<\/p>\n\n\n\n<p>\u7136\u540e\u628a\u4ee3\u7801 copy \u5230 Sources \u8def\u5f84\u4e0b\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic4.zhimg.com\/80\/v2-dd6615c1ffe6fbc5ed0173d9a10513f7_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>33<\/p>\n\n\n\n<p>\u6267\u884c\u4e0b\u4ee3\u7801\uff0c\u53ef\u4ee5\u770b\u5230&nbsp;<code>{}<\/code>\uff0c<code>{{}}<\/code>&nbsp;\u90fd\u53ef\u4ee5\u6821\u9a8c\u901a\u8fc7\uff0c\u4e00\u65e6\u51fa\u73b0\u4e0d\u7b26\u5408\u89c4\u5219\u7684&nbsp;<code>{{<\/code>&nbsp;\u8f93\u5165\uff0c\u5c31\u4f1a\u629b\u51fa\u5f02\u5e38\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic2.zhimg.com\/80\/v2-ed20385b0ae0e591d60ecd6012b39779_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic1.zhimg.com\/80\/v2-47fdf6603b67f434a8ac23a297d03400_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic4.zhimg.com\/80\/v2-3bef74e31b498451f28a12bee761524b_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>\u5173\u4e8e javacc \u57fa\u672c\u4e0a\u5c31\u4e86\u89e3\u4e2a\u5927\u6982\u4e86\u3002<\/p>\n\n\n\n<p>\u611f\u5174\u8da3\u7684\u53ef\u4ee5\u5c1d\u8bd5\u81ea\u5b9a\u4e49\u4e00\u4e2a\u7f16\u8bd1\u5668\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"453fmpp_%E6%98%AF%E5%95%A5%EF%BC%9F\"><\/span>4.5.3.fmpp \u662f\u5565\uff1f<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic2.zhimg.com\/80\/v2-4f137b902900bf9d68ef820981a3229d_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>5<\/p>\n\n\n\n<p>fmpp \u5c31\u662f\u4e00\u4e2a\u57fa\u4e8e freemarker \u7684\u6a21\u677f\u751f\u4ea7\u5668\u3002\u7528\u6237\u53ef\u4ee5\u7edf\u4e00\u7ba1\u7406\u81ea\u5df1\u7684\u53d8\u91cf\uff0c\u7136\u540e\u7528&nbsp;<code>ftl \u6a21\u677f + \u53d8\u91cf<\/code>&nbsp;\u751f\u6210\u5bf9\u5e94\u7684\u6700\u7ec8\u6587\u4ef6\u3002\u5728 calcite \u4e2d\u4f7f\u7528 fmpp \u4f5c\u4e3a\u53d8\u91cf + \u6a21\u677f\u7684\u7edf\u4e00\u7ba1\u7406\u5668\u3002\u7136\u540e\u57fa\u4e8e fmpp \u6765\u751f\u6210\u5bf9\u5e94\u7684&nbsp;<code>Parser.jj<\/code>&nbsp;\u6587\u4ef6\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"5%E5%8E%9F%E7%90%86%E5%89%96%E6%9E%90%E7%AF%87-calcite_%E5%9C%A8_flink_sql_%E4%B8%AD%E5%A4%A7%E5%B1%95%E8%BA%AB%E6%89%8B\"><\/span>5.\u539f\u7406\u5256\u6790\u7bc7-calcite \u5728 flink sql \u4e2d\u5927\u5c55\u8eab\u624b<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>\u535a\u4e3b\u753b\u4e86\u4e00\u5f20\u56fe\uff0c\u5305\u542b\u4e86\u5176\u4e2d\u91cd\u8981\u7ec4\u4ef6\u4e4b\u95f4\u7684\u4f9d\u8d56\u5173\u7cfb\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic3.zhimg.com\/80\/v2-111ab8b2ab79d74c69e75b2fe987272e_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>3<\/p>\n\n\n\n<p>\u4f60\u6ca1\u731c\u9519\uff0c\u8fd8\u662f\u4e0a\u9762\u90a3\u4e9b\u6d41\u7a0b\uff0c<code>fmpp\uff08Parser.jj \u6a21\u677f\u751f\u6210\uff09<\/code>&nbsp;-&gt;&nbsp;<code>javacc\uff08Parser \u751f\u6210\uff09<\/code>&nbsp;-&gt;&nbsp;<code>calcite<\/code>\u3002<\/p>\n\n\n\n<p>\u5728\u4ecb\u7ecd Parser \u751f\u6210\u6d41\u7a0b\u4e4b\u524d\uff0c\u5148\u770b\u770b flink \u6700\u7ec8\u751f\u6210\u7684 Parser\uff1a<code>FlinkSqlParserImpl<\/code>&nbsp;\uff08\u6b64\u5904\u4f7f\u7528 Blink Planner\uff09\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"51FlinkSqlParserImpl\"><\/span>5.1.FlinkSqlParserImpl<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>\u4ee5\u4e0b\u9762\u8fd9\u4e2a\u6848\u4f8b\u51fa\u53d1\uff08\u4ee3\u7801\u57fa\u4e8e flink 1.13.1 \u7248\u672c\uff09\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public class ParserTest {\n\n    public static void main(String&#91;] args) throws Exception {\n\n        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();\n\n        env.setParallelism(10);\n\n        EnvironmentSettings settings = EnvironmentSettings\n                .newInstance()\n                .useBlinkPlanner()\n                .inStreamingMode()\n                .build();\n\n        StreamTableEnvironment tEnv = StreamTableEnvironment.create(env, settings);\n\n        DataStream&lt;Tuple3&lt;String, Long, Long&gt;&gt; tuple3DataStream =\n                env.fromCollection(Arrays.asList(\n                        Tuple3.of(\"2\", 1L, 1627254000000L),\n                        Tuple3.of(\"2\", 1L, 1627218000000L + 5000L),\n                        Tuple3.of(\"2\", 101L, 1627218000000L + 6000L),\n                        Tuple3.of(\"2\", 201L, 1627218000000L + 7000L),\n                        Tuple3.of(\"2\", 301L, 1627218000000L + 7000L),\n                        Tuple3.of(\"2\", 301L, 1627218000000L + 7000L),\n                        Tuple3.of(\"2\", 301L, 1627218000000L + 7000L),\n                        Tuple3.of(\"2\", 301L, 1627218000000L + 7000L),\n                        Tuple3.of(\"2\", 301L, 1627218000000L + 7000L),\n                        Tuple3.of(\"2\", 301L, 1627218000000L + 86400000 + 7000L)))\n                        .assignTimestampsAndWatermarks(\n                                new BoundedOutOfOrdernessTimestampExtractor&lt;Tuple3&lt;String, Long, Long&gt;&gt;(Time.seconds(0L)) {\n                                    @Override\n                                    public long extractTimestamp(Tuple3&lt;String, Long, Long&gt; element) {\n                                        return element.f2;\n                                    }\n                                });\n\n        tEnv.registerFunction(\"mod\", new Mod_UDF());\n\n        tEnv.registerFunction(\"status_mapper\", new StatusMapper_UDF());\n\n        tEnv.createTemporaryView(\"source_db.source_table\", tuple3DataStream,\n                \"status, id, timestamp, rowtime.rowtime\");\n\n        String sql = \"SELECT\\n\"\n                + \"  count(1),\\n\"\n                + \"  cast(tumble_start(rowtime, INTERVAL '1' DAY) as string)\\n\"\n                + \"FROM\\n\"\n                + \"  source_db.source_table\\n\"\n                + \"GROUP BY\\n\"\n                + \"  tumble(rowtime, INTERVAL '1' DAY)\";\n\n        Table result = tEnv.sqlQuery(sql);\n\n        tEnv.toAppendStream(result, Row.class).print();\n\n        env.execute();\n\n    }\n\n}\n<\/code><\/pre>\n\n\n\n<p>debug \u8fc7\u7a0b\u5982\u4e4b\u524d\u5206\u6790 sql -&gt; SqlNode \u8fc7\u7a0b\u6240\u793a\uff0c\u5982\u4e0b\u56fe\u76f4\u63a5\u5b9a\u4f4d\u5230 SqlParser\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic3.zhimg.com\/80\/v2-f7f742ba2717776321ab0d569c4eb4a2_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>21<\/p>\n\n\n\n<p>\u5982\u4e0a\u56fe\u53ef\u4ee5\u770b\u5230\u5177\u4f53\u7684 Parser \u5c31\u662f&nbsp;<code>FlinkSqlParserImpl<\/code>\u3002<\/p>\n\n\n\n<p>\u5b9a\u4f4d\u5230\u5177\u4f53\u7684\u4ee3\u7801\u5982\u4e0b\u56fe\u6240\u793a\uff08<code>flink-table-palnner-blink-2.11-1.13.1.jar<\/code>\uff09\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic1.zhimg.com\/80\/v2-deddd4b8578a57192000661377ce647c_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>34<\/p>\n\n\n\n<p>\u6700\u7ec8 parse \u7684\u7ed3\u679c SqlNode \u5982\u4e0b\u56fe\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic2.zhimg.com\/80\/v2-73e33f65c869ba3da10a6e2dc406d579_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>22<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic2.zhimg.com\/80\/v2-190f53714c2a53df53282379170ac86d_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic3.zhimg.com\/80\/v2-12e1818505a352953a1f4a0242fbde72_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>\u518d\u6765\u770b\u770b&nbsp;<code>FlinkSqlParserImpl<\/code>&nbsp;\u662f\u600e\u4e48\u4f7f\u7528 calcite \u751f\u6210\u7684\u3002<\/p>\n\n\n\n<p>\u5177\u4f53\u5230 flink \u4e2d\u7684\u5b9e\u73b0\uff0c\u4f4d\u4e8e\u6e90\u7801\u4e2d\u7684&nbsp;<code>flink-table<\/code>.<code>flink-sql-parser<\/code>&nbsp;\u6a21\u5757\uff08\u6e90\u7801\u57fa\u4e8e flink 1.13.1\uff09\u3002<\/p>\n\n\n\n<p>flink \u662f\u4f9d\u8d56 maven \u63d2\u4ef6\u5b9e\u73b0\u7684\u4e0a\u9762\u7684\u6574\u4f53\u6d41\u7a0b\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"52FlinkSqlParserImpl_%E7%9A%84%E7%94%9F%E6%88%90\"><\/span>5.2.FlinkSqlParserImpl \u7684\u751f\u6210<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic1.zhimg.com\/80\/v2-4f2ab833bc94028bb5ca8201b2c4e2a0_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>14<\/p>\n\n\n\n<p>\u63a5\u4e0b\u6765\u770b\u770b\u6574\u4e2a Parser \u751f\u6210\u6d41\u7a0b\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"521flink_%E5%BC%95%E5%85%A5_calcite\"><\/span>5.2.1.flink \u5f15\u5165 calcite<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>\u4f7f\u7528&nbsp;<code>maven-dependency-plugin<\/code>&nbsp;\u5c06 calcite \u89e3\u538b\u5230 flink \u9879\u76ee build \u76ee\u5f55\u4e0b\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;plugin&gt;\n    &lt;!-- Extract parser grammar template from calcite-core.jar and put\n         it under ${project.build.directory} where all freemarker templates are. --&gt;\n    &lt;groupId&gt;org.apache.maven.plugins&lt;\/groupId&gt;\n    &lt;artifactId&gt;maven-dependency-plugin&lt;\/artifactId&gt;\n    &lt;executions&gt;\n        &lt;execution&gt;\n            &lt;id&gt;unpack-parser-template&lt;\/id&gt;\n            &lt;phase&gt;initialize&lt;\/phase&gt;\n            &lt;goals&gt;\n                &lt;goal&gt;unpack&lt;\/goal&gt;\n            &lt;\/goals&gt;\n            &lt;configuration&gt;\n                &lt;artifactItems&gt;\n                    &lt;artifactItem&gt;\n                        &lt;groupId&gt;org.apache.calcite&lt;\/groupId&gt;\n                        &lt;artifactId&gt;calcite-core&lt;\/artifactId&gt;\n                        &lt;type&gt;jar&lt;\/type&gt;\n                        &lt;overWrite&gt;true&lt;\/overWrite&gt;\n                        &lt;outputDirectory&gt;${project.build.directory}\/&lt;\/outputDirectory&gt;\n                        &lt;includes&gt;**\/Parser.jj&lt;\/includes&gt;\n                    &lt;\/artifactItem&gt;\n                &lt;\/artifactItems&gt;\n            &lt;\/configuration&gt;\n        &lt;\/execution&gt;\n    &lt;\/executions&gt;\n&lt;\/plugin&gt;\n<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic3.zhimg.com\/80\/v2-64ab09f326cdb95ae47cd78c53cababa_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>15<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"522fmpp_%E7%94%9F%E6%88%90_Parserjj\"><\/span>5.2.2.fmpp \u751f\u6210 Parser.jj<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>\u4f7f\u7528&nbsp;<code>maven-resources-plugin<\/code>&nbsp;\u5c06&nbsp;<code>Parser.jj<\/code>&nbsp;\u4ee3\u7801\u751f\u6210\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;plugin&gt;\n    &lt;artifactId&gt;maven-resources-plugin&lt;\/artifactId&gt;\n    &lt;executions&gt;\n        &lt;execution&gt;\n            &lt;id&gt;copy-fmpp-resources&lt;\/id&gt;\n            &lt;phase&gt;initialize&lt;\/phase&gt;\n            &lt;goals&gt;\n                &lt;goal&gt;copy-resources&lt;\/goal&gt;\n            &lt;\/goals&gt;\n            &lt;configuration&gt;\n                &lt;outputDirectory&gt;${project.build.directory}\/codegen&lt;\/outputDirectory&gt;\n                &lt;resources&gt;\n                    &lt;resource&gt;\n                        &lt;directory&gt;src\/main\/codegen&lt;\/directory&gt;\n                        &lt;filtering&gt;false&lt;\/filtering&gt;\n                    &lt;\/resource&gt;\n                &lt;\/resources&gt;\n            &lt;\/configuration&gt;\n        &lt;\/execution&gt;\n    &lt;\/executions&gt;\n&lt;\/plugin&gt;\n&lt;plugin&gt;\n    &lt;groupId&gt;com.googlecode.fmpp-maven-plugin&lt;\/groupId&gt;\n    &lt;artifactId&gt;fmpp-maven-plugin&lt;\/artifactId&gt;\n    &lt;version&gt;1.0&lt;\/version&gt;\n    &lt;dependencies&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.freemarker&lt;\/groupId&gt;\n            &lt;artifactId&gt;freemarker&lt;\/artifactId&gt;\n            &lt;version&gt;2.3.28&lt;\/version&gt;\n        &lt;\/dependency&gt;\n    &lt;\/dependencies&gt;\n    &lt;executions&gt;\n        &lt;execution&gt;\n            &lt;id&gt;generate-fmpp-sources&lt;\/id&gt;\n            &lt;phase&gt;generate-sources&lt;\/phase&gt;\n            &lt;goals&gt;\n                &lt;goal&gt;generate&lt;\/goal&gt;\n            &lt;\/goals&gt;\n            &lt;configuration&gt;\n                &lt;cfgFile&gt;${project.build.directory}\/codegen\/config.fmpp&lt;\/cfgFile&gt;\n                &lt;outputDirectory&gt;target\/generated-sources&lt;\/outputDirectory&gt;\n                &lt;templateDirectory&gt;${project.build.directory}\/codegen\/templates&lt;\/templateDirectory&gt;\n            &lt;\/configuration&gt;\n        &lt;\/execution&gt;\n    &lt;\/executions&gt;\n&lt;\/plugin&gt;\n<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic3.zhimg.com\/80\/v2-79d274f87f5e7ce244be79273707604a_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>16<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"523javacc_%E7%94%9F%E6%88%90_parser\"><\/span>5.2.3.javacc \u751f\u6210 parser<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>\u4f7f\u7528 javacc \u5c06\u6839\u636e&nbsp;<code>Parser.jj<\/code>&nbsp;\u6587\u4ef6\u751f\u6210 Parser\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;plugin&gt;\n    &lt;!-- This must be run AFTER the fmpp-maven-plugin --&gt;\n    &lt;groupId&gt;org.codehaus.mojo&lt;\/groupId&gt;\n    &lt;artifactId&gt;javacc-maven-plugin&lt;\/artifactId&gt;\n    &lt;version&gt;2.4&lt;\/version&gt;\n    &lt;executions&gt;\n        &lt;execution&gt;\n            &lt;phase&gt;generate-sources&lt;\/phase&gt;\n            &lt;id&gt;javacc&lt;\/id&gt;\n            &lt;goals&gt;\n                &lt;goal&gt;javacc&lt;\/goal&gt;\n            &lt;\/goals&gt;\n            &lt;configuration&gt;\n                &lt;sourceDirectory&gt;${project.build.directory}\/generated-sources\/&lt;\/sourceDirectory&gt;\n                &lt;includes&gt;\n                    &lt;include&gt;**\/Parser.jj&lt;\/include&gt;\n                &lt;\/includes&gt;\n                &lt;!-- This must be kept synced with Apache Calcite. --&gt;\n                &lt;lookAhead&gt;1&lt;\/lookAhead&gt;\n                &lt;isStatic&gt;false&lt;\/isStatic&gt;\n                &lt;outputDirectory&gt;${project.build.directory}\/generated-sources\/&lt;\/outputDirectory&gt;\n            &lt;\/configuration&gt;\n        &lt;\/execution&gt;\n    &lt;\/executions&gt;\n&lt;\/plugin&gt;\n<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic4.zhimg.com\/80\/v2-66f719816397122c7d835a63fb201c4f_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>17<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"524%E7%9C%8B%E7%9C%8B_Parser\"><\/span>5.2.4.\u770b\u770b Parser<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>\u6700\u7ec8\u751f\u6210\u7684&nbsp;<code>Parser<\/code>&nbsp;\u5c31\u662f&nbsp;<code>FlinkSqlParserImpl<\/code>\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic2.zhimg.com\/80\/v2-b0d4296687b1764c062a5d5496f60e49_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>18<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"525blink_planner_%E5%BC%95%E5%85%A5_flink-sql-parser\"><\/span>5.2.5.blink planner \u5f15\u5165 flink-sql-parser<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>blink planner\uff08<code>flink-table-planner-blink<\/code>\uff09 \u5728\u6253\u5305\u65f6\u5c06&nbsp;<code>flink-sql-parser<\/code>\u3001<code>flink-sql-parser-hive<\/code>&nbsp;\u6253\u5305\u8fdb\u53bb\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/pic2.zhimg.com\/80\/v2-f6898e8e9db958c226a2cec9e6a0cda9_720w.webp\" alt=\"\"\/><\/figure>\n\n\n\n<p>35<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"6%E6%80%BB%E7%BB%93%E4%B8%8E%E5%B1%95%E6%9C%9B%E7%AF%87\"><\/span>6.\u603b\u7ed3\u4e0e\u5c55\u671b\u7bc7<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>\u672c\u6587\u4e3b\u8981\u4ecb\u7ecd\u4e86 flink sql \u4e0e calcite \u4e4b\u95f4\u7684\u4f9d\u8d56\u5173\u7cfb\uff0c\u4ee5\u53ca flink sql parser \u7684\u751f\u6210\u8fc7\u7a0b\u3002<\/p>\n\n\n\n<p>\u8f6c\u81ea\uff1a<a rel=\"noreferrer noopener\" href=\"https:\/\/www.zhihu.com\/people\/onemango\" target=\"_blank\">\u5927\u6570\u636e\u7f8a\u8bf4<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>1.\u5e8f\u7bc7-\u672c\u6587\u7ed3\u6784 \u672c\u6587\u4e3b\u8981\u4ecb\u7ecd flink sql \u4e0e calcite \u4e4b\u95f4\u7684\u5173\u7cfb\u3002flink s&hellip; <a href=\"http:\/\/viplao.com\/index.php\/2023\/03\/19\/flink-sql-%e7%ba%a6%e4%bc%9a-calcite\/\" class=\"more-link read-more\" rel=\"bookmark\">\u7ee7\u7eed\u9605\u8bfb <span class=\"screen-reader-text\">\u3010\u8fd0\u7ef4\u5de5\u5177\u3011Flink SQL\u00a0\u5b9e\u8df56 flink sql \u7ea6\u4f1a calcite<\/span><i class=\"fa fa-arrow-right\"><\/i><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[25],"views":1089,"_links":{"self":[{"href":"http:\/\/viplao.com\/index.php\/wp-json\/wp\/v2\/posts\/1325"}],"collection":[{"href":"http:\/\/viplao.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/viplao.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/viplao.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/viplao.com\/index.php\/wp-json\/wp\/v2\/comments?post=1325"}],"version-history":[{"count":2,"href":"http:\/\/viplao.com\/index.php\/wp-json\/wp\/v2\/posts\/1325\/revisions"}],"predecessor-version":[{"id":1327,"href":"http:\/\/viplao.com\/index.php\/wp-json\/wp\/v2\/posts\/1325\/revisions\/1327"}],"wp:attachment":[{"href":"http:\/\/viplao.com\/index.php\/wp-json\/wp\/v2\/media?parent=1325"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/viplao.com\/index.php\/wp-json\/wp\/v2\/categories?post=1325"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/viplao.com\/index.php\/wp-json\/wp\/v2\/tags?post=1325"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}