{"id":10859,"date":"2020-11-12T00:48:34","date_gmt":"2020-11-11T23:48:34","guid":{"rendered":"https:\/\/www.salvis.com\/blog\/?p=10859"},"modified":"2023-11-12T13:59:39","modified_gmt":"2023-11-12T12:59:39","slug":"formatter-callback-functions","status":"publish","type":"post","link":"https:\/\/www.salvis.com\/blog\/2020\/11\/12\/formatter-callback-functions\/","title":{"rendered":"Formatter Callback Functions"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Introduction<\/h2>\n\n\n\n<p>In <a href=\"https:\/\/www.salvis.com\/blog\/2020\/04\/13\/formatting-code-with-sql-developer\/\">this blog post<\/a>, I explained how the formatter in SQL Developer works and outlined how you can change the formatter result using Arbori and JavaScript. In this post, I explain what exactly the provided formatter callback functions do. For that, I use simple examples. I produced all results with a patched version of SQL Developer 20.2. However, I expect that the results for versions 20.2, 19.4 and 19.2 will be the same.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Minimal Arbori Program<\/h2>\n\n\n\n<p>Before looking at the callback function, I&#8217;d like to reduce the Arbori program to the minimum. Why? Because this visualises the default behaviour of the formatter. Furthermore, it will simplify the subsequent examples.<\/p>\n\n\n\n<p>One could think about removing the entire Arbori program. But that won&#8217;t work. An empty Arbori program is an invalid Arbori program and SQL Developer will reset it to the default.<\/p>\n\n\n\n<p>A minimal Arbori program looks as follows, the comment section explains the required parts.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Minimal Arbori Formatter Program<\/span><span role=\"button\" tabindex=\"0\" data-code=\"\/**\n * Minimal version of a custom Arbori formatter program.\n *\n * oracle.dbtools.app.Format checks if \n *\n *    - skipWhiteSpaceBeforeNode exists\n *    - :indentConditions is used somewhere\n *\n * The Arbori program is considered invalid, if these \n * minimal requirement are not met and it is reset \n * to the default value.\n *\/\n\ndummy:  \n  :indentConditions &amp; [node) 'dummy_node_cond' \n;\n\nskipWhiteSpaceBeforeNode:\n  [node) 'dummy_node_skip_ws_before'  \n  -&gt;\n;\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6A9955\">\/**<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * Minimal version of a custom Arbori formatter program.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * oracle.dbtools.app.Format checks if <\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *    - skipWhiteSpaceBeforeNode exists<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *    - :indentConditions is used somewhere<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * The Arbori program is considered invalid, if these <\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * minimal requirement are not met and it is reset <\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> * to the default value.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> *\/<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C8C8C8\">dummy<\/span><span style=\"color: #D4D4D4\">:  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  :<\/span><span style=\"color: #9CDCFE\">indentConditions<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;dummy_node_cond&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">skipWhiteSpaceBeforeNode<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;dummy_node_skip_ws_before&#39;<\/span><span style=\"color: #D4D4D4\">  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>I use default values for all other formatter settings as the following three screenshots show.<\/p>\n\n\n<div class=\"jq-tabs tabs_wrapper tabs_horizontal\"><ul><li><a href=\"#tab-6a06ef65d8024-1\">Format<\/a><\/li><li><a href=\"#tab-6a06ef65d8024-2\">Advanced Format<\/a><\/li><li><a href=\"#tab-6a06ef65d8024-3\">Custom Format<\/a><\/li><\/ul><div id=\"tab-6a06ef65d8024-1\" ><\/p>\n<p><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/default-arbori-program-format.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-10865\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/default-arbori-program-format.png\" alt=\"\" width=\"1280\" height=\"720\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/default-arbori-program-format.png 2560w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/default-arbori-program-format-300x169.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/default-arbori-program-format-1024x576.png 1024w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/default-arbori-program-format-768x432.png 768w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/default-arbori-program-format-1536x864.png 1536w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/default-arbori-program-format-2048x1152.png 2048w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/default-arbori-program-format-260x146.png 260w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/default-arbori-program-format-50x28.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/default-arbori-program-format-133x75.png 133w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/default-arbori-program-format-1x1.png 1w\" sizes=\"auto, (max-width:767px) 480px, (max-width:1280px) 100vw, 1280px\" \/><\/a><\/p>\n<p><\/div><div id=\"tab-6a06ef65d8024-2\" ><\/p>\n<p><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/default-arbori-program-advanced-format.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-10866\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/default-arbori-program-advanced-format.png\" alt=\"\" width=\"1280\" height=\"720\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/default-arbori-program-advanced-format.png 2560w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/default-arbori-program-advanced-format-300x169.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/default-arbori-program-advanced-format-1024x576.png 1024w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/default-arbori-program-advanced-format-768x432.png 768w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/default-arbori-program-advanced-format-1536x864.png 1536w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/default-arbori-program-advanced-format-2048x1152.png 2048w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/default-arbori-program-advanced-format-260x146.png 260w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/default-arbori-program-advanced-format-50x28.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/default-arbori-program-advanced-format-133x75.png 133w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/default-arbori-program-advanced-format-1x1.png 1w\" sizes=\"auto, (max-width:767px) 480px, (max-width:1280px) 100vw, 1280px\" \/><\/a><\/p>\n<p><\/div><div id=\"tab-6a06ef65d8024-3\" ><\/p>\n<p><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/default-arbori-program-custom-format.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-10867\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/default-arbori-program-custom-format.png\" alt=\"\" width=\"1280\" height=\"720\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/default-arbori-program-custom-format.png 2560w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/default-arbori-program-custom-format-300x169.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/default-arbori-program-custom-format-1024x576.png 1024w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/default-arbori-program-custom-format-768x432.png 768w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/default-arbori-program-custom-format-1536x864.png 1536w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/default-arbori-program-custom-format-2048x1152.png 2048w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/default-arbori-program-custom-format-260x146.png 260w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/default-arbori-program-custom-format-50x28.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/default-arbori-program-custom-format-133x75.png 133w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/default-arbori-program-custom-format-1x1.png 1w\" sizes=\"auto, (max-width:767px) 480px, (max-width:1280px) 100vw, 1280px\" \/><\/a><\/p>\n<p><\/div><\/div>\n\n\n\n<p>You can see that tokens are separated by a space. A line break is added after reaching the line size limit. Keywords are changed to upper case. However, all identifiers are treated as keywords. No identifiers are changed to lowercase as configured. Besides the &#8220;1-line long comments&#8221; setting no other configuration has an effect with this minimal Arbori program. In other words, the Arbori program is involved in the application of most formatter configuration settings.<\/p>\n\n\n\n<p>Just to be clear. This Arbori program does nothing. <code>:indentConditions<\/code> is technically used in the <code>dummy<\/code>query, but the query does not produce a result. Even if it would, it is not used anywhere. And the query <code>skipWhiteSpaceBeforeNode<\/code> looks for a non-existing node type. So the query returns no result and therefore the callback function <code>skipWhiteSpaceBeforeNode<\/code> is not called.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Callback Functions<\/h2>\n\n\n\n<p>A formatter callback function in SQL Developer has the following Java signature:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Java<\/span><span role=\"button\" tabindex=\"0\" data-code=\"public void callbackFunctionName (\n   oracle.dbtools.parser.Parsed target, \n   Map<String, oracle.dbtools.parser.ParseNode&gt; tuple\n) {...}\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">public<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">void<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">callbackFunctionName<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #9CDCFE\">oracle<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">dbtools<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">parser<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">Parsed<\/span><span style=\"color: #D4D4D4\"> target, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #4EC9B0\">Map<\/span><span style=\"color: #D4D4D4\">&lt;String, <\/span><span style=\"color: #9CDCFE\">oracle<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">dbtools<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">parser<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">ParseNode<\/span><span style=\"color: #D4D4D4\">&gt; tuple<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">) {...}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p><code>target<\/code> contains the parse tree. And <code>tuple<\/code> contains the nodes to process. An Arbori query can return multiple columns and multiple rows. A tuple contains the columns of a single row. Therefore, a callback function is called per Arbori query result row. But what columns are expected in <code>tuple<\/code>. I have not found a document describing that. This is one of the reasons for this blog post. Most of the callback functions expect a column named <code>node<\/code>. But not all of them.<\/p>\n\n\n\n<p>Most of the formatter callback functions just populate an internal list of whitespace before a node. Technically it is implemented as a <code>Map&lt;Integer, String&gt;<\/code> and is named <code>newLinePositions<\/code>. The key (<code>Integer<\/code>) is the position of a node (lexer token) in the parse tree. The value (<code>String<\/code>) contains the whitespace before this position.<\/p>\n\n\n\n<p>Most callback functions expect existing entries in <code>newLinePositions<\/code>. This leads to a strict execution order.<\/p>\n\n\n\n<p>Here&#8217;s the ordered list of all callback functions. I highlighted the functions that you can call at any position in an Arbori program.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code><a href=\"#indentedNodes1\">indentedNodes1<\/a><\/code><\/li>\n\n\n\n<li><code><a href=\"#indentedNodes2\">indentedNodes2<\/a><\/code><\/li>\n\n\n\n<li><code><a href=\"#skipWhiteSpaceBeforeNode\">skipWhiteSpaceBeforeNode<\/a><\/code> <span class=\"highlight highlight-\" style=\"background-color:Lemonchiffon;color:black;\">(any position)<\/span>\n<\/li>\n\n\n\n<li><code><a href=\"#skipWhiteSpaceAfterNode\">skipWhiteSpaceAfterNode<\/a><\/code> <span class=\"highlight highlight-\" style=\"background-color:Lemonchiffon;color:black;\">(any position)<\/span>\n<\/li>\n\n\n\n<li><code><a href=\"#identifiers\">identifiers<\/a><\/code> <span class=\"highlight highlight-\" style=\"background-color:Lemonchiffon;color:black;\">(any position)<\/span>\n<\/li>\n\n\n\n<li><code><a href=\"#extraBrkBefore\">extraBrkBefore<\/a><\/code><\/li>\n\n\n\n<li><code><a href=\"#extraBrkAfter\">extraBrkAfter<\/a><\/code><\/li>\n\n\n\n<li><code><a href=\"#brkX2\">brkX2<\/a><\/code><\/li>\n\n\n\n<li><code><a href=\"#rightAlignments\">rightAlignments<\/a><\/code><\/li>\n\n\n\n<li><code><a href=\"#paddedIdsInScope\">paddedIdsInScope<\/a><\/code><\/li>\n\n\n\n<li><code><a href=\"#incrementalAlignments\">incrementalAlignments<\/a><\/code><\/li>\n\n\n\n<li><code><a href=\"#pairwiseAlignments\">pairwiseAlignments<\/a><\/code><\/li>\n\n\n\n<li><code><a href=\"#ignoreLineBreaksBeforeNode\">ignoreLineBreaksBeforeNode<\/a><\/code><\/li>\n\n\n\n<li><code><a href=\"#ignoreLineBreaksAfterNode\">ignoreLineBreaksAfterNode<\/a><\/code><\/li>\n\n\n\n<li><code><a href=\"#dontFormatNode\">dontFormatNode<\/a><\/code> <span class=\"highlight highlight-\" style=\"background-color:Lemonchiffon;color:black;\">(any position)<\/span>\n<\/li>\n<\/ul>\n\n\n\n<p>I will discuss them in the next chapters based on this example:<\/p>\n\n\n<div class=\"jq-tabs tabs_wrapper tabs_horizontal\"><ul><li><a href=\"#tab-6a06ef65d8187-1\">Input \/ Final Result<\/a><\/li><li><a href=\"#tab-6a06ef65d8187-2\">Result of Minimal Arbori Program<\/a><\/li><\/ul><div id=\"tab-6a06ef65d8187-1\" ><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">PL\/SQL Example Code (Input \/ Final Result)<\/span><span role=\"button\" tabindex=\"0\" data-code=\"SET SERVEROUTPUT ON\n \nBEGIN\n    FOR r IN (SELECT ename  AS emp_name,\n                     sal    AS salary\n                FROM emp\n               WHERE deptno IN (10, 20))\n    LOOP\n        IF r.salary &gt; 2.9e3 THEN\n            dbms_output.put_line (r.emp_name);\n        END IF;\n    END LOOP;\nEND;\n\/\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">SET<\/span><span style=\"color: #D4D4D4\"> SERVEROUTPUT <\/span><span style=\"color: #569CD6\">ON<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">BEGIN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">FOR<\/span><span style=\"color: #D4D4D4\"> r <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> ename  <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> emp_name,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                     sal    <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> salary<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> emp<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">               <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> deptno <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #B5CEA8\">10<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">20<\/span><span style=\"color: #D4D4D4\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">LOOP<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">IF<\/span><span style=\"color: #D4D4D4\"> r.salary &gt; <\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">.9e3 <\/span><span style=\"color: #569CD6\">THEN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #DCDCAA\">dbms_output.<\/span><span style=\"color: #4EC9B0\">put_line<\/span><span style=\"color: #D4D4D4\"> (r.emp_name);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">END IF<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">END LOOP<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\/<\/span><\/span><\/code><\/pre><\/div>\n\n\n<p><\/div><div id=\"tab-6a06ef65d8187-2\" ><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">PL\/SQL Example Code (Result of Minimal Arbori Program)<\/span><span role=\"button\" tabindex=\"0\" data-code=\"SET SERVEROUTPUT ON BEGIN FOR R IN ( SELECT ENAME AS EMP_NAME , SAL AS SALARY FROM EMP WHERE DEPTNO IN ( 10 , 20 ) ) LOOP IF R . SALARY &gt;\n 2 . 9 E 3 THEN DBMS_OUTPUT . PUT_LINE ( R . EMP_NAME ) ; END IF ; END LOOP ; END ;\n\/\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">SET<\/span><span style=\"color: #D4D4D4\"> SERVEROUTPUT <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">BEGIN<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #C586C0\">FOR<\/span><span style=\"color: #D4D4D4\"> R <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> ( <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> ENAME <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> EMP_NAME , SAL <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> SALARY <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> EMP <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> DEPTNO <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> ( <\/span><span style=\"color: #B5CEA8\">10<\/span><span style=\"color: #D4D4D4\"> , <\/span><span style=\"color: #B5CEA8\">20<\/span><span style=\"color: #D4D4D4\"> ) ) <\/span><span style=\"color: #C586C0\">LOOP<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #C586C0\">IF<\/span><span style=\"color: #D4D4D4\"> R . SALARY &gt;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\"> . <\/span><span style=\"color: #B5CEA8\">9<\/span><span style=\"color: #D4D4D4\"> E <\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">THEN<\/span><span style=\"color: #D4D4D4\"> DBMS_OUTPUT . PUT_LINE ( R . EMP_NAME ) ; <\/span><span style=\"color: #C586C0\">END IF<\/span><span style=\"color: #D4D4D4\"> ; <\/span><span style=\"color: #C586C0\">END LOOP<\/span><span style=\"color: #D4D4D4\"> ; <\/span><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\"> ;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\/<\/span><\/span><\/code><\/pre><\/div>\n\n\n<p><\/div><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><a name=\"dontFormatNode\"><\/a><code>dontFormatNode<\/code><\/h3>\n\n\n\n<p>I start with this function because the example contains an exponential number <code>2.9e3<\/code>. The default formatting adds spaces around all lexer tokens. The result <code>2 . 9 E 3<\/code>&nbsp;breaks the code. I&#8217;d like to fix that first, so we are not distracted by this syntax error and can concentrate on formatting code.<\/p>\n\n\n\n<p>This function expects a node in tuple. It identifies nodes that must not be formatted. In other words, the node keeps all its whitespace. Behind the scenes, the function adds all positions to a <code>Map&lt;Integer&gt;<\/code> named <code>unformattedPositions<\/code>. The serializer will ignore all positions in <code>newLinePositions<\/code> if a position exists in <code>unformattedPositions<\/code>. As a result, the position of <code>dontFormatNode<\/code>&nbsp;in the Arbori program is irrelevant.<\/p>\n\n\n\n<p>In <a href=\"https:\/\/www.salvis.com\/blog\/2020\/09\/28\/disable-formatter-for-code-sections-in-sql-developer\/\">this blog post<\/a> I showed how you can use <code>dontFormatNode<\/code> to ignore chosen code sections with <code>@formatter:off<\/code> and <code>@formatter:on<\/code> comments.<\/p>\n\n\n\n<p>Here is the Arbori program and its formatting result.<\/p>\n\n\n<div class=\"jq-tabs tabs_wrapper tabs_horizontal\"><ul><li><a href=\"#tab-6a06ef65d8259-1\">Arbori Program<\/a><\/li><li><a href=\"#tab-6a06ef65d8259-2\">Result<\/a><\/li><\/ul><div id=\"tab-6a06ef65d8259-1\" ><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Arbori Program<\/span><span role=\"button\" tabindex=\"0\" data-code=\"dontFormatNode:\n  &#091;node) numeric_literal\n  -&gt;\n;\n \ndummy:  \n  :indentConditions &amp; &#091;node) 'dummy_node_cond' \n;\n \nskipWhiteSpaceBeforeNode:\n  &#091;node) 'dummy_node_skip_ws_before'  \n  -&gt;\n;\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line cbp-line-highlight\"><span style=\"color: #C8C8C8\">dontFormatNode<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">numeric_literal<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">dummy<\/span><span style=\"color: #D4D4D4\">:  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  :<\/span><span style=\"color: #9CDCFE\">indentConditions<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;dummy_node_cond&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">skipWhiteSpaceBeforeNode<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;dummy_node_skip_ws_before&#39;<\/span><span style=\"color: #D4D4D4\">  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span><\/code><\/pre><\/div>\n\n\n<p><\/div><div id=\"tab-6a06ef65d8259-2\" ><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">PL\/SQL Example Code (Formatter Result)<\/span><span role=\"button\" tabindex=\"0\" data-code=\"SET SERVEROUTPUT ON BEGIN FOR R IN ( SELECT ENAME AS EMP_NAME , SAL AS SALARY FROM EMP WHERE DEPTNO IN ( 10 , 20 ) ) LOOP IF R . SALARY &gt;\n 2 . 9 E 3 THEN DBMS_OUTPUT . PUT_LINE ( R . EMP_NAME ) ; END IF ; END LOOP ; END ;\n\/\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">SET<\/span><span style=\"color: #D4D4D4\"> SERVEROUTPUT <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">BEGIN<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #C586C0\">FOR<\/span><span style=\"color: #D4D4D4\"> R <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> ( <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> ENAME <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> EMP_NAME , SAL <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> SALARY <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> EMP <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> DEPTNO <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> ( <\/span><span style=\"color: #B5CEA8\">10<\/span><span style=\"color: #D4D4D4\"> , <\/span><span style=\"color: #B5CEA8\">20<\/span><span style=\"color: #D4D4D4\"> ) ) <\/span><span style=\"color: #C586C0\">LOOP<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #C586C0\">IF<\/span><span style=\"color: #D4D4D4\"> R . SALARY &gt;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\"> . <\/span><span style=\"color: #B5CEA8\">9<\/span><span style=\"color: #D4D4D4\"> E <\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">THEN<\/span><span style=\"color: #D4D4D4\"> DBMS_OUTPUT . PUT_LINE ( R . EMP_NAME ) ; <\/span><span style=\"color: #C586C0\">END IF<\/span><span style=\"color: #D4D4D4\"> ; <\/span><span style=\"color: #C586C0\">END LOOP<\/span><span style=\"color: #D4D4D4\"> ; <\/span><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\"> ;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\/<\/span><\/span><\/code><\/pre><\/div>\n\n\n<p><\/div><\/div>\n\n\n\n<p>On line 2 you find the query condition. The <code>-&gt;<\/code> on line 3 calls the callback function. The name of the function musts match the query name. In this case <code>dontFormatNode<\/code>. The result shows a difference on line 2. The numeric literal <code>2.9e3<\/code> does not contain whitespace anymore.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a name=\"indentedNodes1\"><\/a><code>indentedNodes1<\/code><\/h3>\n\n\n\n<p>This function expects an <code>node<\/code> in <code>tuple<\/code>. It&#8217;s a preparation step for <code>indentedNodes2<\/code>. Calling this function alone will not change the formatting result. It populates a <code>Map&lt;Integer, Integer&gt;<\/code> named <code>posDepths<\/code>. The key is the position and the value is the number of indentations. You can think of an indentation as the number of tabs, even if you use spaces for indentation.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a name=\"indentedNodes2\"><\/a><code>indentedNodes2<\/code><\/h3>\n\n\n\n<p>This function expects the very same input as for <code>indentedNodes1<\/code>. It converts the number of indentations to spaces or tabs according to the formatter configuration and adds them to <code>newLinePositions<\/code>.<\/p>\n\n\n\n<p>The Arbori program uses <code>:indentConditions<\/code> on line 8. This is a parameterless function returning a Boolean value. It&#8217;s part of the formatter and can be used in an Arbori query. <code>:indentConditions<\/code>&nbsp;returns <code>true<\/code> if the setting for &#8220;Line Breaks IF\/CASE\/WHILE&#8221; is set to &#8220;Indented Conditions and Actions&#8221; as in the following screenshot.<\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/indented-conditions-and-actions.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1186\" height=\"600\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/indented-conditions-and-actions.png\" alt=\"\" class=\"wp-image-10901\" style=\"width:593px\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/indented-conditions-and-actions.png 1186w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/indented-conditions-and-actions-300x152.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/indented-conditions-and-actions-1024x518.png 1024w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/indented-conditions-and-actions-768x389.png 768w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/indented-conditions-and-actions-260x132.png 260w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/indented-conditions-and-actions-50x25.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/indented-conditions-and-actions-148x75.png 148w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/indented-conditions-and-actions-1x1.png 1w\" sizes=\"auto, (max-width:767px) 480px, (max-width:1186px) 100vw, 1186px\" \/><\/a><\/figure>\n\n\n\n<p>Here is the Arbori program and the formatting results. The first result is based on the default settings for &#8220;Line Breaks IF\/CASE\/WHILE&#8221; (Indented Actions, Inlined Conditions) and the second result is based on &#8220;Indented Conditions and Actions.<\/p>\n\n\n<div class=\"jq-tabs tabs_wrapper tabs_horizontal\"><ul><li><a href=\"#tab-6a06ef65d8391-1\">Arbori Program<\/a><\/li><li><a href=\"#tab-6a06ef65d8391-2\">Result (with inlined conditions)<\/a><\/li><li><a href=\"#tab-6a06ef65d8391-3\">Result (with indented conditions)<\/a><\/li><\/ul><div id=\"tab-6a06ef65d8391-1\" ><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Arbori Program<\/span><span role=\"button\" tabindex=\"0\" data-code=\"dontFormatNode:\n  &#091;node) numeric_literal\n  -&gt;\n;\n \nindentedNodes:\n    &#091;node) seq_of_stmts\n  | :indentConditions &amp; &#091;node) pls_expr &amp; &#091;node-1) 'IF'\n;\n \nindentedNodes1: indentedNodes \n  -&gt;\n;\n \nindentedNodes2: indentedNodes \n  -&gt;\n;\n \nskipWhiteSpaceBeforeNode:\n  &#091;node) 'dummy_node_skip_ws_before'  \n  -&gt;\n;\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C8C8C8\">dontFormatNode<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">numeric_literal<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #9CDCFE\">indentedNodes<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">    [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">seq_of_stmts<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">  | :<\/span><span style=\"color: #9CDCFE\">indentConditions<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">pls_expr<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;IF&#39;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #9CDCFE\">indentedNodes1<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #9CDCFE\">indentedNodes<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #9CDCFE\">indentedNodes2<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #9CDCFE\">indentedNodes<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">skipWhiteSpaceBeforeNode<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;dummy_node_skip_ws_before&#39;<\/span><span style=\"color: #D4D4D4\">  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span><\/code><\/pre><\/div>\n\n\n<p><\/div><div id=\"tab-6a06ef65d8391-2\" ><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">PL\/SQL Example Code (Formatter Result with Default Settings, Inlined Conditions)<\/span><span role=\"button\" tabindex=\"0\" data-code=\"SET SERVEROUTPUT ON BEGIN\n    FOR R IN ( SELECT ENAME AS EMP_NAME , SAL AS SALARY FROM EMP WHERE DEPTNO IN ( 10 , 20 ) ) LOOP\n        IF R . SALARY &gt; 2.9e3 THEN\n            DBMS_OUTPUT . PUT_LINE ( R . EMP_NAME ) ;\n        END IF ;\n    END LOOP ;\nEND ;\n\/\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line cbp-line-highlight\"><span style=\"color: #569CD6\">SET<\/span><span style=\"color: #D4D4D4\"> SERVEROUTPUT <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">BEGIN<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">FOR<\/span><span style=\"color: #D4D4D4\"> R <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> ( <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> ENAME <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> EMP_NAME , SAL <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> SALARY <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> EMP <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> DEPTNO <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> ( <\/span><span style=\"color: #B5CEA8\">10<\/span><span style=\"color: #D4D4D4\"> , <\/span><span style=\"color: #B5CEA8\">20<\/span><span style=\"color: #D4D4D4\"> ) ) <\/span><span style=\"color: #C586C0\">LOOP<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">IF<\/span><span style=\"color: #D4D4D4\"> R . SALARY &gt; <\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">.9e3 <\/span><span style=\"color: #569CD6\">THEN<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">            DBMS_OUTPUT . PUT_LINE ( R . EMP_NAME ) ;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">END IF<\/span><span style=\"color: #D4D4D4\"> ;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">END LOOP<\/span><span style=\"color: #D4D4D4\"> ;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\"> ;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\/<\/span><\/span><\/code><\/pre><\/div>\n\n\n<p><\/div><div id=\"tab-6a06ef65d8391-3\" ><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">PL\/SQL Example Code (Formatter Result with Indented Conditions)<\/span><span role=\"button\" tabindex=\"0\" data-code=\"SET SERVEROUTPUT ON BEGIN\n    FOR R IN ( SELECT ENAME AS EMP_NAME , SAL AS SALARY FROM EMP WHERE DEPTNO IN ( 10 , 20 ) ) LOOP\n        IF\n            R . SALARY &gt; 2.9e3\n        THEN\n            DBMS_OUTPUT . PUT_LINE ( R . EMP_NAME ) ;\n        END IF ;\n    END LOOP ;\nEND ;\n\/\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">SET<\/span><span style=\"color: #D4D4D4\"> SERVEROUTPUT <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">BEGIN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">FOR<\/span><span style=\"color: #D4D4D4\"> R <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> ( <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> ENAME <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> EMP_NAME , SAL <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> SALARY <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> EMP <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> DEPTNO <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> ( <\/span><span style=\"color: #B5CEA8\">10<\/span><span style=\"color: #D4D4D4\"> , <\/span><span style=\"color: #B5CEA8\">20<\/span><span style=\"color: #D4D4D4\"> ) ) <\/span><span style=\"color: #C586C0\">LOOP<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">IF<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">            R . SALARY &gt; <\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">.9e3<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">THEN<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">            DBMS_OUTPUT . PUT_LINE ( R . EMP_NAME ) ;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">END IF<\/span><span style=\"color: #D4D4D4\"> ;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">END LOOP<\/span><span style=\"color: #D4D4D4\"> ;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\"> ;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\/<\/span><\/span><\/code><\/pre><\/div>\n\n\n<p><\/div><\/div>\n\n\n\n<p>The query condition is defined on lines 6 to 9 and is used on lines 11 and 15. This change has a huge impact on the formatting result. Both results look quite good.<\/p>\n\n\n\n<p>You also see that the Arbori program is responsible for dealing with different formatter settings. To simplify the Arbori program I will ignore all other formatter settings. All further formatting results are based on <code>:indentConditions<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a name=\"skipWhiteSpaceBeforeNode\"><\/a><code>skipWhiteSpaceBeforeNode<\/code><\/h3>\n\n\n\n<p>This function expects an <code>node<\/code> in <code>tuple<\/code>. It adds the starting position of the node to a <code>Map&lt;Integer&gt;<\/code> named <code>skipWSPositions<\/code>. The serializer will use this map and change the default behaviour accordingly. This means it will emit no whitespace instead of a single whitespace at this node position. As a result, the position of <code>skipWhiteSpaceBeforeNode<\/code> in the Arbori program is irrelevant.<\/p>\n\n\n\n<p>Here is the Arbori program and its formatting result.<\/p>\n\n\n<div class=\"jq-tabs tabs_wrapper tabs_horizontal\"><ul><li><a href=\"#tab-6a06ef65d84af-1\">Arbori Program<\/a><\/li><li><a href=\"#tab-6a06ef65d84af-2\">Result<\/a><\/li><\/ul><div id=\"tab-6a06ef65d84af-1\" ><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Arbori Program<\/span><span role=\"button\" tabindex=\"0\" data-code=\"dontFormatNode:\n  &#091;node) numeric_literal\n  -&gt;\n;\n \nindentedNodes:\n    &#091;node) seq_of_stmts\n  | :indentConditions &amp; &#091;node) pls_expr &amp; &#091;node-1) 'IF'\n;\n \nindentedNodes1: indentedNodes \n  -&gt;\n;\n \nindentedNodes2: indentedNodes \n  -&gt;\n;\n \nskipWhiteSpaceBeforeNode:\n    &#091;node) ';'\n  | &#091;node) ','\n  | &#091;node) ')'\n  | &#091;node) '.'\n  -&gt;\n;\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C8C8C8\">dontFormatNode<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">numeric_literal<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">indentedNodes<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">seq_of_stmts<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | :<\/span><span style=\"color: #9CDCFE\">indentConditions<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">pls_expr<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;IF&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">indentedNodes1<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #9CDCFE\">indentedNodes<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">indentedNodes2<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #9CDCFE\">indentedNodes<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #9CDCFE\">skipWhiteSpaceBeforeNode<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">    [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;;&#39;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;,&#39;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;)&#39;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;.&#39;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">;<\/span><\/span><\/code><\/pre><\/div>\n\n\n<p><\/div><div id=\"tab-6a06ef65d84af-2\" ><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">PL\/SQL Example Code (Formatter Result)<\/span><span role=\"button\" tabindex=\"0\" data-code=\"SET SERVEROUTPUT ON BEGIN\n    FOR R IN ( SELECT ENAME AS EMP_NAME, SAL AS SALARY FROM EMP WHERE DEPTNO IN ( 10, 20)) LOOP\n        IF\n            R. SALARY &gt; 2.9e3\n        THEN\n            DBMS_OUTPUT. PUT_LINE ( R. EMP_NAME);\n        END IF;\n    END LOOP;\nEND;\n\/\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">SET<\/span><span style=\"color: #D4D4D4\"> SERVEROUTPUT <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">BEGIN<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">FOR<\/span><span style=\"color: #D4D4D4\"> R <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> ( <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> ENAME <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> EMP_NAME, SAL <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> SALARY <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> EMP <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> DEPTNO <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> ( <\/span><span style=\"color: #B5CEA8\">10<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">20<\/span><span style=\"color: #D4D4D4\">)) <\/span><span style=\"color: #C586C0\">LOOP<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">IF<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">            R. SALARY &gt; <\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">.9e3<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">THEN<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">            DBMS_OUTPUT. PUT_LINE ( R. EMP_NAME);<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">END IF<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">END LOOP<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\/<\/span><\/span><\/code><\/pre><\/div>\n\n\n<p><\/div><\/div>\n\n\n\n<p>The formatter removed the space before <code>;<\/code>, <code>,<\/code>, <code>)<\/code> and <code>.<\/code> on lines 2, 4, 6, 7 and 8.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a name=\"skipWhiteSpaceAfterNode\"><\/a><code>skipWhiteSpaceAfterNode<\/code><\/h3>\n\n\n\n<p>This function expects an <code>node<\/code> in <code>tuple<\/code>. It is similar to <code>skipWhiteSpaceBeforeNode<\/code>. The only difference is that it adds the end position of a node to d <code>skipWSPositions<\/code>.<\/p>\n\n\n\n<p>Here is the Arbori program and its formatting result.<\/p>\n\n\n<div class=\"jq-tabs tabs_wrapper tabs_horizontal\"><ul><li><a href=\"#tab-6a06ef65d85bf-1\">Arbori Program<\/a><\/li><li><a href=\"#tab-6a06ef65d85bf-2\">Result<\/a><\/li><\/ul><div id=\"tab-6a06ef65d85bf-1\" ><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Arbori Program<\/span><span role=\"button\" tabindex=\"0\" data-code=\"dontFormatNode:\n  &#091;node) numeric_literal\n  -&gt;\n;\n \nindentedNodes:\n    &#091;node) seq_of_stmts\n  | :indentConditions &amp; &#091;node) pls_expr &amp; &#091;node-1) 'IF'\n;\n \nindentedNodes1: indentedNodes \n  -&gt;\n;\n \nindentedNodes2: indentedNodes \n  -&gt;\n;\n \nskipWhiteSpaceBeforeNode:\n    &#091;node) ';'\n  | &#091;node) ','\n  | &#091;node) ')'\n  | &#091;node) '.'\n  -&gt;\n;\n \nskipWhiteSpaceAfterNode:\n    &#091;node) '('\n  | &#091;node) '.'\n  -&gt;\n;\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C8C8C8\">dontFormatNode<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">numeric_literal<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">indentedNodes<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">seq_of_stmts<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | :<\/span><span style=\"color: #9CDCFE\">indentConditions<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">pls_expr<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;IF&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">indentedNodes1<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #9CDCFE\">indentedNodes<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">indentedNodes2<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #9CDCFE\">indentedNodes<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">skipWhiteSpaceBeforeNode<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;;&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;,&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;)&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;.&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #9CDCFE\">skipWhiteSpaceAfterNode<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">    [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;(&#39;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;.&#39;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">;<\/span><\/span><\/code><\/pre><\/div>\n\n\n<p><\/div><div id=\"tab-6a06ef65d85bf-2\" ><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">PL\/SQL Example Code (Formatter Result)<\/span><span role=\"button\" tabindex=\"0\" data-code=\"SET SERVEROUTPUT ON BEGIN\n    FOR R IN (SELECT ENAME AS EMP_NAME, SAL AS SALARY FROM EMP WHERE DEPTNO IN (10, 20)) LOOP\n        IF\n            R.SALARY &gt; 2.9e3\n        THEN\n            DBMS_OUTPUT.PUT_LINE (R.EMP_NAME);\n        END IF;\n    END LOOP;\nEND;\n\/\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">SET<\/span><span style=\"color: #D4D4D4\"> SERVEROUTPUT <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">BEGIN<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">FOR<\/span><span style=\"color: #D4D4D4\"> R <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> ENAME <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> EMP_NAME, SAL <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> SALARY <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> EMP <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> DEPTNO <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #B5CEA8\">10<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">20<\/span><span style=\"color: #D4D4D4\">)) <\/span><span style=\"color: #C586C0\">LOOP<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">IF<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">            R.SALARY &gt; <\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">.9e3<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">THEN<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #DCDCAA\">DBMS_OUTPUT.<\/span><span style=\"color: #4EC9B0\">PUT_LINE<\/span><span style=\"color: #D4D4D4\"> (R.EMP_NAME);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">END IF<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">END LOOP<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\/<\/span><\/span><\/code><\/pre><\/div>\n\n\n<p><\/div><\/div>\n\n\n\n<p>The formatter removed the space after <code>(<\/code>, and <code>.<\/code> on lineS 2, 4 and 6.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a name=\"identifiers\"><\/a><code>identifiers<\/code><\/h3>\n\n\n\n<p>This function expects an <code>identifier<\/code>&nbsp;in <code>tuple<\/code>. It populates a <code>Map&lt;String, String&gt;<\/code> named <code>caseIds<\/code>. The key is an interval representation of a node (containing to and from position). The value contains the identifier according to the formatter settings. The serializer will use this map to emit the identifiers in the configured case. <code>newLinePositions<\/code> is not used. As a result, the position of <code>identifiers<\/code>&nbsp;in the Arbori program is irrelevant.<\/p>\n\n\n\n<p>Here is the Arbori program and its formatting result.<\/p>\n\n\n<div class=\"jq-tabs tabs_wrapper tabs_horizontal\"><ul><li><a href=\"#tab-6a06ef65d86ec-1\">Arbori Program<\/a><\/li><li><a href=\"#tab-6a06ef65d86ec-2\">Result<\/a><\/li><\/ul><div id=\"tab-6a06ef65d86ec-1\" ><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Arbori Program<\/span><span role=\"button\" tabindex=\"0\" data-code=\"dontFormatNode:\n  &#091;node) numeric_literal\n  -&gt;\n;\n \nindentedNodes:\n    &#091;node) seq_of_stmts\n  | :indentConditions &amp; &#091;node) pls_expr &amp; &#091;node-1) 'IF'\n;\n \nindentedNodes1: indentedNodes \n  -&gt;\n;\n \nindentedNodes2: indentedNodes \n  -&gt;\n;\n \nskipWhiteSpaceBeforeNode:\n    &#091;node) ';'\n  | &#091;node) ','\n  | &#091;node) ')'\n  | &#091;node) '.'\n  -&gt;\n;\n \nskipWhiteSpaceAfterNode:\n    &#091;node) '('\n  | &#091;node) '.'\n  -&gt;\n;\n \nidentifiers:\n  &#091;identifier) identifier \n  -&gt; \n;\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C8C8C8\">dontFormatNode<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">numeric_literal<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">indentedNodes<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">seq_of_stmts<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | :<\/span><span style=\"color: #9CDCFE\">indentConditions<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">pls_expr<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;IF&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">indentedNodes1<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #9CDCFE\">indentedNodes<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">indentedNodes2<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #9CDCFE\">indentedNodes<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">skipWhiteSpaceBeforeNode<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;;&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;,&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;)&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;.&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">skipWhiteSpaceAfterNode<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;(&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;.&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #9CDCFE\">identifiers<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">identifier<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">identifier<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">  -&gt; <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">;<\/span><\/span><\/code><\/pre><\/div>\n\n\n<p><\/div><div id=\"tab-6a06ef65d86ec-2\" ><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">PL\/SQL Example Code (Formatter Result)<\/span><span role=\"button\" tabindex=\"0\" data-code=\"SET SERVEROUTPUT ON BEGIN\n    FOR r IN (SELECT ename AS emp_name, sal AS salary FROM emp WHERE deptno IN (10, 20)) LOOP\n        IF\n            r.salary &gt; 2.9e3\n        THEN\n            dbms_output.put_line (r.emp_name);\n        END IF;\n    END LOOP;\nEND;\n\/\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">SET<\/span><span style=\"color: #D4D4D4\"> SERVEROUTPUT <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">BEGIN<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">FOR<\/span><span style=\"color: #D4D4D4\"> r <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> ename <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> emp_name, sal <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> salary <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> emp <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> deptno <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #B5CEA8\">10<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">20<\/span><span style=\"color: #D4D4D4\">)) <\/span><span style=\"color: #C586C0\">LOOP<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">IF<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">            r.salary &gt; <\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">.9e3<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">THEN<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #DCDCAA\">dbms_output.<\/span><span style=\"color: #4EC9B0\">put_line<\/span><span style=\"color: #D4D4D4\"> (r.emp_name);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">END IF<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">END LOOP<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\/<\/span><\/span><\/code><\/pre><\/div>\n\n\n<p><\/div><\/div>\n\n\n\n<p>You see that the identifiers <code>r<\/code>, <code>ename<\/code>, <code>emp_name<\/code>, <code>sal<\/code>, <code>salary<\/code>, <code>emp<\/code>, <code>dbms_output<\/code> and <code>put_line<\/code> are in lowercase.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a name=\"extraBrkBefore\"><\/a><code>extraBrkBefore<\/code><\/h3>\n\n\n\n<p>This function expects an <code>node<\/code> in <code>tuple<\/code>. It extracts the whitespace at the starting position <code>newLinePositions<\/code> and adds a leading newline.<\/p>\n\n\n\n<p>Here is the Arbori program and its formatting result.<\/p>\n\n\n<div class=\"jq-tabs tabs_wrapper tabs_horizontal\"><ul><li><a href=\"#tab-6a06ef65d8836-1\">Arbori Program<\/a><\/li><li><a href=\"#tab-6a06ef65d8836-2\">Result<\/a><\/li><\/ul><div id=\"tab-6a06ef65d8836-1\" ><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Arbori Program<\/span><span role=\"button\" tabindex=\"0\" data-code=\"dontFormatNode:\n  &#091;node) numeric_literal\n  -&gt;\n;\n \nindentedNodes:\n    &#091;node) seq_of_stmts\n  | :indentConditions &amp; &#091;node) pls_expr &amp; &#091;node-1) 'IF'\n;\n \nindentedNodes1: indentedNodes \n  -&gt;\n;\n \nindentedNodes2: indentedNodes \n  -&gt;\n;\n \nskipWhiteSpaceBeforeNode:\n    &#091;node) ';'\n  | &#091;node) ','\n  | &#091;node) ')'\n  | &#091;node) '.'\n  -&gt;\n;\n \nskipWhiteSpaceAfterNode:\n    &#091;node) '('\n  | &#091;node) '.'\n  -&gt;\n;\n \nidentifiers:\n  &#091;identifier) identifier \n  -&gt; \n;\n \nextraBrkBefore: \n    &#091;node) sql_statement\n  | &#091;node) from_clause\n  | &#091;node) where_clause\n  | &#091;node) 'LOOP' &amp; &#091;node-1) iteration_scheme\n  -&gt;\n;\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C8C8C8\">dontFormatNode<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">numeric_literal<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">indentedNodes<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">seq_of_stmts<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | :<\/span><span style=\"color: #9CDCFE\">indentConditions<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">pls_expr<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;IF&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">indentedNodes1<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #9CDCFE\">indentedNodes<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">indentedNodes2<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #9CDCFE\">indentedNodes<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">skipWhiteSpaceBeforeNode<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;;&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;,&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;)&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;.&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">skipWhiteSpaceAfterNode<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;(&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;.&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">identifiers<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">identifier<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">identifier<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt; <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #9CDCFE\">extraBrkBefore<\/span><span style=\"color: #D4D4D4\">: <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">    [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">sql_statement<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">from_clause<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">where_clause<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;LOOP&#39;<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">iteration_scheme<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">;<\/span><\/span><\/code><\/pre><\/div>\n\n\n<p><\/div><div id=\"tab-6a06ef65d8836-2\" ><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">PL\/SQL Example Code (Formatter Result)<\/span><span role=\"button\" tabindex=\"0\" data-code=\"SET SERVEROUTPUT ON\nBEGIN\n    FOR r IN (SELECT ename AS emp_name, sal AS salary\n    FROM emp\n    WHERE deptno IN (10, 20))\n    LOOP\n        IF\n            r.salary &gt; 2.9e3\n        THEN\n            dbms_output.put_line (r.emp_name);\n        END IF;\n    END LOOP;\nEND;\n\/\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line cbp-line-highlight\"><span style=\"color: #569CD6\">SET<\/span><span style=\"color: #D4D4D4\"> SERVEROUTPUT <\/span><span style=\"color: #569CD6\">ON<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #569CD6\">BEGIN<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">FOR<\/span><span style=\"color: #D4D4D4\"> r <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> ename <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> emp_name, sal <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> salary<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> emp<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> deptno <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #B5CEA8\">10<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">20<\/span><span style=\"color: #D4D4D4\">))<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">LOOP<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">IF<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            r.salary &gt; <\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">.9e3<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">THEN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #DCDCAA\">dbms_output.<\/span><span style=\"color: #4EC9B0\">put_line<\/span><span style=\"color: #D4D4D4\"> (r.emp_name);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">END IF<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">END LOOP<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\/<\/span><\/span><\/code><\/pre><\/div>\n\n\n<p><\/div><\/div>\n\n\n\n<p>The formatter added a newline before <code>BEGIN<\/code> on line 2, before <code>FROM<\/code> on line 4, before <code>WHERE<\/code> on line 5 and before <code>LOOP<\/code> on line 6.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a name=\"extraBrkAfter\"><\/a><code>extraBrkAfter<\/code><\/h3>\n\n\n\n<p>This function expects an <code>node<\/code> in <code>tuple<\/code>. It is similar to <code>extraBrkBefore<\/code>. The only difference is that it adds the end position of a node to <code>newLinePositions<\/code>.<\/p>\n\n\n\n<p>Here is the Arbori program and its formatting result.<\/p>\n\n\n<div class=\"jq-tabs tabs_wrapper tabs_horizontal\"><ul><li><a href=\"#tab-6a06ef65d899a-1\">Arbori Program<\/a><\/li><li><a href=\"#tab-6a06ef65d899a-2\">Result<\/a><\/li><\/ul><div id=\"tab-6a06ef65d899a-1\" ><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Arbori Program<\/span><span role=\"button\" tabindex=\"0\" data-code=\"dontFormatNode:\n  &#091;node) numeric_literal\n  -&gt;\n;\n \nindentedNodes:\n    &#091;node) seq_of_stmts\n  | :indentConditions &amp; &#091;node) pls_expr &amp; &#091;node-1) 'IF'\n;\n \nindentedNodes1: indentedNodes \n  -&gt;\n;\n \nindentedNodes2: indentedNodes \n  -&gt;\n;\n \nskipWhiteSpaceBeforeNode:\n    &#091;node) ';'\n  | &#091;node) ','\n  | &#091;node) ')'\n  | &#091;node) '.'\n  -&gt;\n;\n \nskipWhiteSpaceAfterNode:\n    &#091;node) '('\n  | &#091;node) '.'\n  -&gt;\n;\n \nidentifiers:\n  &#091;identifier) identifier \n  -&gt; \n;\n \nextraBrkBefore: \n    &#091;node) sql_statement\n  | &#091;node) from_clause\n  | &#091;node) where_clause\n  | &#091;node) 'LOOP' &amp; &#091;node-1) iteration_scheme\n  -&gt;\n;\n \nextraBrkAfter: \n  &#091;node) ',' &amp; &#091;node+1) select_term \n  -&gt;\n;\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C8C8C8\">dontFormatNode<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">numeric_literal<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">indentedNodes<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">seq_of_stmts<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | :<\/span><span style=\"color: #9CDCFE\">indentConditions<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">pls_expr<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;IF&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">indentedNodes1<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #9CDCFE\">indentedNodes<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">indentedNodes2<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #9CDCFE\">indentedNodes<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">skipWhiteSpaceBeforeNode<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;;&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;,&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;)&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;.&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">skipWhiteSpaceAfterNode<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;(&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;.&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">identifiers<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">identifier<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">identifier<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt; <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">extraBrkBefore<\/span><span style=\"color: #D4D4D4\">: <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">sql_statement<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">from_clause<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">where_clause<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;LOOP&#39;<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">iteration_scheme<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #9CDCFE\">extraBrkAfter<\/span><span style=\"color: #D4D4D4\">: <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;,&#39;<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">+<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">select_term<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">;<\/span><\/span><\/code><\/pre><\/div>\n\n\n<p><\/div><div id=\"tab-6a06ef65d899a-2\" ><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">PL\/SQL Example Code (Formatter Result)<\/span><span role=\"button\" tabindex=\"0\" data-code=\"SET SERVEROUTPUT ON\nBEGIN\n    FOR r IN (SELECT ename AS emp_name,\n    sal AS salary\n    FROM emp\n    WHERE deptno IN (10, 20))\n    LOOP\n        IF\n            r.salary &gt; 2.9e3\n        THEN\n            dbms_output.put_line (r.emp_name);\n        END IF;\n    END LOOP;\nEND;\n\/\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">SET<\/span><span style=\"color: #D4D4D4\"> SERVEROUTPUT <\/span><span style=\"color: #569CD6\">ON<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">BEGIN<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">FOR<\/span><span style=\"color: #D4D4D4\"> r <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> ename <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> emp_name,<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">    sal <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> salary<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> emp<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> deptno <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #B5CEA8\">10<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">20<\/span><span style=\"color: #D4D4D4\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">LOOP<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">IF<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            r.salary &gt; <\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">.9e3<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">THEN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #DCDCAA\">dbms_output.<\/span><span style=\"color: #4EC9B0\">put_line<\/span><span style=\"color: #D4D4D4\"> (r.emp_name);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">END IF<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">END LOOP<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\/<\/span><\/span><\/code><\/pre><\/div>\n\n\n<p><\/div><\/div>\n\n\n\n<p>The formatter added a newline after <code>,<\/code> on line 3.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a name=\"brkX2\"><\/a><code>brkX2<\/code><\/h3>\n\n\n\n<p>This function expects an <code>node<\/code> in <code>tuple<\/code>. A node identifies a significant statement.<\/p>\n\n\n\n<p>Depending on the setting for &#8220;Line Breaks After statement&#8221; one or two newlines are added to <code>newLinePositions<\/code>. For &#8220;Preserve Original&#8221; the original newline characters will be extracted from the source during serialization. &#8220;Preserve Original&#8221; means that it will also preserve missing newlines. As a result, the formatting result may differ based on the input.<\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/double-break.png\"><img loading=\"lazy\" decoding=\"async\" width=\"736\" height=\"502\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/double-break.png\" alt=\"\" class=\"wp-image-10950\" style=\"width:360px\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/double-break.png 736w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/double-break-300x205.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/double-break-214x146.png 214w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/double-break-50x34.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/double-break-110x75.png 110w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/double-break-1x1.png 1w\" sizes=\"auto, (max-width:767px) 480px, 736px\" \/><\/a><\/figure>\n\n\n\n<p>&#8220;Double break&#8221; is the default.<\/p>\n\n\n\n<p>Here is the Arbori program and its formatting result.<\/p>\n\n\n<div class=\"jq-tabs tabs_wrapper tabs_horizontal\"><ul><li><a href=\"#tab-6a06ef65d8afb-1\">Arbori Program<\/a><\/li><li><a href=\"#tab-6a06ef65d8afb-2\">Result<\/a><\/li><\/ul><div id=\"tab-6a06ef65d8afb-1\" ><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Arbori Program<\/span><span role=\"button\" tabindex=\"0\" data-code=\"dontFormatNode:\n  &#091;node) numeric_literal\n  -&gt;\n;\n \nindentedNodes:\n    &#091;node) seq_of_stmts\n  | :indentConditions &amp; &#091;node) pls_expr &amp; &#091;node-1) 'IF'\n;\n \nindentedNodes1: indentedNodes \n  -&gt;\n;\n \nindentedNodes2: indentedNodes \n  -&gt;\n;\n \nskipWhiteSpaceBeforeNode:\n    &#091;node) ';'\n  | &#091;node) ','\n  | &#091;node) ')'\n  | &#091;node) '.'\n  -&gt;\n;\n \nskipWhiteSpaceAfterNode:\n    &#091;node) '('\n  | &#091;node) '.'\n  -&gt;\n;\n \nidentifiers:\n  &#091;identifier) identifier \n  -&gt; \n;\n \nextraBrkBefore: \n    &#091;node) sql_statement\n  | &#091;node) from_clause\n  | &#091;node) where_clause\n  | &#091;node) 'LOOP' &amp; &#091;node-1) iteration_scheme\n  -&gt;\n;\n \nextraBrkAfter: \n  &#091;node) ',' &amp; &#091;node+1) select_term \n  -&gt;\n;\n \nbrkX2:\n  &#091;node) sql_statement\n  -&gt;\n;\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C8C8C8\">dontFormatNode<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">numeric_literal<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">indentedNodes<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">seq_of_stmts<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | :<\/span><span style=\"color: #9CDCFE\">indentConditions<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">pls_expr<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;IF&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">indentedNodes1<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #9CDCFE\">indentedNodes<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">indentedNodes2<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #9CDCFE\">indentedNodes<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">skipWhiteSpaceBeforeNode<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;;&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;,&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;)&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;.&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">skipWhiteSpaceAfterNode<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;(&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;.&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">identifiers<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">identifier<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">identifier<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt; <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">extraBrkBefore<\/span><span style=\"color: #D4D4D4\">: <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">sql_statement<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">from_clause<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">where_clause<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;LOOP&#39;<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">iteration_scheme<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">extraBrkAfter<\/span><span style=\"color: #D4D4D4\">: <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;,&#39;<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">+<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">select_term<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #9CDCFE\">brkX2<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">sql_statement<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">;<\/span><\/span><\/code><\/pre><\/div>\n\n\n<p><\/div><div id=\"tab-6a06ef65d8afb-2\" ><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">PL\/SQL Example Code (Formatter Result)<\/span><span role=\"button\" tabindex=\"0\" data-code=\"SET SERVEROUTPUT ON\n \nBEGIN\n    FOR r IN (SELECT ename AS emp_name,\n    sal AS salary\n    FROM emp\n    WHERE deptno IN (10, 20))\n    LOOP\n        IF\n            r.salary &gt; 2.9e3\n        THEN\n            dbms_output.put_line (r.emp_name);\n        END IF;\n    END LOOP;\nEND;\n\/\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">SET<\/span><span style=\"color: #D4D4D4\"> SERVEROUTPUT <\/span><span style=\"color: #569CD6\">ON<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">BEGIN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">FOR<\/span><span style=\"color: #D4D4D4\"> r <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> ename <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> emp_name,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    sal <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> salary<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> emp<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> deptno <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #B5CEA8\">10<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">20<\/span><span style=\"color: #D4D4D4\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">LOOP<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">IF<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            r.salary &gt; <\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">.9e3<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">THEN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #DCDCAA\">dbms_output.<\/span><span style=\"color: #4EC9B0\">put_line<\/span><span style=\"color: #D4D4D4\"> (r.emp_name);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">END IF<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">END LOOP<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\/<\/span><\/span><\/code><\/pre><\/div>\n\n\n<p><\/div><\/div>\n\n\n\n<p>The formatting result has an additional empty line on line 2.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a name=\"rightAlignments\"><\/a><code>rightAlignments<\/code><\/h3>\n\n\n\n<p>This function expects an <code>node<\/code> in <code>tuple<\/code>. It calculates the length in characters of the passed node. If it is less than 6 (the length of the <code>SELECT<\/code> keyword), then the missing spaces are added to <code>newLinePositions<\/code>.<\/p>\n\n\n\n<p>Here is the Arbori program and its formatting result.<\/p>\n\n\n<div class=\"jq-tabs tabs_wrapper tabs_horizontal\"><ul><li><a href=\"#tab-6a06ef65d8c72-1\">Arbori Program<\/a><\/li><li><a href=\"#tab-6a06ef65d8c72-2\">Result<\/a><\/li><\/ul><div id=\"tab-6a06ef65d8c72-1\" ><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Arbori Program<\/span><span role=\"button\" tabindex=\"0\" data-code=\"dontFormatNode:\n  &#091;node) numeric_literal\n  -&gt;\n;\n \nindentedNodes:\n    &#091;node) seq_of_stmts\n  | :indentConditions &amp; &#091;node) pls_expr &amp; &#091;node-1) 'IF'\n;\n \nindentedNodes1: indentedNodes \n  -&gt;\n;\n \nindentedNodes2: indentedNodes \n  -&gt;\n;\n \nskipWhiteSpaceBeforeNode:\n    &#091;node) ';'\n  | &#091;node) ','\n  | &#091;node) ')'\n  | &#091;node) '.'\n  -&gt;\n;\n \nskipWhiteSpaceAfterNode:\n    &#091;node) '('\n  | &#091;node) '.'\n  -&gt;\n;\n \nidentifiers:\n  &#091;identifier) identifier \n  -&gt; \n;\n \nextraBrkBefore: \n    &#091;node) sql_statement\n  | &#091;node) from_clause\n  | &#091;node) where_clause\n  | &#091;node) 'LOOP' &amp; &#091;node-1) iteration_scheme\n  -&gt;\n;\n \nextraBrkAfter: \n  &#091;node) ',' &amp; &#091;node+1) select_term \n  -&gt;\n;\n \nbrkX2:\n  &#091;node) sql_statement\n  -&gt;\n;\n \nrightAlignments:\n    &#091;node) 'FROM'\n  | &#091;node) 'WHERE'\n  -&gt;\n;\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C8C8C8\">dontFormatNode<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">numeric_literal<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">indentedNodes<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">seq_of_stmts<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | :<\/span><span style=\"color: #9CDCFE\">indentConditions<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">pls_expr<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;IF&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">indentedNodes1<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #9CDCFE\">indentedNodes<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">indentedNodes2<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #9CDCFE\">indentedNodes<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">skipWhiteSpaceBeforeNode<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;;&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;,&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;)&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;.&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">skipWhiteSpaceAfterNode<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;(&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;.&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">identifiers<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">identifier<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">identifier<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt; <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">extraBrkBefore<\/span><span style=\"color: #D4D4D4\">: <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">sql_statement<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">from_clause<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">where_clause<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;LOOP&#39;<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">iteration_scheme<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">extraBrkAfter<\/span><span style=\"color: #D4D4D4\">: <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;,&#39;<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">+<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">select_term<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">brkX2<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">sql_statement<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #9CDCFE\">rightAlignments<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">    [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;FROM&#39;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;WHERE&#39;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">;<\/span><\/span><\/code><\/pre><\/div>\n\n\n<p><\/div><div id=\"tab-6a06ef65d8c72-2\" ><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">PL\/SQL Example Code (Formatter Result)<\/span><span role=\"button\" tabindex=\"0\" data-code=\"SET SERVEROUTPUT ON\n \nBEGIN\n    FOR r IN (SELECT ename AS emp_name,\n    sal AS salary\n      FROM emp\n     WHERE deptno IN (10, 20))\n    LOOP\n        IF\n            r.salary &gt; 2.9e3\n        THEN\n            dbms_output.put_line (r.emp_name);\n        END IF;\n    END LOOP;\nEND;\n\/\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">SET<\/span><span style=\"color: #D4D4D4\"> SERVEROUTPUT <\/span><span style=\"color: #569CD6\">ON<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">BEGIN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">FOR<\/span><span style=\"color: #D4D4D4\"> r <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> ename <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> emp_name,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    sal <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> salary<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> emp<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">     <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> deptno <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #B5CEA8\">10<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">20<\/span><span style=\"color: #D4D4D4\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">LOOP<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">IF<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            r.salary &gt; <\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">.9e3<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">THEN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #DCDCAA\">dbms_output.<\/span><span style=\"color: #4EC9B0\">put_line<\/span><span style=\"color: #D4D4D4\"> (r.emp_name);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">END IF<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">END LOOP<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\/<\/span><\/span><\/code><\/pre><\/div>\n\n\n<p><\/div><\/div>\n\n\n\n<p>The formatter added two spaces before the <code>FROM<\/code> on line 6 and one space before the <code>WHERE<\/code> on line 7. However, the query block is not yet right-aligned. This will happen in <code>incrementalAlignments<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a name=\"paddedIdsInScope\"><\/a><code>paddedIdsInScope<\/code><\/h3>\n\n\n\n<p>This function expects a <code>scope<\/code>, <code>predecessor<\/code> and <code>follower<\/code>&nbsp;in <code>tuple<\/code>.&nbsp;It populates the following fields:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>maxLengthInScope<\/code> of type <code>Map&lt;String, Integer&gt;<\/code>, where the key is an interval representation of a <code>scope<\/code> (containing to and from position) and the value of the calculated max length<\/li>\n\n\n\n<li><code>id2scope<\/code> of type <code>Map&lt;Integer, String&gt;<\/code>, where the key is the start position of a <code>follower<\/code> node and the value an interval representation of a <code>scope<\/code>&nbsp;(containing to and from position)<\/li>\n\n\n\n<li><code>id2interval<\/code> of type <code>Map&lt;Integer, Integer&gt;<\/code>, where the key is the start position of a <code>follower<\/code> node and the value of the start position of a <code>predecessor<\/code> node<\/li>\n\n\n\n<li><code>id2adjustments<\/code> of type <code>Map&lt;Integer, Integer&gt;<\/code>, where the key is the start position of a <code>follower<\/code> node and the value is the indentation<\/li>\n<\/ul>\n\n\n\n<p>The <code>newLinePositions<\/code> field is read but not written. As a result, the position of <code>paddedIdsInScope<\/code> in the Arbori program is important.<\/p>\n\n\n\n<p>The serializer adds the necessary number of spaces between the <code>predecessor<\/code> and <code>follower<\/code> nodes to left-align <code>followers<\/code> within the <code>scope<\/code>.<\/p>\n\n\n\n<p>Here is the Arbori program and its formatting result.<\/p>\n\n\n<div class=\"jq-tabs tabs_wrapper tabs_horizontal\"><ul><li><a href=\"#tab-6a06ef65d8e03-1\">Arbori Program<\/a><\/li><li><a href=\"#tab-6a06ef65d8e03-2\">Result<\/a><\/li><\/ul><div id=\"tab-6a06ef65d8e03-1\" ><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Arbori Program<\/span><span role=\"button\" tabindex=\"0\" data-code=\"dontFormatNode:\n  &#091;node) numeric_literal\n  -&gt;\n;\n \nindentedNodes:\n    &#091;node) seq_of_stmts\n  | :indentConditions &amp; &#091;node) pls_expr &amp; &#091;node-1) 'IF'\n;\n \nindentedNodes1: indentedNodes \n  -&gt;\n;\n \nindentedNodes2: indentedNodes \n  -&gt;\n;\n \nskipWhiteSpaceBeforeNode:\n    &#091;node) ';'\n  | &#091;node) ','\n  | &#091;node) ')'\n  | &#091;node) '.'\n  -&gt;\n;\n \nskipWhiteSpaceAfterNode:\n    &#091;node) '('\n  | &#091;node) '.'\n  -&gt;\n;\n \nidentifiers:\n  &#091;identifier) identifier \n  -&gt; \n;\n \nextraBrkBefore: \n    &#091;node) sql_statement\n  | &#091;node) from_clause\n  | &#091;node) where_clause\n  | &#091;node) 'LOOP' &amp; &#091;node-1) iteration_scheme\n  -&gt;\n;\n \nextraBrkAfter: \n  &#091;node) ',' &amp; &#091;node+1) select_term \n  -&gt;\n;\n \nbrkX2:\n  &#091;node) sql_statement\n  -&gt;\n;\n \nrightAlignments:\n    &#091;node) 'FROM'\n  | &#091;node) 'WHERE'\n  -&gt;\n;\n \npaddedIdsInScope:\n  &#091;id) expr &amp; &#091;id^) select_term &amp; &#091;id+1) as_alias &amp; &#091;scope) select_clause\n            &amp; scope &lt; id &amp; predecessor = id &amp; follower = id+1\n  -&gt;\n;\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C8C8C8\">dontFormatNode<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">numeric_literal<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">indentedNodes<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">seq_of_stmts<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | :<\/span><span style=\"color: #9CDCFE\">indentConditions<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">pls_expr<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;IF&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">indentedNodes1<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #9CDCFE\">indentedNodes<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">indentedNodes2<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #9CDCFE\">indentedNodes<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">skipWhiteSpaceBeforeNode<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;;&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;,&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;)&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;.&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">skipWhiteSpaceAfterNode<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;(&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;.&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">identifiers<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">identifier<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">identifier<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt; <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">extraBrkBefore<\/span><span style=\"color: #D4D4D4\">: <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">sql_statement<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">from_clause<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">where_clause<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;LOOP&#39;<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">iteration_scheme<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">extraBrkAfter<\/span><span style=\"color: #D4D4D4\">: <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;,&#39;<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">+<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">select_term<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">brkX2<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">sql_statement<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">rightAlignments<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;FROM&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;WHERE&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #9CDCFE\">paddedIdsInScope<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">id<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">expr<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">id<\/span><span style=\"color: #D4D4D4\">^) <\/span><span style=\"color: #9CDCFE\">select_term<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">id<\/span><span style=\"color: #D4D4D4\">+<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">as_alias<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">scope<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">select_clause<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">            &amp; <\/span><span style=\"color: #9CDCFE\">scope<\/span><span style=\"color: #D4D4D4\"> &lt; <\/span><span style=\"color: #9CDCFE\">id<\/span><span style=\"color: #D4D4D4\"> &amp; <\/span><span style=\"color: #9CDCFE\">predecessor<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">id<\/span><span style=\"color: #D4D4D4\"> &amp; <\/span><span style=\"color: #9CDCFE\">follower<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">id<\/span><span style=\"color: #D4D4D4\">+<\/span><span style=\"color: #B5CEA8\">1<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">;<\/span><\/span><\/code><\/pre><\/div>\n\n\n<p><\/div><div id=\"tab-6a06ef65d8e03-2\" ><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">PL\/SQL Example Code (Formatter Result)<\/span><span role=\"button\" tabindex=\"0\" data-code=\"SET SERVEROUTPUT ON\n \nBEGIN\n    FOR r IN (SELECT ename  AS emp_name,\n    sal    AS salary\n      FROM emp\n     WHERE deptno IN (10, 20))\n    LOOP\n        IF\n            r.salary &gt; 2.9e3\n        THEN\n            dbms_output.put_line (r.emp_name);\n        END IF;\n    END LOOP;\nEND;\n\/\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">SET<\/span><span style=\"color: #D4D4D4\"> SERVEROUTPUT <\/span><span style=\"color: #569CD6\">ON<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">BEGIN<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">FOR<\/span><span style=\"color: #D4D4D4\"> r <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> ename  <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> emp_name,<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">    sal    <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> salary<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> emp<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">     <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> deptno <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #B5CEA8\">10<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">20<\/span><span style=\"color: #D4D4D4\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">LOOP<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">IF<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            r.salary &gt; <\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">.9e3<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">THEN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #DCDCAA\">dbms_output.<\/span><span style=\"color: #4EC9B0\">put_line<\/span><span style=\"color: #D4D4D4\"> (r.emp_name);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">END IF<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">END LOOP<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\/<\/span><\/span><\/code><\/pre><\/div>\n\n\n<p><\/div><\/div>\n\n\n\n<p>The formatter added one space before the <code>AS<\/code> on line 4 and two spaces before the <code>AS<\/code> on line 5. However, the result looks wrong because <code>ename<\/code> and <code>sal<\/code> are not yet left-aligned. This will happen in <code>pairwiseAlignments<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a name=\"incrementalAlignments\"><\/a><code>incrementalAlignments<\/code><\/h3>\n\n\n\n<p>This function expects an <code>node<\/code> in <code>tuple<\/code>. It adds spaces to all children with a content in <code>newLinePositions<\/code> to left-align them with the start position in <code>node<\/code>.<\/p>\n\n\n\n<p>Here is the Arbori program and its formatting result.<\/p>\n\n\n<div class=\"jq-tabs tabs_wrapper tabs_horizontal\"><ul><li><a href=\"#tab-6a06ef65d8faf-1\">Arbori Program<\/a><\/li><li><a href=\"#tab-6a06ef65d8faf-2\">Result<\/a><\/li><\/ul><div id=\"tab-6a06ef65d8faf-1\" ><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Arbori Program<\/span><span role=\"button\" tabindex=\"0\" data-code=\"dontFormatNode:\n  &#091;node) numeric_literal\n  -&gt;\n;\n \nindentedNodes:\n    &#091;node) seq_of_stmts\n  | :indentConditions &amp; &#091;node) pls_expr &amp; &#091;node-1) 'IF'\n;\n \nindentedNodes1: indentedNodes \n  -&gt;\n;\n \nindentedNodes2: indentedNodes \n  -&gt;\n;\n \nskipWhiteSpaceBeforeNode:\n    &#091;node) ';'\n  | &#091;node) ','\n  | &#091;node) ')'\n  | &#091;node) '.'\n  -&gt;\n;\n \nskipWhiteSpaceAfterNode:\n    &#091;node) '('\n  | &#091;node) '.'\n  -&gt;\n;\n \nidentifiers:\n  &#091;identifier) identifier \n  -&gt; \n;\n \nextraBrkBefore: \n    &#091;node) sql_statement\n  | &#091;node) from_clause\n  | &#091;node) where_clause\n  | &#091;node) 'LOOP' &amp; &#091;node-1) iteration_scheme\n  -&gt;\n;\n \nextraBrkAfter: \n  &#091;node) ',' &amp; &#091;node+1) select_term \n  -&gt;\n;\n \nbrkX2:\n  &#091;node) sql_statement\n  -&gt;\n;\n \nrightAlignments:\n    &#091;node) 'FROM'\n  | &#091;node) 'WHERE'\n  -&gt;\n;\n \npaddedIdsInScope:\n  &#091;id) expr &amp; &#091;id^) select_term &amp; &#091;id+1) as_alias &amp; &#091;scope) select_clause\n            &amp; scope &lt; id &amp; predecessor = id &amp; follower = id+1\n  -&gt;\n;\n \nincrementalAlignments:  \n  &#091;node) subquery\n  -&gt;\n;\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C8C8C8\">dontFormatNode<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">numeric_literal<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">indentedNodes<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">seq_of_stmts<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | :<\/span><span style=\"color: #9CDCFE\">indentConditions<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">pls_expr<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;IF&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">indentedNodes1<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #9CDCFE\">indentedNodes<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">indentedNodes2<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #9CDCFE\">indentedNodes<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">skipWhiteSpaceBeforeNode<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;;&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;,&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;)&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;.&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">skipWhiteSpaceAfterNode<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;(&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;.&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">identifiers<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">identifier<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">identifier<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt; <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">extraBrkBefore<\/span><span style=\"color: #D4D4D4\">: <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">sql_statement<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">from_clause<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">where_clause<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;LOOP&#39;<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">iteration_scheme<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">extraBrkAfter<\/span><span style=\"color: #D4D4D4\">: <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;,&#39;<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">+<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">select_term<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">brkX2<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">sql_statement<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">rightAlignments<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;FROM&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;WHERE&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">paddedIdsInScope<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">id<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">expr<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">id<\/span><span style=\"color: #D4D4D4\">^) <\/span><span style=\"color: #9CDCFE\">select_term<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">id<\/span><span style=\"color: #D4D4D4\">+<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">as_alias<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">scope<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">select_clause<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            &amp; <\/span><span style=\"color: #9CDCFE\">scope<\/span><span style=\"color: #D4D4D4\"> &lt; <\/span><span style=\"color: #9CDCFE\">id<\/span><span style=\"color: #D4D4D4\"> &amp; <\/span><span style=\"color: #9CDCFE\">predecessor<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">id<\/span><span style=\"color: #D4D4D4\"> &amp; <\/span><span style=\"color: #9CDCFE\">follower<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">id<\/span><span style=\"color: #D4D4D4\">+<\/span><span style=\"color: #B5CEA8\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #9CDCFE\">incrementalAlignments<\/span><span style=\"color: #D4D4D4\">:  <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">subquery<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">;<\/span><\/span><\/code><\/pre><\/div>\n\n\n<p><\/div><div id=\"tab-6a06ef65d8faf-2\" ><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">PL\/SQL Example Code (Formatter Result)<\/span><span role=\"button\" tabindex=\"0\" data-code=\"SET SERVEROUTPUT ON\n \nBEGIN\n    FOR r IN (SELECT ename  AS emp_name,\n              sal    AS salary\n                FROM emp\n               WHERE deptno IN (10, 20))\n    LOOP\n        IF\n            r.salary &gt; 2.9e3\n        THEN\n            dbms_output.put_line (r.emp_name);\n        END IF;\n    END LOOP;\nEND;\n\/\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">SET<\/span><span style=\"color: #D4D4D4\"> SERVEROUTPUT <\/span><span style=\"color: #569CD6\">ON<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">BEGIN<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">FOR<\/span><span style=\"color: #D4D4D4\"> r <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> ename  <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> emp_name,<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">              sal    <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> salary<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> emp<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">               <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> deptno <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #B5CEA8\">10<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">20<\/span><span style=\"color: #D4D4D4\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">LOOP<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">IF<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            r.salary &gt; <\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">.9e3<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">THEN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #DCDCAA\">dbms_output.<\/span><span style=\"color: #4EC9B0\">put_line<\/span><span style=\"color: #D4D4D4\"> (r.emp_name);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">END IF<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">END LOOP<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\/<\/span><\/span><\/code><\/pre><\/div>\n\n\n<p><\/div><\/div>\n\n\n\n<p>The formatter added ten spaces at the beginning of line 5, 6 and 7. As a result <code>SELECT<\/code>, <code>sal<\/code>, <code>&nbsp; FROM<\/code> and <code> WHERE<\/code> are now left-aligned. Please note that the algorithm considers the spaces added in <code>rightAlignments<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a name=\"pairwiseAlignments\"><\/a><code>pairwiseAlignments<\/code><\/h3>\n\n\n\n<p>This function expects a <code>node<\/code> and a <code>predecessor<\/code> in <code>tuple<\/code>. It left-aligns the <code>node<\/code>&nbsp;with its <code>predecessor<\/code> by adding spaces to <code>newLinePositions<\/code> for the start position of <code>node<\/code>.<\/p>\n\n\n\n<p>Here is the Arbori program and its formatting result.<\/p>\n\n\n<div class=\"jq-tabs tabs_wrapper tabs_horizontal\"><ul><li><a href=\"#tab-6a06ef65d9170-1\">Arbori Program<\/a><\/li><li><a href=\"#tab-6a06ef65d9170-2\">Result<\/a><\/li><\/ul><div id=\"tab-6a06ef65d9170-1\" ><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Arbori Program<\/span><span role=\"button\" tabindex=\"0\" data-code=\"dontFormatNode:\n  &#091;node) numeric_literal\n  -&gt;\n;\n \nindentedNodes:\n    &#091;node) seq_of_stmts\n  | :indentConditions &amp; &#091;node) pls_expr &amp; &#091;node-1) 'IF'\n;\n \nindentedNodes1: indentedNodes \n  -&gt;\n;\n \nindentedNodes2: indentedNodes \n  -&gt;\n;\n \nskipWhiteSpaceBeforeNode:\n    &#091;node) ';'\n  | &#091;node) ','\n  | &#091;node) ')'\n  | &#091;node) '.'\n  -&gt;\n;\n \nskipWhiteSpaceAfterNode:\n    &#091;node) '('\n  | &#091;node) '.'\n  -&gt;\n;\n \nidentifiers:\n  &#091;identifier) identifier \n  -&gt; \n;\n \nextraBrkBefore: \n    &#091;node) sql_statement\n  | &#091;node) from_clause\n  | &#091;node) where_clause\n  | &#091;node) 'LOOP' &amp; &#091;node-1) iteration_scheme\n  -&gt;\n;\n \nextraBrkAfter: \n  &#091;node) ',' &amp; &#091;node+1) select_term \n  -&gt;\n;\n \nbrkX2:\n  &#091;node) sql_statement\n  -&gt;\n;\n \nrightAlignments:\n    &#091;node) 'FROM'\n  | &#091;node) 'WHERE'\n  -&gt;\n;\n \npaddedIdsInScope:\n  &#091;id) expr &amp; &#091;id^) select_term &amp; &#091;id+1) as_alias &amp; &#091;scope) select_clause\n            &amp; scope &lt; id &amp; predecessor = id &amp; follower = id+1\n  -&gt;\n;\n \nincrementalAlignments:  \n  &#091;node) subquery\n  -&gt;\n;\n \npairwiseAlignments:\n  &#091;predecessor) select_list &amp; &#091;node) select_term &amp; &#091;node-1) ',' &amp; predecessor=node-1-1 \n  -&gt;\n;\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C8C8C8\">dontFormatNode<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">numeric_literal<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">indentedNodes<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">seq_of_stmts<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | :<\/span><span style=\"color: #9CDCFE\">indentConditions<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">pls_expr<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;IF&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">indentedNodes1<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #9CDCFE\">indentedNodes<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">indentedNodes2<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #9CDCFE\">indentedNodes<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">skipWhiteSpaceBeforeNode<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;;&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;,&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;)&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;.&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">skipWhiteSpaceAfterNode<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;(&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;.&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">identifiers<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">identifier<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">identifier<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt; <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">extraBrkBefore<\/span><span style=\"color: #D4D4D4\">: <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">sql_statement<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">from_clause<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">where_clause<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;LOOP&#39;<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">iteration_scheme<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">extraBrkAfter<\/span><span style=\"color: #D4D4D4\">: <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;,&#39;<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">+<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">select_term<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">brkX2<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">sql_statement<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">rightAlignments<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;FROM&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;WHERE&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">paddedIdsInScope<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">id<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">expr<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">id<\/span><span style=\"color: #D4D4D4\">^) <\/span><span style=\"color: #9CDCFE\">select_term<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">id<\/span><span style=\"color: #D4D4D4\">+<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">as_alias<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">scope<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">select_clause<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            &amp; <\/span><span style=\"color: #9CDCFE\">scope<\/span><span style=\"color: #D4D4D4\"> &lt; <\/span><span style=\"color: #9CDCFE\">id<\/span><span style=\"color: #D4D4D4\"> &amp; <\/span><span style=\"color: #9CDCFE\">predecessor<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">id<\/span><span style=\"color: #D4D4D4\"> &amp; <\/span><span style=\"color: #9CDCFE\">follower<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">id<\/span><span style=\"color: #D4D4D4\">+<\/span><span style=\"color: #B5CEA8\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">incrementalAlignments<\/span><span style=\"color: #D4D4D4\">:  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">subquery<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #9CDCFE\">pairwiseAlignments<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">predecessor<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">select_list<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">select_term<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;,&#39;<\/span><span style=\"color: #D4D4D4\"> &amp; <\/span><span style=\"color: #9CDCFE\">predecessor<\/span><span style=\"color: #D4D4D4\">=<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">;<\/span><\/span><\/code><\/pre><\/div>\n\n\n<p><\/div><div id=\"tab-6a06ef65d9170-2\" ><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">PL\/SQL Example Code (Formatter Result)<\/span><span role=\"button\" tabindex=\"0\" data-code=\"SET SERVEROUTPUT ON\n \nBEGIN\n    FOR r IN (SELECT ename  AS emp_name,\n                     sal    AS salary\n                FROM emp\n               WHERE deptno IN (10, 20))\n    LOOP\n        IF\n            r.salary &gt; 2.9e3\n        THEN\n            dbms_output.put_line (r.emp_name);\n        END IF;\n    END LOOP;\nEND;\n\/\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">SET<\/span><span style=\"color: #D4D4D4\"> SERVEROUTPUT <\/span><span style=\"color: #569CD6\">ON<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">BEGIN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">FOR<\/span><span style=\"color: #D4D4D4\"> r <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> ename  <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> emp_name,<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">                     sal    <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> salary<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> emp<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">               <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> deptno <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #B5CEA8\">10<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">20<\/span><span style=\"color: #D4D4D4\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">LOOP<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">IF<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            r.salary &gt; <\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">.9e3<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">THEN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #DCDCAA\">dbms_output.<\/span><span style=\"color: #4EC9B0\">put_line<\/span><span style=\"color: #D4D4D4\"> (r.emp_name);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">END IF<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">END LOOP<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\/<\/span><\/span><\/code><\/pre><\/div>\n\n\n<p><\/div><\/div>\n\n\n\n<p>The formatter added seven spaces at the beginning of line 5. Now all select terms are left-aligned.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a name=\"ignoreLineBreaksBeforeNode\"><\/a><code>ignoreLineBreaksBeforeNode<\/code><\/h3>\n\n\n\n<p>This function expects an&nbsp;node&nbsp;in&nbsp;tuple. It removes the entry in newLinePositions&nbsp;for the start position of the node. As a result, the serializer will emit a space before this node.<\/p>\n\n\n\n<p>Here is the Arbori program and its formatting result.<\/p>\n\n\n<div class=\"jq-tabs tabs_wrapper tabs_horizontal\"><ul><li><a href=\"#tab-6a06ef65d9330-1\">Arbori Program<\/a><\/li><li><a href=\"#tab-6a06ef65d9330-2\">Result<\/a><\/li><\/ul><div id=\"tab-6a06ef65d9330-1\" ><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Arbori Program<\/span><span role=\"button\" tabindex=\"0\" data-code=\"dontFormatNode:\n  &#091;node) numeric_literal\n  -&gt;\n;\n \nindentedNodes:\n    &#091;node) seq_of_stmts\n  | :indentConditions &amp; &#091;node) pls_expr &amp; &#091;node-1) 'IF'\n;\n \nindentedNodes1: indentedNodes \n  -&gt;\n;\n \nindentedNodes2: indentedNodes \n  -&gt;\n;\n \nskipWhiteSpaceBeforeNode:\n    &#091;node) ';'\n  | &#091;node) ','\n  | &#091;node) ')'\n  | &#091;node) '.'\n  -&gt;\n;\n \nskipWhiteSpaceAfterNode:\n    &#091;node) '('\n  | &#091;node) '.'\n  -&gt;\n;\n \nidentifiers:\n  &#091;identifier) identifier \n  -&gt; \n;\n \nextraBrkBefore: \n    &#091;node) sql_statement\n  | &#091;node) from_clause\n  | &#091;node) where_clause\n  | &#091;node) 'LOOP' &amp; &#091;node-1) iteration_scheme\n  -&gt;\n;\n \nextraBrkAfter: \n  &#091;node) ',' &amp; &#091;node+1) select_term \n  -&gt;\n;\n \nbrkX2:\n  &#091;node) sql_statement\n  -&gt;\n;\n \nrightAlignments:\n    &#091;node) 'FROM'\n  | &#091;node) 'WHERE'\n  -&gt;\n;\n \npaddedIdsInScope:\n  &#091;id) expr &amp; &#091;id^) select_term &amp; &#091;id+1) as_alias &amp; &#091;scope) select_clause\n            &amp; scope &lt; id &amp; predecessor = id &amp; follower = id+1\n  -&gt;\n;\n \nincrementalAlignments:  \n  &#091;node) subquery\n  -&gt;\n;\n \npairwiseAlignments:\n  &#091;predecessor) select_list &amp; &#091;node) select_term &amp; &#091;node-1) ',' &amp; predecessor=node-1-1 \n  -&gt;\n;\n \nignoreLineBreaksBeforeNode:\n   &#091;node) pls_expr &amp; &#091;node-1) 'IF' \/* override breaks in indentedNodes *\/\n   -&gt;\n;\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C8C8C8\">dontFormatNode<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">numeric_literal<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">indentedNodes<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">seq_of_stmts<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | :<\/span><span style=\"color: #9CDCFE\">indentConditions<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">pls_expr<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;IF&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">indentedNodes1<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #9CDCFE\">indentedNodes<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">indentedNodes2<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #9CDCFE\">indentedNodes<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">skipWhiteSpaceBeforeNode<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;;&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;,&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;)&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;.&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">skipWhiteSpaceAfterNode<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;(&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;.&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">identifiers<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">identifier<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">identifier<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt; <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">extraBrkBefore<\/span><span style=\"color: #D4D4D4\">: <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">sql_statement<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">from_clause<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">where_clause<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;LOOP&#39;<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">iteration_scheme<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">extraBrkAfter<\/span><span style=\"color: #D4D4D4\">: <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;,&#39;<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">+<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">select_term<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">brkX2<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">sql_statement<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">rightAlignments<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;FROM&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;WHERE&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">paddedIdsInScope<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">id<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">expr<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">id<\/span><span style=\"color: #D4D4D4\">^) <\/span><span style=\"color: #9CDCFE\">select_term<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">id<\/span><span style=\"color: #D4D4D4\">+<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">as_alias<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">scope<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">select_clause<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            &amp; <\/span><span style=\"color: #9CDCFE\">scope<\/span><span style=\"color: #D4D4D4\"> &lt; <\/span><span style=\"color: #9CDCFE\">id<\/span><span style=\"color: #D4D4D4\"> &amp; <\/span><span style=\"color: #9CDCFE\">predecessor<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">id<\/span><span style=\"color: #D4D4D4\"> &amp; <\/span><span style=\"color: #9CDCFE\">follower<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">id<\/span><span style=\"color: #D4D4D4\">+<\/span><span style=\"color: #B5CEA8\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">incrementalAlignments<\/span><span style=\"color: #D4D4D4\">:  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">subquery<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">pairwiseAlignments<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">predecessor<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">select_list<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">select_term<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;,&#39;<\/span><span style=\"color: #D4D4D4\"> &amp; <\/span><span style=\"color: #9CDCFE\">predecessor<\/span><span style=\"color: #D4D4D4\">=<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #9CDCFE\">ignoreLineBreaksBeforeNode<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">   [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">pls_expr<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;IF&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #6A9955\">\/* override breaks in indentedNodes *\/<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">   -&gt;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">;<\/span><\/span><\/code><\/pre><\/div>\n\n\n<p><\/div><div id=\"tab-6a06ef65d9330-2\" ><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">PL\/SQL Example Code (Formatter Result)<\/span><span role=\"button\" tabindex=\"0\" data-code=\"SET SERVEROUTPUT ON\n \nBEGIN\n    FOR r IN (SELECT ename  AS emp_name,\n                     sal    AS salary\n                FROM emp\n               WHERE deptno IN (10, 20))\n    LOOP\n        IF r.salary &gt; 2.9e3\n        THEN\n            dbms_output.put_line (r.emp_name);\n        END IF;\n    END LOOP;\nEND;\n\/\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">SET<\/span><span style=\"color: #D4D4D4\"> SERVEROUTPUT <\/span><span style=\"color: #569CD6\">ON<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">BEGIN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">FOR<\/span><span style=\"color: #D4D4D4\"> r <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> ename  <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> emp_name,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                     sal    <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> salary<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> emp<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">               <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> deptno <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #B5CEA8\">10<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">20<\/span><span style=\"color: #D4D4D4\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">LOOP<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">IF<\/span><span style=\"color: #D4D4D4\"> r.salary &gt; <\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">.9e3<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">THEN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #DCDCAA\">dbms_output.<\/span><span style=\"color: #4EC9B0\">put_line<\/span><span style=\"color: #D4D4D4\"> (r.emp_name);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">END IF<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">END LOOP<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\/<\/span><\/span><\/code><\/pre><\/div>\n\n\n<p><\/div><\/div>\n\n\n\n<p>The formatting result does not contain a newline after the <code>IF<\/code> on line 9.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a name=\"ignoreLineBreaksAfterNode\"><\/a><code>ignoreLineBreaksAfterNode<\/code><\/h3>\n\n\n\n<p>This function expects an <code>node<\/code> in <code>tuple<\/code>. It is similar to <code>ignoreLineBreaksBeforeNode<\/code>. The only difference is that it removes the end position of a node from <code>newLinePositions<\/code>.<\/p>\n\n\n\n<p>Here is the Arbori program and its formatting result.<\/p>\n\n\n<div class=\"jq-tabs tabs_wrapper tabs_horizontal\"><ul><li><a href=\"#tab-6a06ef65d9504-1\">Arbori Program<\/a><\/li><li><a href=\"#tab-6a06ef65d9504-2\">Result<\/a><\/li><\/ul><div id=\"tab-6a06ef65d9504-1\" ><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Arbori Program<\/span><span role=\"button\" tabindex=\"0\" data-code=\"dontFormatNode:\n  &#091;node) numeric_literal\n  -&gt;\n;\n \nindentedNodes:\n    &#091;node) seq_of_stmts\n  | :indentConditions &amp; &#091;node) pls_expr &amp; &#091;node-1) 'IF'\n;\n \nindentedNodes1: indentedNodes \n  -&gt;\n;\n \nindentedNodes2: indentedNodes \n  -&gt;\n;\n \nskipWhiteSpaceBeforeNode:\n    &#091;node) ';'\n  | &#091;node) ','\n  | &#091;node) ')'\n  | &#091;node) '.'\n  -&gt;\n;\n \nskipWhiteSpaceAfterNode:\n    &#091;node) '('\n  | &#091;node) '.'\n  -&gt;\n;\n \nidentifiers:\n  &#091;identifier) identifier \n  -&gt; \n;\n \nextraBrkBefore: \n    &#091;node) sql_statement\n  | &#091;node) from_clause\n  | &#091;node) where_clause\n  | &#091;node) 'LOOP' &amp; &#091;node-1) iteration_scheme\n  -&gt;\n;\n \nextraBrkAfter: \n  &#091;node) ',' &amp; &#091;node+1) select_term \n  -&gt;\n;\n \nbrkX2:\n  &#091;node) sql_statement\n  -&gt;\n;\n \nrightAlignments:\n    &#091;node) 'FROM'\n  | &#091;node) 'WHERE'\n  -&gt;\n;\n \npaddedIdsInScope:\n  &#091;id) expr &amp; &#091;id^) select_term &amp; &#091;id+1) as_alias &amp; &#091;scope) select_clause\n            &amp; scope &lt; id &amp; predecessor = id &amp; follower = id+1\n  -&gt;\n;\n \nincrementalAlignments:  \n  &#091;node) subquery\n  -&gt;\n;\n \npairwiseAlignments:\n  &#091;predecessor) select_list &amp; &#091;node) select_term &amp; &#091;node-1) ',' &amp; predecessor=node-1-1 \n  -&gt;\n;\n \nignoreLineBreaksBeforeNode:\n   &#091;node) pls_expr &amp; &#091;node-1) 'IF' \/* override breaks in indentedNodes *\/\n   -&gt;\n;\n \nignoreLineBreaksAfterNode:\n   &#091;node) pls_expr &amp; &#091;node+1) 'THEN' \/* override breaks set in indentedNodes *\/\n   -&gt;\n;\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C8C8C8\">dontFormatNode<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">numeric_literal<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">indentedNodes<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">seq_of_stmts<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | :<\/span><span style=\"color: #9CDCFE\">indentConditions<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">pls_expr<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;IF&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">indentedNodes1<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #9CDCFE\">indentedNodes<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">indentedNodes2<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #9CDCFE\">indentedNodes<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">skipWhiteSpaceBeforeNode<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;;&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;,&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;)&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;.&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">skipWhiteSpaceAfterNode<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;(&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;.&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">identifiers<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">identifier<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">identifier<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt; <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">extraBrkBefore<\/span><span style=\"color: #D4D4D4\">: <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">sql_statement<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">from_clause<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">where_clause<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;LOOP&#39;<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">iteration_scheme<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">extraBrkAfter<\/span><span style=\"color: #D4D4D4\">: <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;,&#39;<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">+<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">select_term<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">brkX2<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">sql_statement<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">rightAlignments<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;FROM&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  | [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;WHERE&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">paddedIdsInScope<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">id<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">expr<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">id<\/span><span style=\"color: #D4D4D4\">^) <\/span><span style=\"color: #9CDCFE\">select_term<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">id<\/span><span style=\"color: #D4D4D4\">+<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">as_alias<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">scope<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">select_clause<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            &amp; <\/span><span style=\"color: #9CDCFE\">scope<\/span><span style=\"color: #D4D4D4\"> &lt; <\/span><span style=\"color: #9CDCFE\">id<\/span><span style=\"color: #D4D4D4\"> &amp; <\/span><span style=\"color: #9CDCFE\">predecessor<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">id<\/span><span style=\"color: #D4D4D4\"> &amp; <\/span><span style=\"color: #9CDCFE\">follower<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">id<\/span><span style=\"color: #D4D4D4\">+<\/span><span style=\"color: #B5CEA8\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">incrementalAlignments<\/span><span style=\"color: #D4D4D4\">:  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">subquery<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">pairwiseAlignments<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  [<\/span><span style=\"color: #9CDCFE\">predecessor<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">select_list<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">select_term<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;,&#39;<\/span><span style=\"color: #D4D4D4\"> &amp; <\/span><span style=\"color: #9CDCFE\">predecessor<\/span><span style=\"color: #D4D4D4\">=<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">ignoreLineBreaksBeforeNode<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">pls_expr<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;IF&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #6A9955\">\/* override breaks in indentedNodes *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   -&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #9CDCFE\">ignoreLineBreaksAfterNode<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">   [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #9CDCFE\">pls_expr<\/span><span style=\"color: #D4D4D4\"> &amp; [<\/span><span style=\"color: #9CDCFE\">node<\/span><span style=\"color: #D4D4D4\">+<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #CE9178\">&#39;THEN&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #6A9955\">\/* override breaks set in indentedNodes *\/<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">   -&gt;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">;<\/span><\/span><\/code><\/pre><\/div>\n\n\n<p><\/div><div id=\"tab-6a06ef65d9504-2\" ><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">PL\/SQL Example Code (Formatter Result)<\/span><span role=\"button\" tabindex=\"0\" data-code=\"SET SERVEROUTPUT ON\n \nBEGIN\n    FOR r IN (SELECT ename  AS emp_name,\n                     sal    AS salary\n                FROM emp\n               WHERE deptno IN (10, 20))\n    LOOP\n        IF r.salary &gt; 2.9e3 THEN\n            dbms_output.put_line (r.emp_name);\n        END IF;\n    END LOOP;\nEND;\n\/\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">SET<\/span><span style=\"color: #D4D4D4\"> SERVEROUTPUT <\/span><span style=\"color: #569CD6\">ON<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">BEGIN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">FOR<\/span><span style=\"color: #D4D4D4\"> r <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> ename  <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> emp_name,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                     sal    <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> salary<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> emp<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">               <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> deptno <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #B5CEA8\">10<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">20<\/span><span style=\"color: #D4D4D4\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">LOOP<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">IF<\/span><span style=\"color: #D4D4D4\"> r.salary &gt; <\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">.9e3 <\/span><span style=\"color: #569CD6\">THEN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #DCDCAA\">dbms_output.<\/span><span style=\"color: #4EC9B0\">put_line<\/span><span style=\"color: #D4D4D4\"> (r.emp_name);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">END IF<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">END LOOP<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\/<\/span><\/span><\/code><\/pre><\/div>\n\n\n<p><\/div><\/div>\n\n\n\n<p>This is the final result using every callback function. The formatting result does not contain a newline before the <code>THEN<\/code> on line 9 anymore. Everything looks good now.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Summary<\/h2>\n\n\n\n<p>There are simpler ways to produce the final formatting result. However, the goal was to show the impact of every callback function. While the final Arbori program in this blog post produces a reasonably good formatted code, it is far from complete.<\/p>\n\n\n\n<p>If you are interested in alternative formatter settings then I suggest having a look at <a href=\"https:\/\/github.com\/Trivadis\/plsql-formatter-settings\">this GitHub repository<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction In this blog post, I explained how the formatter in SQL Developer works and outlined how you can change the formatter result using Arbori and JavaScript. In this post, I explain what exactly the provided formatter callback functions do. For that, I use simple examples. I produced all results with a<span class=\"excerpt-hellip\"> [\u2026]<\/span><\/p>\n","protected":false},"author":1,"featured_media":10957,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[129,135,13,85,87],"class_list":["post-10859","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-oracle","tag-arbori","tag-javascript","tag-plsql","tag-sql","tag-sql-developer"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Formatter Callback Functions - Philipp Salvisberg&#039;s Blog<\/title>\n<meta name=\"description\" content=\"In this post I explain what exactly the provided formatter callback functions in SQL Developer do. For that I use simple examples.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.salvis.com\/blog\/2020\/11\/12\/formatter-callback-functions\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Formatter Callback Functions - Philipp Salvisberg&#039;s Blog\" \/>\n<meta property=\"og:description\" content=\"In this post I explain what exactly the provided formatter callback functions in SQL Developer do. For that I use simple examples.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.salvis.com\/blog\/2020\/11\/12\/formatter-callback-functions\/\" \/>\n<meta property=\"og:site_name\" content=\"Philipp Salvisberg&#039;s Blog\" \/>\n<meta property=\"article:published_time\" content=\"2020-11-11T23:48:34+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-11-12T12:59:39+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/hello_formatter_here2.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1210\" \/>\n\t<meta property=\"og:image:height\" content=\"640\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Philipp Salvisberg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@phsalvisberg\" \/>\n<meta name=\"twitter:site\" content=\"@phsalvisberg\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Philipp Salvisberg\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"15 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2020\\\/11\\\/12\\\/formatter-callback-functions\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2020\\\/11\\\/12\\\/formatter-callback-functions\\\/\"},\"author\":{\"name\":\"Philipp Salvisberg\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\"},\"headline\":\"Formatter Callback Functions\",\"datePublished\":\"2020-11-11T23:48:34+00:00\",\"dateModified\":\"2023-11-12T12:59:39+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2020\\\/11\\\/12\\\/formatter-callback-functions\\\/\"},\"wordCount\":2232,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\"},\"image\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2020\\\/11\\\/12\\\/formatter-callback-functions\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2020\\\/11\\\/hello_formatter_here2.png\",\"keywords\":[\"Arbori\",\"JavaScript\",\"PL\\\/SQL\",\"SQL\",\"SQL Developer\"],\"articleSection\":[\"Oracle\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2020\\\/11\\\/12\\\/formatter-callback-functions\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2020\\\/11\\\/12\\\/formatter-callback-functions\\\/\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2020\\\/11\\\/12\\\/formatter-callback-functions\\\/\",\"name\":\"Formatter Callback Functions - Philipp Salvisberg&#039;s Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2020\\\/11\\\/12\\\/formatter-callback-functions\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2020\\\/11\\\/12\\\/formatter-callback-functions\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2020\\\/11\\\/hello_formatter_here2.png\",\"datePublished\":\"2020-11-11T23:48:34+00:00\",\"dateModified\":\"2023-11-12T12:59:39+00:00\",\"description\":\"In this post I explain what exactly the provided formatter callback functions in SQL Developer do. For that I use simple examples.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2020\\\/11\\\/12\\\/formatter-callback-functions\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2020\\\/11\\\/12\\\/formatter-callback-functions\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2020\\\/11\\\/12\\\/formatter-callback-functions\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2020\\\/11\\\/hello_formatter_here2.png\",\"contentUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2020\\\/11\\\/hello_formatter_here2.png\",\"width\":1210,\"height\":640},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2020\\\/11\\\/12\\\/formatter-callback-functions\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Formatter Callback Functions\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/\",\"name\":\"Philipp Salvisberg&#039;s Blog\",\"description\":\"Database-centric development\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\",\"name\":\"Philipp Salvisberg\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/11\\\/phs_trivadis4.jpg\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/11\\\/phs_trivadis4.jpg\",\"contentUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/11\\\/phs_trivadis4.jpg\",\"width\":400,\"height\":400,\"caption\":\"Philipp Salvisberg\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/11\\\/phs_trivadis4.jpg\"},\"sameAs\":[\"http:\\\/\\\/www.salvis.com\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Formatter Callback Functions - Philipp Salvisberg&#039;s Blog","description":"In this post I explain what exactly the provided formatter callback functions in SQL Developer do. For that I use simple examples.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.salvis.com\/blog\/2020\/11\/12\/formatter-callback-functions\/","og_locale":"en_US","og_type":"article","og_title":"Formatter Callback Functions - Philipp Salvisberg&#039;s Blog","og_description":"In this post I explain what exactly the provided formatter callback functions in SQL Developer do. For that I use simple examples.","og_url":"https:\/\/www.salvis.com\/blog\/2020\/11\/12\/formatter-callback-functions\/","og_site_name":"Philipp Salvisberg&#039;s Blog","article_published_time":"2020-11-11T23:48:34+00:00","article_modified_time":"2023-11-12T12:59:39+00:00","og_image":[{"width":1210,"height":640,"url":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/hello_formatter_here2.png","type":"image\/png"}],"author":"Philipp Salvisberg","twitter_card":"summary_large_image","twitter_creator":"@phsalvisberg","twitter_site":"@phsalvisberg","twitter_misc":{"Written by":"Philipp Salvisberg","Est. reading time":"15 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.salvis.com\/blog\/2020\/11\/12\/formatter-callback-functions\/#article","isPartOf":{"@id":"https:\/\/www.salvis.com\/blog\/2020\/11\/12\/formatter-callback-functions\/"},"author":{"name":"Philipp Salvisberg","@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515"},"headline":"Formatter Callback Functions","datePublished":"2020-11-11T23:48:34+00:00","dateModified":"2023-11-12T12:59:39+00:00","mainEntityOfPage":{"@id":"https:\/\/www.salvis.com\/blog\/2020\/11\/12\/formatter-callback-functions\/"},"wordCount":2232,"commentCount":2,"publisher":{"@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515"},"image":{"@id":"https:\/\/www.salvis.com\/blog\/2020\/11\/12\/formatter-callback-functions\/#primaryimage"},"thumbnailUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/hello_formatter_here2.png","keywords":["Arbori","JavaScript","PL\/SQL","SQL","SQL Developer"],"articleSection":["Oracle"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.salvis.com\/blog\/2020\/11\/12\/formatter-callback-functions\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.salvis.com\/blog\/2020\/11\/12\/formatter-callback-functions\/","url":"https:\/\/www.salvis.com\/blog\/2020\/11\/12\/formatter-callback-functions\/","name":"Formatter Callback Functions - Philipp Salvisberg&#039;s Blog","isPartOf":{"@id":"https:\/\/www.salvis.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.salvis.com\/blog\/2020\/11\/12\/formatter-callback-functions\/#primaryimage"},"image":{"@id":"https:\/\/www.salvis.com\/blog\/2020\/11\/12\/formatter-callback-functions\/#primaryimage"},"thumbnailUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/hello_formatter_here2.png","datePublished":"2020-11-11T23:48:34+00:00","dateModified":"2023-11-12T12:59:39+00:00","description":"In this post I explain what exactly the provided formatter callback functions in SQL Developer do. For that I use simple examples.","breadcrumb":{"@id":"https:\/\/www.salvis.com\/blog\/2020\/11\/12\/formatter-callback-functions\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.salvis.com\/blog\/2020\/11\/12\/formatter-callback-functions\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.salvis.com\/blog\/2020\/11\/12\/formatter-callback-functions\/#primaryimage","url":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/hello_formatter_here2.png","contentUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/11\/hello_formatter_here2.png","width":1210,"height":640},{"@type":"BreadcrumbList","@id":"https:\/\/www.salvis.com\/blog\/2020\/11\/12\/formatter-callback-functions\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.salvis.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Formatter Callback Functions"}]},{"@type":"WebSite","@id":"https:\/\/www.salvis.com\/blog\/#website","url":"https:\/\/www.salvis.com\/blog\/","name":"Philipp Salvisberg&#039;s Blog","description":"Database-centric development","publisher":{"@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.salvis.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515","name":"Philipp Salvisberg","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2010\/11\/phs_trivadis4.jpg","url":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2010\/11\/phs_trivadis4.jpg","contentUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2010\/11\/phs_trivadis4.jpg","width":400,"height":400,"caption":"Philipp Salvisberg"},"logo":{"@id":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2010\/11\/phs_trivadis4.jpg"},"sameAs":["http:\/\/www.salvis.com\/"]}]}},"_links":{"self":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts\/10859","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/comments?post=10859"}],"version-history":[{"count":94,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts\/10859\/revisions"}],"predecessor-version":[{"id":12701,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts\/10859\/revisions\/12701"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/media\/10957"}],"wp:attachment":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/media?parent=10859"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/categories?post=10859"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/tags?post=10859"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}