{"id":10514,"date":"2020-09-07T07:56:01","date_gmt":"2020-09-07T05:56:01","guid":{"rendered":"https:\/\/www.salvis.com\/blog\/?p=10514"},"modified":"2023-11-12T13:52:17","modified_gmt":"2023-11-12T12:52:17","slug":"highlight-hints-in-sql-developer","status":"publish","type":"post","link":"https:\/\/www.salvis.com\/blog\/2020\/09\/07\/highlight-hints-in-sql-developer\/","title":{"rendered":"Highlight Hints in SQL Developer"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Introduction<\/h2>\n\n\n\n<p>In this blog post, I explain how you can configure your SQL Developer to highlight hints and distinguish them from ordinary comments. The <a href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/19\/sqlrf\/Comments.html#GUID-D316D545-89E2-4D54-977F-FC97815CD62E\">SQL Language Reference<\/a> for Oracle Database 19c defines hints as follows:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Hints are comments in a SQL statement that pass instructions to the Oracle Database optimizer. The optimizer uses these hints to choose an execution plan for the statement, unless some condition exists that prevents the optimizer from doing so.<\/p>\n<\/blockquote>\n\n\n\n<p>Furthermore<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>A statement block can have only one comment containing hints, and that comment must follow the&nbsp;<code class=\"codeph\">SELECT<\/code>,&nbsp;<code class=\"codeph\">UPDATE<\/code>,&nbsp;<code class=\"codeph\">INSERT<\/code>,&nbsp;<code class=\"codeph\">MERGE<\/code>, or&nbsp;<code class=\"codeph\">DELETE<\/code>&nbsp;keyword.<\/p>\n<\/blockquote>\n\n\n\n<p>And here&#8217;s the syntax diagram:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/09\/hint.gif\"><img wpfc-lazyload-disable=\"true\" loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"119\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/09\/hint.gif\" alt=\"\" class=\"wp-image-10515\"\/><\/a><\/figure>\n<\/blockquote>\n\n\n\n<p>You see the comment containing hints starts with a <code>+<\/code>. The syntax for a hint is simplified. <code>string<\/code> must be read as a placeholder for various hint-specific options. You find a list of officially supported hints in the <a href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/19\/sqlrf\/Comments.html#GUID-06C047B1-133B-4211-9949-5FE9C0659D44\">SQL Language Reference<\/a>.<\/p>\n\n\n\n<p>In <a href=\"https:\/\/www.salvis.com\/blog\/2020\/04\/26\/syntax-highlighting-with-sql-developer\/\">this blog post<\/a>, I covered how syntax highlighting works in SQL Developer and how to add a custom styler. If you are interested in the details, then I recommend reading this blog post first.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Problem<\/h2>\n\n\n\n<p>A custom styler written in Arbori works with nodes provided in the parse-tree (<code>target<\/code>). However, the parse-tree does not contain whitespace nor comments. We still have access to the source code through the parse-tree (<code>target.input<\/code>) and therefore to all comments. For example, by creating a token stream via <code>LexerToken.parse(target.input, true)<\/code> and looking for tokens of type <code>LINE_COMMENT<\/code> and <code>COMMENT<\/code>.&nbsp; That&#8217;s not the problem.<\/p>\n\n\n\n<p>The problem is, that there is no functionality to style a token. We only can style a node by calling <code>struct.addStyle(target, node, 'MyStyle')<\/code>. We cannot highlight hints with this method.<\/p>\n\n\n\n<p>Let&#8217;s dig deeper.<\/p>\n\n\n\n<p>The global variable <code>struct<\/code> is an instance of the <code>CustomSyntaxStyle<\/code> class. Here&#8217;s an excerpt based on the representation in IntelliJ IDEA:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/09\/custom_syntax_styler_excerpt.png\"><img loading=\"lazy\" decoding=\"async\" width=\"837\" height=\"295\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/09\/custom_syntax_styler_excerpt.png\" alt=\"\" class=\"wp-image-10519\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/09\/custom_syntax_styler_excerpt.png 837w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/09\/custom_syntax_styler_excerpt-300x106.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/09\/custom_syntax_styler_excerpt-768x271.png 768w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/09\/custom_syntax_styler_excerpt-260x92.png 260w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/09\/custom_syntax_styler_excerpt-50x18.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/09\/custom_syntax_styler_excerpt-150x53.png 150w\" sizes=\"auto, (max-width:767px) 480px, (max-width:837px) 100vw, 837px\" \/><\/a><\/figure>\n\n\n\n<p>The excerpt shows the complete implementation of the <code>addStyle<\/code> method. The tokens of the passed node are added to a local field named <code>styles<\/code>. This field is defined on line 33 without an <a href=\"https:\/\/docs.oracle.com\/javase\/tutorial\/java\/javaOO\/accesscontrol.html\">access modifier<\/a> and therefore it is not accessible by the Arbori program.<\/p>\n\n\n\n<p>What can we do?<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Approach<\/h2>\n\n\n\n<p>We cannot solve the problem. Only the SQL Developer team can. But we can work around it. We can access the hidden field <code>styles<\/code> through Java reflection. Have a look at <a href=\"http:\/\/tutorials.jenkov.com\/java-reflection\/private-fields-and-methods.html\">this excellent tutorial<\/a> by Jakob Jenkov, if you want to learn more. We will use this approach in the Arbori program.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Arbori Program to Highlight Hints<\/h2>\n\n\n\n<p>This Arbori program applies the style <code>Hints<\/code> for all hints within a worksheet or PL\/SQL editor. I&#8217;ve tested it successfully with SQL Developer 19.2, 19.4 and 20.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\">Arbori Program Hints<\/span><span role=\"button\" tabindex=\"0\" data-code=\"Hints: \n  [node) sql_statements \n  -&gt; {\n    var getHints = function() {\n      var LexerToken = Java.type('oracle.dbtools.parser.LexerToken'); \n      var Token = Java.type('oracle.dbtools.parser.Token');\n      var tokens = LexerToken.parse(target.input, true);\n      var hints = [];\n      var prevToken = tokens[0];\n      for (var i=1; i<tokens.size(); i++) {\n        if ((tokens[i].type == Token.LINE_COMMENT || tokens[i].type == Token.COMMENT) &amp;&amp; tokens[i].content.length &gt; 3) {\n          if (tokens[i].content.substring(2, 3) == &quot;+&quot;) {\n            var prev = prevToken.content.toLowerCase();\n            if (prev == &quot;select&quot; || prev == &quot;insert&quot; || prev == &quot;update&quot; || prev == &quot;delete&quot; || prev == &quot;merge&quot;) {\n              hints[hints.length] = tokens[i];\n              prevToken = tokens[i]\n            }\n          }\n        }\n        if (tokens[i].type != Token.WS &amp;&amp; tokens[i].type != Token.LINE_COMMENT &amp;&amp; tokens[i].type != Token.COMMENT) {\n          prevToken = tokens[i];\n        }\n      }\n      return hints;\n    }\n\n    var styleHints = function(hints) {\n      var Service = Java.type('oracle.dbtools.util.Service');\n      var Long = Java.type('java.lang.Long');\n      var stylesField = struct.getClass().getDeclaredField(&quot;styles&quot;);\n      stylesField.setAccessible(true);\n      var styles = stylesField.get(struct);\n      for (var i in hints) {\n        var pos = new Long(Service.lPair(hints[i].begin, hints[i].end));\n        styles.put(pos, &quot;Hints&quot;);\n      }\n    }\n\n    \/\/ main\n    styleHints(getHints());\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\">Hints<\/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_statements<\/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\">    var <\/span><span style=\"color: #DCDCAA\">getHints<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">function<\/span><span style=\"color: #D4D4D4\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">LexerToken<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">Java<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">type<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#39;oracle.dbtools.parser.LexerToken&#39;<\/span><span style=\"color: #D4D4D4\">); <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">Token<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">Java<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">type<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#39;oracle.dbtools.parser.Token&#39;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">tokens<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">LexerToken<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">parse<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">target<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">input<\/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 style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">hints<\/span><span style=\"color: #D4D4D4\"> = [];<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">prevToken<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">tokens<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">];<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">i<\/span><span style=\"color: #D4D4D4\">=<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">; <\/span><span style=\"color: #9CDCFE\">i<\/span><span style=\"color: #D4D4D4\">&lt;<\/span><span style=\"color: #9CDCFE\">tokens<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">size<\/span><span style=\"color: #D4D4D4\">(); <\/span><span style=\"color: #9CDCFE\">i<\/span><span style=\"color: #D4D4D4\">++) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> ((<\/span><span style=\"color: #9CDCFE\">tokens<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #9CDCFE\">i<\/span><span style=\"color: #D4D4D4\">].<\/span><span style=\"color: #9CDCFE\">type<\/span><span style=\"color: #D4D4D4\"> == <\/span><span style=\"color: #9CDCFE\">Token<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #4FC1FF\">LINE_COMMENT<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #9CDCFE\">tokens<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #9CDCFE\">i<\/span><span style=\"color: #D4D4D4\">].<\/span><span style=\"color: #9CDCFE\">type<\/span><span style=\"color: #D4D4D4\"> == <\/span><span style=\"color: #9CDCFE\">Token<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #4FC1FF\">COMMENT<\/span><span style=\"color: #D4D4D4\">) &amp;&amp; <\/span><span style=\"color: #9CDCFE\">tokens<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #9CDCFE\">i<\/span><span style=\"color: #D4D4D4\">].<\/span><span style=\"color: #9CDCFE\">content<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">length<\/span><span style=\"color: #D4D4D4\"> &gt; <\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">tokens<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #9CDCFE\">i<\/span><span style=\"color: #D4D4D4\">].<\/span><span style=\"color: #9CDCFE\">content<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">substring<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\">) == <\/span><span style=\"color: #CE9178\">&quot;+&quot;<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">prev<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">prevToken<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">content<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">toLowerCase<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">prev<\/span><span style=\"color: #D4D4D4\"> == <\/span><span style=\"color: #CE9178\">&quot;select&quot;<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #9CDCFE\">prev<\/span><span style=\"color: #D4D4D4\"> == <\/span><span style=\"color: #CE9178\">&quot;insert&quot;<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #9CDCFE\">prev<\/span><span style=\"color: #D4D4D4\"> == <\/span><span style=\"color: #CE9178\">&quot;update&quot;<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #9CDCFE\">prev<\/span><span style=\"color: #D4D4D4\"> == <\/span><span style=\"color: #CE9178\">&quot;delete&quot;<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #9CDCFE\">prev<\/span><span style=\"color: #D4D4D4\"> == <\/span><span style=\"color: #CE9178\">&quot;merge&quot;<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">              <\/span><span style=\"color: #9CDCFE\">hints<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #9CDCFE\">hints<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">length<\/span><span style=\"color: #D4D4D4\">] = <\/span><span style=\"color: #9CDCFE\">tokens<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #9CDCFE\">i<\/span><span style=\"color: #D4D4D4\">];<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">              <\/span><span style=\"color: #9CDCFE\">prevToken<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">tokens<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #9CDCFE\">i<\/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: #D4D4D4\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">tokens<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #9CDCFE\">i<\/span><span style=\"color: #D4D4D4\">].<\/span><span style=\"color: #9CDCFE\">type<\/span><span style=\"color: #D4D4D4\"> != <\/span><span style=\"color: #9CDCFE\">Token<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #4FC1FF\">WS<\/span><span style=\"color: #D4D4D4\"> &amp;&amp; <\/span><span style=\"color: #9CDCFE\">tokens<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #9CDCFE\">i<\/span><span style=\"color: #D4D4D4\">].<\/span><span style=\"color: #9CDCFE\">type<\/span><span style=\"color: #D4D4D4\"> != <\/span><span style=\"color: #9CDCFE\">Token<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #4FC1FF\">LINE_COMMENT<\/span><span style=\"color: #D4D4D4\"> &amp;&amp; <\/span><span style=\"color: #9CDCFE\">tokens<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #9CDCFE\">i<\/span><span style=\"color: #D4D4D4\">].<\/span><span style=\"color: #9CDCFE\">type<\/span><span style=\"color: #D4D4D4\"> != <\/span><span style=\"color: #9CDCFE\">Token<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #4FC1FF\">COMMENT<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #9CDCFE\">prevToken<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">tokens<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #9CDCFE\">i<\/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: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">hints<\/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: #D4D4D4\">    var <\/span><span style=\"color: #DCDCAA\">styleHints<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">function<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">hints<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">Service<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">Java<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">type<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#39;oracle.dbtools.util.Service&#39;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">Long<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">Java<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">type<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#39;java.lang.Long&#39;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">stylesField<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">struct<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">getClass<\/span><span style=\"color: #D4D4D4\">().<\/span><span style=\"color: #DCDCAA\">getDeclaredField<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;styles&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">stylesField<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">setAccessible<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">true<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">styles<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">stylesField<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">get<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">struct<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">i<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">in<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">hints<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">pos<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">Long<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">Service<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">lPair<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">hints<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #9CDCFE\">i<\/span><span style=\"color: #D4D4D4\">].<\/span><span style=\"color: #9CDCFE\">begin<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">hints<\/span><span style=\"color: #D4D4D4\">[<\/span><span style=\"color: #9CDCFE\">i<\/span><span style=\"color: #D4D4D4\">].<\/span><span style=\"color: #9CDCFE\">end<\/span><span style=\"color: #D4D4D4\">));<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">styles<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">put<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">pos<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&quot;Hints&quot;<\/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>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ main<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #DCDCAA\">styleHints<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">getHints<\/span><span style=\"color: #D4D4D4\">());<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Here are some explanations:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>On line 2 we query the root node containing all <code>sql_statements<\/code>. As a result, we call the JavaScript on line 3 to 41 only once.<\/li>\n\n\n\n<li>The main program starts on line 40. It collects all hints by calling the local function <code>getHints()<\/code> and styles them by calling the local function <code>styleHints()<\/code>.<\/li>\n\n\n\n<li>We populate all tokens including whitespace and comments on line 7.<\/li>\n\n\n\n<li>We add tokens (relevant comments containing hints) to the result list on line 15.<\/li>\n\n\n\n<li>On line 32 we provide the invisible field <code>styles<\/code> of the <code>struct<\/code> object as a variable <code>styles<\/code> with the help of the Java Reflection API.<\/li>\n\n\n\n<li>On line 34 the start and end position of a token is converted to a <code>Long<\/code> value. This value identifies a token in the editor.<\/li>\n\n\n\n<li>And finally, we apply the style <code>Hints<\/code> to all hint tokens on line 35.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Register Style <code>Hints<\/code><\/h2>\n\n\n\n<p>Add the the Arbori program <code>Hints<\/code> to the <code>PL\/SQL custom Syntax Rules<\/code> in the preference dialog as shown below:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/09\/sqldev_hints_preferences-1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/09\/sqldev_hints_preferences-1.png\" alt=\"\" class=\"wp-image-10551\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/09\/sqldev_hints_preferences-1.png 1024w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/09\/sqldev_hints_preferences-1-300x225.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/09\/sqldev_hints_preferences-1-768x576.png 768w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/09\/sqldev_hints_preferences-1-195x146.png 195w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/09\/sqldev_hints_preferences-1-50x38.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/09\/sqldev_hints_preferences-1-100x75.png 100w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/09\/sqldev_hints_preferences-1-1x1.png 1w\" sizes=\"auto, (max-width:767px) 480px, (max-width:1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Save the preferences by pressing the <code>OK<\/code> button and then restart SQL Developer. This is necessary to register the new custom Style <code>Hints<\/code>.<\/p>\n\n\n\n<p>Then, after restarting SQL Developer, open the preferences dialog again and configure the style <code>Hints<\/code> the way you want.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/09\/sqldev_hints_preferences.png\"><img loading=\"lazy\" decoding=\"async\" width=\"790\" height=\"277\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/09\/sqldev_hints_preferences.png\" alt=\"\" class=\"wp-image-10548\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/09\/sqldev_hints_preferences.png 790w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/09\/sqldev_hints_preferences-300x105.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/09\/sqldev_hints_preferences-768x269.png 768w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/09\/sqldev_hints_preferences-260x91.png 260w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/09\/sqldev_hints_preferences-50x18.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/09\/sqldev_hints_preferences-150x53.png 150w\" sizes=\"auto, (max-width:767px) 480px, (max-width:790px) 100vw, 790px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">The Result<\/h2>\n\n\n\n<p>In the next screenshot, you see a simple query with two syntactically correct hints. However, as mentioned in the introduction only the first comment containing hints is considered by the Oracle Database and therefore highlighted in red.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/09\/result_demo.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/09\/result_demo.png\" alt=\"\" class=\"wp-image-10549\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/09\/result_demo.png 1024w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/09\/result_demo-300x225.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/09\/result_demo-768x576.png 768w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/09\/result_demo-195x146.png 195w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/09\/result_demo-50x38.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/09\/result_demo-100x75.png 100w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/09\/result_demo-1x1.png 1w\" sizes=\"auto, (max-width:767px) 480px, (max-width:1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>The second query produces the execution plan including a hint report for the first query. As you see, only the first hint <code>full(e)<\/code> is used and the second hint <code>full(d)<\/code> is ignored. The second hint is not reported. It is an ordinary comment after all.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction In this blog post, I explain how you can configure your SQL Developer to highlight hints and distinguish them from ordinary comments. The SQL Language Reference for Oracle Database 19c defines hints as follows: Hints are comments in a SQL statement that pass instructions to the Oracle Database optimizer. The optimizer<span class=\"excerpt-hellip\"> [\u2026]<\/span><\/p>\n","protected":false},"author":1,"featured_media":10557,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[129,86,135,13,85,87],"class_list":["post-10514","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-oracle","tag-arbori","tag-code-analysis","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>Highlight Hints in SQL Developer - Philipp Salvisberg&#039;s Blog<\/title>\n<meta name=\"description\" content=\"In this blog post I explain how you can configure your SQL Developer to highlight hints and distinguish them from ordinary comments.\" \/>\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\/09\/07\/highlight-hints-in-sql-developer\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Highlight Hints in SQL Developer - Philipp Salvisberg&#039;s Blog\" \/>\n<meta property=\"og:description\" content=\"In this blog post I explain how you can configure your SQL Developer to highlight hints and distinguish them from ordinary comments.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.salvis.com\/blog\/2020\/09\/07\/highlight-hints-in-sql-developer\/\" \/>\n<meta property=\"og:site_name\" content=\"Philipp Salvisberg&#039;s Blog\" \/>\n<meta property=\"article:published_time\" content=\"2020-09-07T05:56:01+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-11-12T12:52:17+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/09\/featured_image_highlighting_hints.png\" \/>\n\t<meta property=\"og:image:width\" content=\"494\" \/>\n\t<meta property=\"og:image:height\" content=\"391\" \/>\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=\"5 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\\\/09\\\/07\\\/highlight-hints-in-sql-developer\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2020\\\/09\\\/07\\\/highlight-hints-in-sql-developer\\\/\"},\"author\":{\"name\":\"Philipp Salvisberg\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\"},\"headline\":\"Highlight Hints in SQL Developer\",\"datePublished\":\"2020-09-07T05:56:01+00:00\",\"dateModified\":\"2023-11-12T12:52:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2020\\\/09\\\/07\\\/highlight-hints-in-sql-developer\\\/\"},\"wordCount\":693,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\"},\"image\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2020\\\/09\\\/07\\\/highlight-hints-in-sql-developer\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2020\\\/09\\\/featured_image_highlighting_hints.png\",\"keywords\":[\"Arbori\",\"Code Analysis\",\"JavaScript\",\"PL\\\/SQL\",\"SQL\",\"SQL Developer\"],\"articleSection\":[\"Oracle\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2020\\\/09\\\/07\\\/highlight-hints-in-sql-developer\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2020\\\/09\\\/07\\\/highlight-hints-in-sql-developer\\\/\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2020\\\/09\\\/07\\\/highlight-hints-in-sql-developer\\\/\",\"name\":\"Highlight Hints in SQL Developer - Philipp Salvisberg&#039;s Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2020\\\/09\\\/07\\\/highlight-hints-in-sql-developer\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2020\\\/09\\\/07\\\/highlight-hints-in-sql-developer\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2020\\\/09\\\/featured_image_highlighting_hints.png\",\"datePublished\":\"2020-09-07T05:56:01+00:00\",\"dateModified\":\"2023-11-12T12:52:17+00:00\",\"description\":\"In this blog post I explain how you can configure your SQL Developer to highlight hints and distinguish them from ordinary comments.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2020\\\/09\\\/07\\\/highlight-hints-in-sql-developer\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2020\\\/09\\\/07\\\/highlight-hints-in-sql-developer\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2020\\\/09\\\/07\\\/highlight-hints-in-sql-developer\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2020\\\/09\\\/featured_image_highlighting_hints.png\",\"contentUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2020\\\/09\\\/featured_image_highlighting_hints.png\",\"width\":494,\"height\":391},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2020\\\/09\\\/07\\\/highlight-hints-in-sql-developer\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Highlight Hints in SQL Developer\"}]},{\"@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":"Highlight Hints in SQL Developer - Philipp Salvisberg&#039;s Blog","description":"In this blog post I explain how you can configure your SQL Developer to highlight hints and distinguish them from ordinary comments.","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\/09\/07\/highlight-hints-in-sql-developer\/","og_locale":"en_US","og_type":"article","og_title":"Highlight Hints in SQL Developer - Philipp Salvisberg&#039;s Blog","og_description":"In this blog post I explain how you can configure your SQL Developer to highlight hints and distinguish them from ordinary comments.","og_url":"https:\/\/www.salvis.com\/blog\/2020\/09\/07\/highlight-hints-in-sql-developer\/","og_site_name":"Philipp Salvisberg&#039;s Blog","article_published_time":"2020-09-07T05:56:01+00:00","article_modified_time":"2023-11-12T12:52:17+00:00","og_image":[{"width":494,"height":391,"url":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/09\/featured_image_highlighting_hints.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":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.salvis.com\/blog\/2020\/09\/07\/highlight-hints-in-sql-developer\/#article","isPartOf":{"@id":"https:\/\/www.salvis.com\/blog\/2020\/09\/07\/highlight-hints-in-sql-developer\/"},"author":{"name":"Philipp Salvisberg","@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515"},"headline":"Highlight Hints in SQL Developer","datePublished":"2020-09-07T05:56:01+00:00","dateModified":"2023-11-12T12:52:17+00:00","mainEntityOfPage":{"@id":"https:\/\/www.salvis.com\/blog\/2020\/09\/07\/highlight-hints-in-sql-developer\/"},"wordCount":693,"commentCount":1,"publisher":{"@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515"},"image":{"@id":"https:\/\/www.salvis.com\/blog\/2020\/09\/07\/highlight-hints-in-sql-developer\/#primaryimage"},"thumbnailUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/09\/featured_image_highlighting_hints.png","keywords":["Arbori","Code Analysis","JavaScript","PL\/SQL","SQL","SQL Developer"],"articleSection":["Oracle"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.salvis.com\/blog\/2020\/09\/07\/highlight-hints-in-sql-developer\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.salvis.com\/blog\/2020\/09\/07\/highlight-hints-in-sql-developer\/","url":"https:\/\/www.salvis.com\/blog\/2020\/09\/07\/highlight-hints-in-sql-developer\/","name":"Highlight Hints in SQL Developer - Philipp Salvisberg&#039;s Blog","isPartOf":{"@id":"https:\/\/www.salvis.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.salvis.com\/blog\/2020\/09\/07\/highlight-hints-in-sql-developer\/#primaryimage"},"image":{"@id":"https:\/\/www.salvis.com\/blog\/2020\/09\/07\/highlight-hints-in-sql-developer\/#primaryimage"},"thumbnailUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/09\/featured_image_highlighting_hints.png","datePublished":"2020-09-07T05:56:01+00:00","dateModified":"2023-11-12T12:52:17+00:00","description":"In this blog post I explain how you can configure your SQL Developer to highlight hints and distinguish them from ordinary comments.","breadcrumb":{"@id":"https:\/\/www.salvis.com\/blog\/2020\/09\/07\/highlight-hints-in-sql-developer\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.salvis.com\/blog\/2020\/09\/07\/highlight-hints-in-sql-developer\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.salvis.com\/blog\/2020\/09\/07\/highlight-hints-in-sql-developer\/#primaryimage","url":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/09\/featured_image_highlighting_hints.png","contentUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2020\/09\/featured_image_highlighting_hints.png","width":494,"height":391},{"@type":"BreadcrumbList","@id":"https:\/\/www.salvis.com\/blog\/2020\/09\/07\/highlight-hints-in-sql-developer\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.salvis.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Highlight Hints in SQL Developer"}]},{"@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\/10514","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=10514"}],"version-history":[{"count":44,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts\/10514\/revisions"}],"predecessor-version":[{"id":12689,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts\/10514\/revisions\/12689"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/media\/10557"}],"wp:attachment":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/media?parent=10514"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/categories?post=10514"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/tags?post=10514"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}