{"id":12097,"date":"2023-02-07T00:24:23","date_gmt":"2023-02-06T23:24:23","guid":{"rendered":"https:\/\/www.salvis.com\/blog\/?p=12097"},"modified":"2023-11-08T18:17:53","modified_gmt":"2023-11-08T17:17:53","slug":"islandsql-episode-2-all-dml-statements","status":"publish","type":"post","link":"https:\/\/www.salvis.com\/blog\/2023\/02\/07\/islandsql-episode-2-all-dml-statements\/","title":{"rendered":"IslandSQL Episode 2: All DML Statements"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Introduction<\/h2>\n\n\n\n<p>In the <a href=\"https:\/\/www.salvis.com\/blog\/2023\/02\/04\/islandsql-episode-1-select-statement\/\">last episode<\/a>, we build the initial version of IslandSQL. An Island grammar for SQL scripts covering select statements. In this blog post, we extend the grammar to handle the remaining DML statements.<\/p>\n\n\n\n<p>The full source code is available on <a href=\"https:\/\/github.com\/IslandSQL\/IslandSQL\/tree\/v0.2.0\">GitHub<\/a> and the binaries on <a href=\"https:\/\/central.sonatype.com\/artifact\/ch.islandsql\/islandsql\/0.2.0\">Maven Central<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Lexer Changes<\/h2>\n\n\n\n<p>The lexer grammar contains a new fragment <code>COMMENT_OR_WS<\/code> on line 98. We use this fragment in all DML lexer rules after the starting keywords. Why? Because we can use comments beside whitespace after a keyword as in\u00a0<code>with\/*comment*\/function e_count...<\/code>. The previous lexer version required a whitespace after the <code>with<\/code> keyword for <code>select<\/code> statements with a <a href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/19\/sqlrf\/SELECT.html#GUID-CFA006CA-6FF1-4972-821E-6996142A51C6__GUID-28DA0E1D-87BF-462E-BCB8-8F77921022F9\">plsql_declarations<\/a> clause.<\/p>\n\n\n\n<p>I also merged the former <code>PLSQL_DECLARATION<\/code> rule into the <code>SELECT<\/code> rule. Mainly to have a single lexer rule for all DML statements. It&#8217;s more consistent and easier to understand IMO.<\/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(3 * 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\">IslandSqlLexer.g4: based on https:\/\/github.com\/IslandSQL\/IslandSQL\/tree\/v0.2.0\/<\/span><span role=\"button\" tabindex=\"0\" data-code=\"lexer grammar IslandSqlLexer;\n\noptions {\n    superClass=IslandSqlLexerBase;\n    caseInsensitive = true;\n}\n\n\/*----------------------------------------------------------------------------*\/\n\/\/ Comments and alike to be ignored\n\/*----------------------------------------------------------------------------*\/\n\nML_COMMENT: '\/*' .*? '*\/' -&gt; channel(HIDDEN);\nSL_COMMENT: '--' .*? (EOF|SINGLE_NL) -&gt; channel(HIDDEN);\n\nREMARK_COMMAND:\n    {isBeginOfCommand()}? 'rem' ('a' ('r' 'k'?)?)?\n        (WS SQLPLUS_TEXT*)? SQLPLUS_END -&gt; channel(HIDDEN)\n;\n\nPROMPT_COMMAND:\n    {isBeginOfCommand()}? 'pro' ('m' ('p' 't'?)?)?\n       (WS SQLPLUS_TEXT*)? SQLPLUS_END -&gt; channel(HIDDEN)\n;\n\nSTRING:\n    'n'?\n    (\n          (['] .*? ['])+\n        | ('q' ['] '[' .*? ']' ['])\n        | ('q' ['] '(' .*? ')' ['])\n        | ('q' ['] '{' .*? '}' ['])\n        | ('q' ['] '<' .*? '&gt;' ['])\n        | ('q' ['] . {saveQuoteDelimiter1()}? .+? . ['] {checkQuoteDelimiter2()}?)\n    ) -&gt; channel(HIDDEN)\n;\n\nCONDITIONAL_COMPILATION_DIRECTIVE: '$if' .*? '$end' -&gt; channel(HIDDEN);\n\n\/*----------------------------------------------------------------------------*\/\n\/\/ Islands of interest on DEFAULT_CHANNEL\n\/*----------------------------------------------------------------------------*\/\n\nCALL:\n    {isBeginOfStatement()}? 'call' COMMENT_OR_WS+ SQL_TEXT+? SQL_END\n;\n\nDELETE:\n    {isBeginOfStatement()}? 'delete' COMMENT_OR_WS+ SQL_TEXT+? SQL_END\n;\n\nEXPLAIN_PLAN:\n    {isBeginOfStatement()}? 'explain' COMMENT_OR_WS+ 'plan' COMMENT_OR_WS+ SQL_TEXT+? SQL_END\n;\n\nINSERT:\n    {isBeginOfStatement()}? 'insert' COMMENT_OR_WS+ SQL_TEXT+? SQL_END\n;\n\nLOCK_TABLE:\n    {isBeginOfStatement()}? 'lock' COMMENT_OR_WS+ 'table' COMMENT_OR_WS+ SQL_TEXT+? SQL_END\n;\n\nMERGE:\n    {isBeginOfStatement()}? 'merge' COMMENT_OR_WS+ SQL_TEXT+? SQL_END\n;\n\nUPDATE:\n    {isBeginOfStatement()}? 'update' COMMENT_OR_WS+ SQL_TEXT+? SQL_END\n;\n\nSELECT:\n    {isBeginOfStatement()}?\n    (\n          ('with' COMMENT_OR_WS+ ('function'|'procedure') SQL_TEXT+? PLSQL_DECLARATION_END)\n        | ('with' COMMENT_OR_WS+ SQL_TEXT+? SQL_END)\n        | (('(' COMMENT_OR_WS*)* 'select' COMMENT_OR_WS SQL_TEXT+? SQL_END)\n    )\n;\n\n\/*----------------------------------------------------------------------------*\/\n\/\/ Whitespace\n\/*----------------------------------------------------------------------------*\/\n\nWS: [ \\t\\r\\n]+ -&gt; channel(HIDDEN);\n\n\/*----------------------------------------------------------------------------*\/\n\/\/ Any other token\n\/*----------------------------------------------------------------------------*\/\n\nANY_OTHER: . -&gt; channel(HIDDEN);\n\n\/*----------------------------------------------------------------------------*\/\n\/\/ Fragments to name expressions and reduce code duplication\n\/*----------------------------------------------------------------------------*\/\n\nfragment SINGLE_NL: '\\r'? '\\n';\nfragment CONTINUE_LINE: '-' [ \\t]* SINGLE_NL;\nfragment COMMENT_OR_WS: ML_COMMENT|SL_COMMENT|WS;\nfragment SQLPLUS_TEXT: (~[\\r\\n]|CONTINUE_LINE);\nfragment SQL_TEXT: (ML_COMMENT|SL_COMMENT|STRING|.);\nfragment SLASH_END: SINGLE_NL WS* '\/' [ \\t]* (EOF|SINGLE_NL);\nfragment PLSQL_DECLARATION_END: ';'? [ \\t]* (EOF|SLASH_END);\nfragment SQL_END:\n      EOF\n    | (';' [ \\t]* SINGLE_NL?)\n    | SLASH_END\n;\nfragment SQLPLUS_END: EOF|SINGLE_NL;\" 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: #9CDCFE\">lexer<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">grammar<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">IslandSqlLexer<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">options<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">superClass<\/span><span style=\"color: #D4D4D4\">=<\/span><span style=\"color: #9CDCFE\">IslandSqlLexerBase<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">caseInsensitive<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">true<\/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: #6A9955\">\/*----------------------------------------------------------------------------*\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Comments and alike to be ignored<\/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\">ML_COMMENT<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&#39;\/*&#39;<\/span><span style=\"color: #D4D4D4\"> .*? <\/span><span style=\"color: #CE9178\">&#39;*\/&#39;<\/span><span style=\"color: #D4D4D4\"> -&gt; <\/span><span style=\"color: #DCDCAA\">channel<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #4FC1FF\">HIDDEN<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #4FC1FF\">SL_COMMENT<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&#39;--&#39;<\/span><span style=\"color: #D4D4D4\"> .*? (<\/span><span style=\"color: #4FC1FF\">EOF<\/span><span style=\"color: #D4D4D4\">|<\/span><span style=\"color: #4FC1FF\">SINGLE_NL<\/span><span style=\"color: #D4D4D4\">) -&gt; <\/span><span style=\"color: #DCDCAA\">channel<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #4FC1FF\">HIDDEN<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #4FC1FF\">REMARK_COMMAND<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    {<\/span><span style=\"color: #DCDCAA\">isBeginOfCommand<\/span><span style=\"color: #D4D4D4\">()}? <\/span><span style=\"color: #CE9178\">&#39;rem&#39;<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #CE9178\">&#39;a&#39;<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #CE9178\">&#39;r&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;k&#39;<\/span><span style=\"color: #D4D4D4\">?)?)?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        (<\/span><span style=\"color: #4FC1FF\">WS<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">SQLPLUS_TEXT<\/span><span style=\"color: #D4D4D4\">*)? <\/span><span style=\"color: #4FC1FF\">SQLPLUS_END<\/span><span style=\"color: #D4D4D4\"> -&gt; <\/span><span style=\"color: #DCDCAA\">channel<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #4FC1FF\">HIDDEN<\/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: #4FC1FF\">PROMPT_COMMAND<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    {<\/span><span style=\"color: #DCDCAA\">isBeginOfCommand<\/span><span style=\"color: #D4D4D4\">()}? <\/span><span style=\"color: #CE9178\">&#39;pro&#39;<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #CE9178\">&#39;m&#39;<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #CE9178\">&#39;p&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;t&#39;<\/span><span style=\"color: #D4D4D4\">?)?)?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       (<\/span><span style=\"color: #4FC1FF\">WS<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">SQLPLUS_TEXT<\/span><span style=\"color: #D4D4D4\">*)? <\/span><span style=\"color: #4FC1FF\">SQLPLUS_END<\/span><span style=\"color: #D4D4D4\"> -&gt; <\/span><span style=\"color: #DCDCAA\">channel<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #4FC1FF\">HIDDEN<\/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: #4FC1FF\">STRING<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #CE9178\">&#39;n&#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 style=\"color: #CE9178\">&#39;] .*? [&#39;<\/span><span style=\"color: #D4D4D4\">])+<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        | (<\/span><span style=\"color: #CE9178\">&#39;q&#39;<\/span><span style=\"color: #D4D4D4\"> [<\/span><span style=\"color: #CE9178\">&#39;] &#39;<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #CE9178\">&#39; .*? &#39;<\/span><span style=\"color: #D4D4D4\">]<\/span><span style=\"color: #CE9178\">&#39; [&#39;<\/span><span style=\"color: #D4D4D4\">])<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        | (<\/span><span style=\"color: #CE9178\">&#39;q&#39;<\/span><span style=\"color: #D4D4D4\"> [<\/span><span style=\"color: #CE9178\">&#39;] &#39;<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#39; .*? &#39;<\/span><span style=\"color: #D4D4D4\">)<\/span><span style=\"color: #CE9178\">&#39; [&#39;<\/span><span style=\"color: #D4D4D4\">])<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        | (<\/span><span style=\"color: #CE9178\">&#39;q&#39;<\/span><span style=\"color: #D4D4D4\"> [<\/span><span style=\"color: #CE9178\">&#39;] &#39;<\/span><span style=\"color: #D4D4D4\">{<\/span><span style=\"color: #CE9178\">&#39; .*? &#39;<\/span><span style=\"color: #D4D4D4\">}<\/span><span style=\"color: #CE9178\">&#39; [&#39;<\/span><span style=\"color: #D4D4D4\">])<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        | (<\/span><span style=\"color: #CE9178\">&#39;q&#39;<\/span><span style=\"color: #D4D4D4\"> [<\/span><span style=\"color: #CE9178\">&#39;] &#39;<\/span><span style=\"color: #D4D4D4\">&lt;<\/span><span style=\"color: #CE9178\">&#39; .*? &#39;<\/span><span style=\"color: #D4D4D4\">&gt;<\/span><span style=\"color: #CE9178\">&#39; [&#39;<\/span><span style=\"color: #D4D4D4\">])<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        | (<\/span><span style=\"color: #CE9178\">&#39;q&#39;<\/span><span style=\"color: #D4D4D4\"> [<\/span><span style=\"color: #CE9178\">&#39;] . {saveQuoteDelimiter1()}? .+? . [&#39;<\/span><span style=\"color: #D4D4D4\">] {<\/span><span style=\"color: #DCDCAA\">checkQuoteDelimiter2<\/span><span style=\"color: #D4D4D4\">()}?)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    ) -&gt; <\/span><span style=\"color: #DCDCAA\">channel<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #4FC1FF\">HIDDEN<\/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: #4FC1FF\">CONDITIONAL_COMPILATION_DIRECTIVE<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&#39;$if&#39;<\/span><span style=\"color: #D4D4D4\"> .*? <\/span><span style=\"color: #CE9178\">&#39;$end&#39;<\/span><span style=\"color: #D4D4D4\"> -&gt; <\/span><span style=\"color: #DCDCAA\">channel<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #4FC1FF\">HIDDEN<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/*----------------------------------------------------------------------------*\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Islands of interest on DEFAULT_CHANNEL<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/*----------------------------------------------------------------------------*\/<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #4FC1FF\">CALL<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">    {<\/span><span style=\"color: #DCDCAA\">isBeginOfStatement<\/span><span style=\"color: #D4D4D4\">()}? <\/span><span style=\"color: #CE9178\">&#39;call&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">COMMENT_OR_WS<\/span><span style=\"color: #D4D4D4\">+ <\/span><span style=\"color: #4FC1FF\">SQL_TEXT<\/span><span style=\"color: #D4D4D4\">+? <\/span><span style=\"color: #4FC1FF\">SQL_END<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #4FC1FF\">DELETE<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">    {<\/span><span style=\"color: #DCDCAA\">isBeginOfStatement<\/span><span style=\"color: #D4D4D4\">()}? <\/span><span style=\"color: #CE9178\">&#39;delete&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">COMMENT_OR_WS<\/span><span style=\"color: #D4D4D4\">+ <\/span><span style=\"color: #4FC1FF\">SQL_TEXT<\/span><span style=\"color: #D4D4D4\">+? <\/span><span style=\"color: #4FC1FF\">SQL_END<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #4FC1FF\">EXPLAIN_PLAN<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">    {<\/span><span style=\"color: #DCDCAA\">isBeginOfStatement<\/span><span style=\"color: #D4D4D4\">()}? <\/span><span style=\"color: #CE9178\">&#39;explain&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">COMMENT_OR_WS<\/span><span style=\"color: #D4D4D4\">+ <\/span><span style=\"color: #CE9178\">&#39;plan&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">COMMENT_OR_WS<\/span><span style=\"color: #D4D4D4\">+ <\/span><span style=\"color: #4FC1FF\">SQL_TEXT<\/span><span style=\"color: #D4D4D4\">+? <\/span><span style=\"color: #4FC1FF\">SQL_END<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #4FC1FF\">INSERT<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">    {<\/span><span style=\"color: #DCDCAA\">isBeginOfStatement<\/span><span style=\"color: #D4D4D4\">()}? <\/span><span style=\"color: #CE9178\">&#39;insert&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">COMMENT_OR_WS<\/span><span style=\"color: #D4D4D4\">+ <\/span><span style=\"color: #4FC1FF\">SQL_TEXT<\/span><span style=\"color: #D4D4D4\">+? <\/span><span style=\"color: #4FC1FF\">SQL_END<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #4FC1FF\">LOCK_TABLE<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">    {<\/span><span style=\"color: #DCDCAA\">isBeginOfStatement<\/span><span style=\"color: #D4D4D4\">()}? <\/span><span style=\"color: #CE9178\">&#39;lock&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">COMMENT_OR_WS<\/span><span style=\"color: #D4D4D4\">+ <\/span><span style=\"color: #CE9178\">&#39;table&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">COMMENT_OR_WS<\/span><span style=\"color: #D4D4D4\">+ <\/span><span style=\"color: #4FC1FF\">SQL_TEXT<\/span><span style=\"color: #D4D4D4\">+? <\/span><span style=\"color: #4FC1FF\">SQL_END<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #4FC1FF\">MERGE<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">    {<\/span><span style=\"color: #DCDCAA\">isBeginOfStatement<\/span><span style=\"color: #D4D4D4\">()}? <\/span><span style=\"color: #CE9178\">&#39;merge&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">COMMENT_OR_WS<\/span><span style=\"color: #D4D4D4\">+ <\/span><span style=\"color: #4FC1FF\">SQL_TEXT<\/span><span style=\"color: #D4D4D4\">+? <\/span><span style=\"color: #4FC1FF\">SQL_END<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #4FC1FF\">UPDATE<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">    {<\/span><span style=\"color: #DCDCAA\">isBeginOfStatement<\/span><span style=\"color: #D4D4D4\">()}? <\/span><span style=\"color: #CE9178\">&#39;update&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">COMMENT_OR_WS<\/span><span style=\"color: #D4D4D4\">+ <\/span><span style=\"color: #4FC1FF\">SQL_TEXT<\/span><span style=\"color: #D4D4D4\">+? <\/span><span style=\"color: #4FC1FF\">SQL_END<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #4FC1FF\">SELECT<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">    {<\/span><span style=\"color: #DCDCAA\">isBeginOfStatement<\/span><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: #D4D4D4\">          (<\/span><span style=\"color: #CE9178\">&#39;with&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">COMMENT_OR_WS<\/span><span style=\"color: #D4D4D4\">+ (<\/span><span style=\"color: #CE9178\">&#39;function&#39;<\/span><span style=\"color: #D4D4D4\">|<\/span><span style=\"color: #CE9178\">&#39;procedure&#39;<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #4FC1FF\">SQL_TEXT<\/span><span style=\"color: #D4D4D4\">+? <\/span><span style=\"color: #4FC1FF\">PLSQL_DECLARATION_END<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">        | (<\/span><span style=\"color: #CE9178\">&#39;with&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">COMMENT_OR_WS<\/span><span style=\"color: #D4D4D4\">+ <\/span><span style=\"color: #4FC1FF\">SQL_TEXT<\/span><span style=\"color: #D4D4D4\">+? <\/span><span style=\"color: #4FC1FF\">SQL_END<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">        | ((<\/span><span style=\"color: #CE9178\">&#39;(&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">COMMENT_OR_WS<\/span><span style=\"color: #D4D4D4\">*)* <\/span><span style=\"color: #CE9178\">&#39;select&#39;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">COMMENT_OR_WS<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">SQL_TEXT<\/span><span style=\"color: #D4D4D4\">+? <\/span><span style=\"color: #4FC1FF\">SQL_END<\/span><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: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/*----------------------------------------------------------------------------*\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Whitespace<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/*----------------------------------------------------------------------------*\/<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #4FC1FF\">WS<\/span><span style=\"color: #D4D4D4\">: [ \\<\/span><span style=\"color: #9CDCFE\">t<\/span><span style=\"color: #D4D4D4\">\\<\/span><span style=\"color: #9CDCFE\">r<\/span><span style=\"color: #D4D4D4\">\\<\/span><span style=\"color: #9CDCFE\">n<\/span><span style=\"color: #D4D4D4\">]+ -&gt; <\/span><span style=\"color: #DCDCAA\">channel<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #4FC1FF\">HIDDEN<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/*----------------------------------------------------------------------------*\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Any other token<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/*----------------------------------------------------------------------------*\/<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #4FC1FF\">ANY_OTHER<\/span><span style=\"color: #D4D4D4\">: . -&gt; <\/span><span style=\"color: #DCDCAA\">channel<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #4FC1FF\">HIDDEN<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/*----------------------------------------------------------------------------*\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Fragments to name expressions and reduce code duplication<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/*----------------------------------------------------------------------------*\/<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">fragment<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">SINGLE_NL<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&#39;<\/span><span style=\"color: #D7BA7D\">\\r<\/span><span style=\"color: #CE9178\">&#39;<\/span><span style=\"color: #D4D4D4\">? <\/span><span style=\"color: #CE9178\">&#39;<\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&#39;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">fragment<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">CONTINUE_LINE<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&#39;-&#39;<\/span><span style=\"color: #D4D4D4\"> [ \\<\/span><span style=\"color: #9CDCFE\">t<\/span><span style=\"color: #D4D4D4\">]* <\/span><span style=\"color: #4FC1FF\">SINGLE_NL<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #9CDCFE\">fragment<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">COMMENT_OR_WS<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #4FC1FF\">ML_COMMENT<\/span><span style=\"color: #D4D4D4\">|<\/span><span style=\"color: #4FC1FF\">SL_COMMENT<\/span><span style=\"color: #D4D4D4\">|<\/span><span style=\"color: #4FC1FF\">WS<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">fragment<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">SQLPLUS_TEXT<\/span><span style=\"color: #D4D4D4\">: (~[\\<\/span><span style=\"color: #9CDCFE\">r<\/span><span style=\"color: #D4D4D4\">\\<\/span><span style=\"color: #9CDCFE\">n<\/span><span style=\"color: #D4D4D4\">]|<\/span><span style=\"color: #4FC1FF\">CONTINUE_LINE<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">fragment<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">SQL_TEXT<\/span><span style=\"color: #D4D4D4\">: (<\/span><span style=\"color: #4FC1FF\">ML_COMMENT<\/span><span style=\"color: #D4D4D4\">|<\/span><span style=\"color: #4FC1FF\">SL_COMMENT<\/span><span style=\"color: #D4D4D4\">|<\/span><span style=\"color: #4FC1FF\">STRING<\/span><span style=\"color: #D4D4D4\">|.);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">fragment<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">SLASH_END<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #4FC1FF\">SINGLE_NL<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">WS<\/span><span style=\"color: #D4D4D4\">* <\/span><span style=\"color: #CE9178\">&#39;\/&#39;<\/span><span style=\"color: #D4D4D4\"> [ \\<\/span><span style=\"color: #9CDCFE\">t<\/span><span style=\"color: #D4D4D4\">]* (<\/span><span style=\"color: #4FC1FF\">EOF<\/span><span style=\"color: #D4D4D4\">|<\/span><span style=\"color: #4FC1FF\">SINGLE_NL<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">fragment<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">PLSQL_DECLARATION_END<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #CE9178\">&#39;;&#39;<\/span><span style=\"color: #D4D4D4\">? [ \\<\/span><span style=\"color: #9CDCFE\">t<\/span><span style=\"color: #D4D4D4\">]* (<\/span><span style=\"color: #4FC1FF\">EOF<\/span><span style=\"color: #D4D4D4\">|<\/span><span style=\"color: #4FC1FF\">SLASH_END<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">fragment<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">SQL_END<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #4FC1FF\">EOF<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    | (<\/span><span style=\"color: #CE9178\">&#39;;&#39;<\/span><span style=\"color: #D4D4D4\"> [ \\<\/span><span style=\"color: #9CDCFE\">t<\/span><span style=\"color: #D4D4D4\">]* <\/span><span style=\"color: #4FC1FF\">SINGLE_NL<\/span><span style=\"color: #D4D4D4\">?)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    | <\/span><span style=\"color: #4FC1FF\">SLASH_END<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">fragment<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">SQLPLUS_END<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #4FC1FF\">EOF<\/span><span style=\"color: #D4D4D4\">|<\/span><span style=\"color: #4FC1FF\">SINGLE_NL<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Parser Changes<\/h2>\n\n\n\n<p>The start rule <code>file<\/code> on line 11 in the parser grammar is now defined as a unbounded number of <code>dmlStatment<\/code>. Each <a href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/21\/sqlrf\/Types-of-SQL-Statements.html#GUID-2E008D4A-F6FD-4F34-9071-7E10419CA24D\">DML statement<\/a> is a single lexer token. It&#8217;s still not possible to produce a parse error with this grammar. We only process DML statements. Everything else is hidden and therefore ignored.<\/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\">IslandSqlParser.g4: based on https:\/\/github.com\/IslandSQL\/IslandSQL\/tree\/v0.2.0\/<\/span><span role=\"button\" tabindex=\"0\" data-code=\"parser grammar IslandSqlParser;\n\noptions {\n    tokenVocab=IslandSqlLexer;\n}\n\n\/*----------------------------------------------------------------------------*\/\n\/\/ Start rule\n\/*----------------------------------------------------------------------------*\/\n\nfile: dmlStatement* EOF;\n\n\/*----------------------------------------------------------------------------*\/\n\/\/ Rules for reduced SQL grammar (islands of interest)\n\/*----------------------------------------------------------------------------*\/\n\ndmlStatement:\n      callStatement\n    | deleteStatement\n    | explainPlanStatement\n    | insertStatement\n    | lockTableStatement\n    | mergeStatement\n    | selectStatement\n    | updateStatement\n;\n\ncallStatement: CALL;\ndeleteStatement: DELETE;\nexplainPlanStatement: EXPLAIN_PLAN;\ninsertStatement: INSERT;\nlockTableStatement: LOCK_TABLE;\nmergeStatement: MERGE;\nupdateStatement: UPDATE;\nselectStatement: SELECT;\" 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: #9CDCFE\">parser<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">grammar<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">IslandSqlParser<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">options<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">tokenVocab<\/span><span style=\"color: #D4D4D4\">=<\/span><span style=\"color: #9CDCFE\">IslandSqlLexer<\/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: #6A9955\">\/*----------------------------------------------------------------------------*\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Start rule<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/*----------------------------------------------------------------------------*\/<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #C8C8C8\">file<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #9CDCFE\">dmlStatement<\/span><span style=\"color: #D4D4D4\">* <\/span><span style=\"color: #4FC1FF\">EOF<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/*----------------------------------------------------------------------------*\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Rules for reduced SQL grammar (islands of interest)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/*----------------------------------------------------------------------------*\/<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #C8C8C8\">dmlStatement<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">callStatement<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">    | <\/span><span style=\"color: #9CDCFE\">deleteStatement<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">    | <\/span><span style=\"color: #9CDCFE\">explainPlanStatement<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">    | <\/span><span style=\"color: #9CDCFE\">insertStatement<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">    | <\/span><span style=\"color: #9CDCFE\">lockTableStatement<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">    | <\/span><span style=\"color: #9CDCFE\">mergeStatement<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">    | <\/span><span style=\"color: #9CDCFE\">selectStatement<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">    | <\/span><span style=\"color: #9CDCFE\">updateStatement<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #C8C8C8\">callStatement<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #4FC1FF\">CALL<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #C8C8C8\">deleteStatement<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #4FC1FF\">DELETE<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #C8C8C8\">explainPlanStatement<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #4FC1FF\">EXPLAIN_PLAN<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #C8C8C8\">insertStatement<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #4FC1FF\">INSERT<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #C8C8C8\">lockTableStatement<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #4FC1FF\">LOCK_TABLE<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #C8C8C8\">mergeStatement<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #4FC1FF\">MERGE<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #C8C8C8\">updateStatement<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #4FC1FF\">UPDATE<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #C8C8C8\">selectStatement<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #4FC1FF\">SELECT<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">IslandSQL for VS Code<\/h2>\n\n\n\n<p><a href=\"https:\/\/marketplace.visualstudio.com\/items?itemName=phsalvisberg.islandsql\">The extension<\/a> for Visual Studio Code version 0.2.0 finds text in all DML statements and is not limited to <code>select<\/code> statements anymore. And a symbol for each DML statement is shown now in the outline view.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2023\/02\/demo-vscode.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1690\" height=\"1022\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2023\/02\/demo-vscode.png\" alt=\"\" class=\"wp-image-12114\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2023\/02\/demo-vscode.png 1690w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2023\/02\/demo-vscode-300x181.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2023\/02\/demo-vscode-1024x619.png 1024w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2023\/02\/demo-vscode-768x464.png 768w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2023\/02\/demo-vscode-1536x929.png 1536w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2023\/02\/demo-vscode-241x146.png 241w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2023\/02\/demo-vscode-50x30.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2023\/02\/demo-vscode-124x75.png 124w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2023\/02\/demo-vscode-1x1.png 1w\" sizes=\"auto, (max-width:767px) 480px, (max-width:1690px) 100vw, 1690px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Outlook<\/h2>\n\n\n\n<p>A grammar that can parse all DML statements sounds like something complete. However, this grammar is far from complete. For code analysis, getting a single token for a DML statement is at best a good starting point.<\/p>\n\n\n\n<p>What we need is a more detailed result. For this, we need to move the logic from the lexer to the parser. In the next episode, we will do this with one of the DML statements.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction In the last episode, we build the initial version of IslandSQL. An Island grammar for SQL scripts covering select statements. In this blog post, we extend the grammar to handle the remaining DML statements. The full source code is available on GitHub and the binaries on Maven Central. Lexer Changes The<span class=\"excerpt-hellip\"> [\u2026]<\/span><\/p>\n","protected":false},"author":1,"featured_media":12096,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[139,86,137,107,85,138],"class_list":["post-12097","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-oracle","tag-antlr","tag-code-analysis","tag-islandsql","tag-java","tag-sql","tag-vscode"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>IslandSQL Episode 2: All DML Statements - Philipp Salvisberg&#039;s Blog<\/title>\n<meta name=\"description\" content=\"In this blog post, we extend IslandSQL, an island grammar for SQL scripts, to cover all SQL data manipulation statements.\" \/>\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\/2023\/02\/07\/islandsql-episode-2-all-dml-statements\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"IslandSQL Episode 2: All DML Statements - Philipp Salvisberg&#039;s Blog\" \/>\n<meta property=\"og:description\" content=\"In this blog post, we extend IslandSQL, an island grammar for SQL scripts, to cover all SQL data manipulation statements.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.salvis.com\/blog\/2023\/02\/07\/islandsql-episode-2-all-dml-statements\/\" \/>\n<meta property=\"og:site_name\" content=\"Philipp Salvisberg&#039;s Blog\" \/>\n<meta property=\"article:published_time\" content=\"2023-02-06T23:24:23+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-11-08T17:17:53+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2023\/02\/IslandSQL2.png\" \/>\n\t<meta property=\"og:image:width\" content=\"500\" \/>\n\t<meta property=\"og:image:height\" content=\"500\" \/>\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=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2023\\\/02\\\/07\\\/islandsql-episode-2-all-dml-statements\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2023\\\/02\\\/07\\\/islandsql-episode-2-all-dml-statements\\\/\"},\"author\":{\"name\":\"Philipp Salvisberg\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\"},\"headline\":\"IslandSQL Episode 2: All DML Statements\",\"datePublished\":\"2023-02-06T23:24:23+00:00\",\"dateModified\":\"2023-11-08T17:17:53+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2023\\\/02\\\/07\\\/islandsql-episode-2-all-dml-statements\\\/\"},\"wordCount\":323,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\"},\"image\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2023\\\/02\\\/07\\\/islandsql-episode-2-all-dml-statements\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/02\\\/IslandSQL2.png\",\"keywords\":[\"ANTLR\",\"Code Analysis\",\"IslandSQL\",\"Java\",\"SQL\",\"VSCode\"],\"articleSection\":[\"Oracle\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2023\\\/02\\\/07\\\/islandsql-episode-2-all-dml-statements\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2023\\\/02\\\/07\\\/islandsql-episode-2-all-dml-statements\\\/\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2023\\\/02\\\/07\\\/islandsql-episode-2-all-dml-statements\\\/\",\"name\":\"IslandSQL Episode 2: All DML Statements - Philipp Salvisberg&#039;s Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2023\\\/02\\\/07\\\/islandsql-episode-2-all-dml-statements\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2023\\\/02\\\/07\\\/islandsql-episode-2-all-dml-statements\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/02\\\/IslandSQL2.png\",\"datePublished\":\"2023-02-06T23:24:23+00:00\",\"dateModified\":\"2023-11-08T17:17:53+00:00\",\"description\":\"In this blog post, we extend IslandSQL, an island grammar for SQL scripts, to cover all SQL data manipulation statements.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2023\\\/02\\\/07\\\/islandsql-episode-2-all-dml-statements\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2023\\\/02\\\/07\\\/islandsql-episode-2-all-dml-statements\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2023\\\/02\\\/07\\\/islandsql-episode-2-all-dml-statements\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/02\\\/IslandSQL2.png\",\"contentUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/02\\\/IslandSQL2.png\",\"width\":500,\"height\":500},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2023\\\/02\\\/07\\\/islandsql-episode-2-all-dml-statements\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"IslandSQL Episode 2: All DML Statements\"}]},{\"@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":"IslandSQL Episode 2: All DML Statements - Philipp Salvisberg&#039;s Blog","description":"In this blog post, we extend IslandSQL, an island grammar for SQL scripts, to cover all SQL data manipulation statements.","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\/2023\/02\/07\/islandsql-episode-2-all-dml-statements\/","og_locale":"en_US","og_type":"article","og_title":"IslandSQL Episode 2: All DML Statements - Philipp Salvisberg&#039;s Blog","og_description":"In this blog post, we extend IslandSQL, an island grammar for SQL scripts, to cover all SQL data manipulation statements.","og_url":"https:\/\/www.salvis.com\/blog\/2023\/02\/07\/islandsql-episode-2-all-dml-statements\/","og_site_name":"Philipp Salvisberg&#039;s Blog","article_published_time":"2023-02-06T23:24:23+00:00","article_modified_time":"2023-11-08T17:17:53+00:00","og_image":[{"width":500,"height":500,"url":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2023\/02\/IslandSQL2.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":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.salvis.com\/blog\/2023\/02\/07\/islandsql-episode-2-all-dml-statements\/#article","isPartOf":{"@id":"https:\/\/www.salvis.com\/blog\/2023\/02\/07\/islandsql-episode-2-all-dml-statements\/"},"author":{"name":"Philipp Salvisberg","@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515"},"headline":"IslandSQL Episode 2: All DML Statements","datePublished":"2023-02-06T23:24:23+00:00","dateModified":"2023-11-08T17:17:53+00:00","mainEntityOfPage":{"@id":"https:\/\/www.salvis.com\/blog\/2023\/02\/07\/islandsql-episode-2-all-dml-statements\/"},"wordCount":323,"commentCount":1,"publisher":{"@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515"},"image":{"@id":"https:\/\/www.salvis.com\/blog\/2023\/02\/07\/islandsql-episode-2-all-dml-statements\/#primaryimage"},"thumbnailUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2023\/02\/IslandSQL2.png","keywords":["ANTLR","Code Analysis","IslandSQL","Java","SQL","VSCode"],"articleSection":["Oracle"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.salvis.com\/blog\/2023\/02\/07\/islandsql-episode-2-all-dml-statements\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.salvis.com\/blog\/2023\/02\/07\/islandsql-episode-2-all-dml-statements\/","url":"https:\/\/www.salvis.com\/blog\/2023\/02\/07\/islandsql-episode-2-all-dml-statements\/","name":"IslandSQL Episode 2: All DML Statements - Philipp Salvisberg&#039;s Blog","isPartOf":{"@id":"https:\/\/www.salvis.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.salvis.com\/blog\/2023\/02\/07\/islandsql-episode-2-all-dml-statements\/#primaryimage"},"image":{"@id":"https:\/\/www.salvis.com\/blog\/2023\/02\/07\/islandsql-episode-2-all-dml-statements\/#primaryimage"},"thumbnailUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2023\/02\/IslandSQL2.png","datePublished":"2023-02-06T23:24:23+00:00","dateModified":"2023-11-08T17:17:53+00:00","description":"In this blog post, we extend IslandSQL, an island grammar for SQL scripts, to cover all SQL data manipulation statements.","breadcrumb":{"@id":"https:\/\/www.salvis.com\/blog\/2023\/02\/07\/islandsql-episode-2-all-dml-statements\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.salvis.com\/blog\/2023\/02\/07\/islandsql-episode-2-all-dml-statements\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.salvis.com\/blog\/2023\/02\/07\/islandsql-episode-2-all-dml-statements\/#primaryimage","url":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2023\/02\/IslandSQL2.png","contentUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2023\/02\/IslandSQL2.png","width":500,"height":500},{"@type":"BreadcrumbList","@id":"https:\/\/www.salvis.com\/blog\/2023\/02\/07\/islandsql-episode-2-all-dml-statements\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.salvis.com\/blog\/"},{"@type":"ListItem","position":2,"name":"IslandSQL Episode 2: All DML Statements"}]},{"@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\/12097","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=12097"}],"version-history":[{"count":23,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts\/12097\/revisions"}],"predecessor-version":[{"id":12732,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts\/12097\/revisions\/12732"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/media\/12096"}],"wp:attachment":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/media?parent=12097"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/categories?post=12097"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/tags?post=12097"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}