{"id":1651,"date":"2017-12-17T20:52:56","date_gmt":"2017-12-17T20:52:56","guid":{"rendered":"http:\/\/nenadnoveljic.com\/blog\/?p=1651"},"modified":"2022-02-16T19:54:20","modified_gmt":"2022-02-16T19:54:20","slug":"event-propagation-in-oracle-12-2","status":"publish","type":"post","link":"https:\/\/nenadnoveljic.com\/blog\/event-propagation-in-oracle-12-2\/","title":{"rendered":"Event Propagation in Oracle 12.2"},"content":{"rendered":"<p>Unfortunately, the event propagation is broken in the release 12.2 What I mean by that is if you try to set the event to trace a particular SQL ID and run that SQL in another session, the SQL, sadly, won&#8217;t be traced.<\/p>\n<p>For example, setting the trace in one session:<\/p>\n<pre><code>alter system set events='sql_trace[sql: 2asugy1n1r7y7] level=12'; <\/code><\/pre>\n<p>and executing the query in another should produce the trace, but it doesn&#8217;t:<\/p>\n<pre><code>select \/* test_trace *\/ 1 from dual ;<\/code><\/pre>\n<p>Suprisingly, the problem doesn&#8217;t seem to be widely known, although it&#8217;s such a useful feature. So, I posted the question on Oracle-L and obtained the following feedback from Ghassan Salem: &#8220;This is bug 25989066 (and 25994378), fixed in 18.1, no backport to 12.2 available yet.&#8221; Strangely enough, there isn&#8217;t any information about the problem on Metalink yet.<\/p>\n<p>With regard to the topic, I&#8217;d like to share what I learned while investigating the problem.<\/p>\n<h1>Setting Events<\/h1>\n<p>Firstly, Oracle builds a doubly linked list when alter system set events is issued. I put together a DTrace script&nbsp;<a href=\"https:\/\/github.com\/nenadnoveljic\/dtrace\/blob\/master\/dbgd_flow_122.d\">dbgd_flow_122.d<\/a> to trace this process:<\/p>\n<pre><code>$dtrace -s dbgd_flow_122.d -p 26017\n\n...\ndbgdSetEvents entry\narg2=9845c870 \n-----------\ndbgdCopyEventNode source: arg2 = ffff80ffbd5b94d8 \n*(arg2+0x28): *(ffff80ffbd5b9500) = 1\ndbgdCopyEventNode destination: *ret_val = <span style=\"color: #993300;\">96b837d8<\/span> \n*ptr_mask = *ret_val+0x28: *(<span style=\"color: #993300;\">96b83800<\/span>) = 1\n-----------\ndbgdLinkEvent entry arg2:<span style=\"color: #993300;\">96b837d8<\/span> arg3:<span style=\"color: #ff0000;\">9845c870<\/span>\n-----------\ndbgdCopyEventNode source: arg2 = ffff80ffbd5b7730 \n*(arg2+0x28): *(ffff80ffbd5b7758) = 6\ndbgdCopyEventNode destination: *ret_val = <span style=\"color: #0000ff;\">96b83458<\/span> \n*ptr_mask = *ret_val+0x28: *(<span style=\"color: #0000ff;\">96b83480<\/span>) = 6\n-----------\ndbgdLinkEvent entry arg2:<span style=\"color: #0000ff;\">96b83458<\/span> arg3:<span style=\"color: #ff0000;\">9845c870<\/span>\n-----------\ndbgdSetEvents return \n*arg2: *(<span style=\"color: #ff0000;\">9845c870<\/span>) = 80 \n...<\/code><\/pre>\n<p>Let me outline two functions in the trace above. One is dbgdCopyEventNode which transfers the event information from PGA to SGA. The other is dbgdLinkEvent which, as its name says, links it into the list.<\/p>\n<p>By the way, linked lists are a widely used concept in Oracle database. On the subject of linked lists, there is no better source of information than Jonathan Lewis&#8217; <a href=\"https:\/\/www.apress.com\/la\/book\/9781430239543\" target=\"_blank\" rel=\"noopener\"> Oracle Core Internals<\/a>.<\/p>\n<h1>Propagation<\/h1>\n<p>Secondly, a similar process will kick in during login, with the difference that the information will flow in the opposite direction, i.e. from SGA to PGA. Again, the same DTrace script can be used for tracing the process. However, since the event propagation takes place during uga initialization which in turn is a part of session creation, we have to intercept this process at an early stage to be able to attach to it with DTrace. Talking about debugging login process, I documented that troubleshooting technique in my&nbsp; <a href=\"http:\/\/nenadnoveljic.com\/blog\/debugging-session-creation\/\">previous blog post<\/a>. And now, here&#8217;s the stripped output of the trace:<\/p>\n<pre><code>dbgdCopyEventNode source: arg2 = <span style=\"color: #993300;\">96b837d8 <\/span>\n*(arg2+0x28): *(<span style=\"color: #993300;\">96b83800<\/span>) = 1\ndbgdCopyEventNode destination: *ret_val = ffff80ffbabc0c78 \n*ptr_mask = *ret_val+0x28: *(ffff80ffbabc0ca0) = 1\n-----------\ndbgdLinkEvent entry arg2:ffff80ffbabc0c78 arg3:ffff80ffbd7cd610\n-----------\ndbgdSyncEventGrpsDirect  arg1      = bcffde30 \n1st ptr *(arg1+0x10):    *bcffde40 = <span style=\"color: #ff0000;\">9845c870<\/span>\n2nd ptr *(1st_ptr+0xb8): *<span style=\"color: #ff0000;\">9845c928<\/span> = <span style=\"color: #0000ff;\">96b834c0<\/span>  \n-----------\ndbgdCopyEventNode source: arg2 = <span style=\"color: #800000;\">96b837d8<\/span> \n*(arg2+0x28): *(<span style=\"color: #800000;\">96b83800<\/span>) = 1\ndbgdCopyEventNode destination: *ret_val = ffff80ffbd5ef940 \n*ptr_mask = *ret_val+0x28: *(ffff80ffbd5ef968) = 1\n-----------\ndbgdLinkEvent entry arg2:ffff80ffbd5ef940 arg3:ffff80ffbd5efeb0<\/code><\/pre>\n<p>One thing that an attentive reader might notice, is that when the events were created two elements were copied to SGA. In particular, we can deduce that from two dbgdCopyEventNode calls. In contrast, only one was read back to the PGA during login.<\/p>\n<h1>Doubly Linked List<\/h1>\n<p>As for the next step, we&#8217;re going to take a look at both elements of the linked list. As I couldn&#8217;t identify an x$ fixed table which would externalize those structures, I wrote the utility&nbsp;<a href=\"https:\/\/github.com\/nenadnoveljic\/oradb\/blob\/master\/select_x_linked_events.pl\">select_x_linked_events.pl<\/a> which gets this kind of information by directly reading the memory locations and following the pointers.<\/p>\n<pre><code>linked list ptr to root entry:\nBCFFDE18+28: *BCFFDE40 = <span style=\"color: #ff0000;\">9845C870<\/span>\n\nroot_Entry:\n9845C870+ 0: *<span style=\"color: #ff0000;\">9845C870<\/span> = 00000080\n9845C870+B8: *<span style=\"color: #ff0000;\">9845C928<\/span> = <span style=\"color: #0000ff;\">96B834C0<\/span>\n\nTraversing linked list:\n96B83458+68: *96B834C0 = 96B83840\n96B837D8+68: *96B83840 = 9845C928\n\n1. element:\n96B83458+ 0: *<span style=\"color: #0000ff;\">96B83458<\/span> = 02160001\n96B83458+28: *<span style=\"color: #0000ff;\">96B83480<\/span> = 00000006\n96B83458+38: *96B83490 = 00000000\n96B83458+48: *96B834A0 = 96B83188\n  =&gt; sql: 2asugy1n1r7y7\n96B83458+50: *96B834A8 = 00000000\n96B83458+68: *<span style=\"color: #0000ff;\">96B834C0<\/span> = <span style=\"color: #800000;\">96B83840<\/span>\n96B83458+70: *96B834C8 = <span style=\"color: #ff0000;\">9845C928<\/span>\n96B83458+B8: *<span style=\"color: #0000ff;\">96B83510<\/span> = 5F6C7173\n  = sql_trace[sql: 2asugy1n1r7y7] level=12\n\n2. element:\n96B837D8+ 0: *<span style=\"color: #800000;\">96B837D8<\/span> = 0216000E\n96B837D8+28: *<span style=\"color: #800000;\">96B83800<\/span> = 80000001\n96B837D8+38: *96B83810 = <span style=\"color: #0000ff;\">96B83458<\/span>\n96B837D8+48: *96B83820 = 00000000\n96B837D8+50: *96B83828 = <span style=\"color: #0000ff;\">96B83510<\/span>\n96B837D8+68: *<span style=\"color: #800000;\">96B83840<\/span> = <span style=\"color: #ff0000;\">9845C928<\/span>\n96B837D8+70: *96B83848 = <span style=\"color: #0000ff;\">96B834C0<\/span>                                                                \n96B837D8+B8: *96B83890 = 96B83890<\/code><\/pre>\n<p>So, let&#8217;s try to make some sense out of the memory dump above.<\/p>\n<p>First of all, BCFFDE18 is the address of the first dbgdInitEventGr chunk:<\/p>\n<pre><code>select ksmchptr from x$ksmsp where ksmchcom='dbgdInitEventGr' and ksmchidx=1 \n  order by ksmchidx fetch first 1 rows only ;\nKSMCHPTR\n----------------\n00000000BCFFDDE8<\/code><\/pre>\n<p>Regarding dbgdInitEventGr, there is some background information about it in <a href=\"https:\/\/blog.tanelpoder.com\/2013\/10\/07\/why-doesnt-alter-system-set-events-set-the-events-or-tracing-immediately\/\" target=\"_blank\" rel=\"noopener\">Tanel Poder&#8217;s blog <\/a>.<\/p>\n<p>BCFFDE40 (BCFFDE18+28) points to the root entry of the linked list which starts on 9845C870.<\/p>\n<p><span style=\"color: #ff0000;\">root entry:<\/span><br \/>\n<span style=\"color: #333333;\"> 9845C870<\/span> starting address<br \/>\n<span style=\"color: #333333;\"> 9845C928<\/span> (9845C870+B8) contains the address of the first element.<\/p>\n<p><span style=\"color: #0000ff;\">1st element:<\/span><br \/>\n96B83458 starting address<br \/>\n96B83480 (96B83458+28) if the third least significant bit is turned to 1, the sql will be traced.<br \/>\n96B834A0 (96B83458+48) contains the pointer to the location where the sql id is stored<br \/>\n96B834C0 (96B83458+68) pointer to the next element (2. element)<br \/>\n96B834C8 (96B83458+70) pointer the previous element (root entry)<br \/>\n96B83510 (96B83458+B8) text of alter system command<\/p>\n<p><span style=\"color: #800000;\">2nd element:<\/span><br \/>\n96B837D8 starting address<br \/>\n96B83810 (96B837D8+38) pointer to the first element<br \/>\n96B83828 (96B837D8+50) pointer to the alter system command which is contained in the first element<\/p>\n<p>We can draw following conclusions by looking at the observations above:<\/p>\n<ul>\n<li>The first element should trigger tracing (offset 0x28=6).<\/li>\n<li>The first element is the one which was not copied from SGA to PGA during login.<\/li>\n<li>The offset locations 0x38 and 0x50 are not initialized for the first element, whereas the same fields in the second element point to the first element.<\/li>\n<\/ul>\n<p>The uninitialized 0x50 offset looks a bit odd, so let&#8217;s compare it with it&#8217;s counterpart in the second element. Clearly, it points to the offset 0xB8 of the first element which in turn contains the specification of the alter system command. Hence, I did a test on a test database and updated the uninitialized offset 0x50 of the first element to point to its B8 offset as well (set *0x96B834A8=0x96B83510 in gdb). Amazingly, after manipulating the memory location the trace started kicking in.<\/p>\n<p>It&#8217;s true that the trace started working properly again, but I was unable to remove the event. The attempt ended in ORA-600 in a memory deallocation function, which indicates that the pointers have been messed up:<\/p>\n<pre><code>alter system set events='sql_trace[sql: 2asugy1n1r7y7] off' ;\n*\nERROR at line 1:\nORA-00600: internal error code, arguments: [KGHFRE3], [0x096D5FDC8], [], [],\n[], [], [], [], [], [], [], []<\/code><\/pre>\n<p>With Tanel Poder&#8217;s&nbsp;<a href=\"https:\/\/blog.tanelpoder.com\/files\/scripts\/fcha.sql\">fcha.sql<\/a> it can be easily verified that the referenced address 0x0996d5FDC8 is an address in the dbgdInitEventG chunk that was allocated when the event was set.<\/p>\n<p>Last but not least, let me stress that the change of the memory location content was done on a test database just to get some clues for possible workarounds for the problem. Moreover, the described manipulation is unsafe, unsupported and thus must not be done outside the lab.<\/p>\n<h1>Update on September 25, 2018 &#8211; Oracle 18c<\/h1>\n<p>The bug is fixed on 18c. I tested on 18.3.0.0.180717.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Troubleshooting event propagation in Oracle 12.2 <a href=\"https:\/\/nenadnoveljic.com\/blog\/event-propagation-in-oracle-12-2\/\" class=\"more-link\">Continue Reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[8,24,27,51,5],"tags":[],"class_list":["post-1651","post","type-post","status-publish","format-standard","hentry","category-12c","category-dtrace","category-gdb","category-ora-00600","category-oracle"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Event Propagation in Oracle 12.2 - All-round Database Topics<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/nenadnoveljic.com\/blog\/event-propagation-in-oracle-12-2\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Event Propagation in Oracle 12.2 - All-round Database Topics\" \/>\n<meta property=\"og:description\" content=\"Troubleshooting event propagation in Oracle 12.2 Continue Reading &rarr;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/nenadnoveljic.com\/blog\/event-propagation-in-oracle-12-2\/\" \/>\n<meta property=\"og:site_name\" content=\"All-round Database Topics\" \/>\n<meta property=\"article:published_time\" content=\"2017-12-17T20:52:56+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-02-16T19:54:20+00:00\" \/>\n<meta name=\"author\" content=\"Nenad Noveljic\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@NenadNoveljic\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Nenad Noveljic\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/event-propagation-in-oracle-12-2\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/event-propagation-in-oracle-12-2\\\/\"},\"author\":{\"name\":\"Nenad Noveljic\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#\\\/schema\\\/person\\\/51458d9dd86dbbdd19f5add451d44efa\"},\"headline\":\"Event Propagation in Oracle 12.2\",\"datePublished\":\"2017-12-17T20:52:56+00:00\",\"dateModified\":\"2022-02-16T19:54:20+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/event-propagation-in-oracle-12-2\\\/\"},\"wordCount\":893,\"commentCount\":4,\"articleSection\":[\"12c\",\"DTrace\",\"gdb\",\"ORA-00600\",\"Oracle\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/event-propagation-in-oracle-12-2\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/event-propagation-in-oracle-12-2\\\/\",\"url\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/event-propagation-in-oracle-12-2\\\/\",\"name\":\"Event Propagation in Oracle 12.2 - All-round Database Topics\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#website\"},\"datePublished\":\"2017-12-17T20:52:56+00:00\",\"dateModified\":\"2022-02-16T19:54:20+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#\\\/schema\\\/person\\\/51458d9dd86dbbdd19f5add451d44efa\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/event-propagation-in-oracle-12-2\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/event-propagation-in-oracle-12-2\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/event-propagation-in-oracle-12-2\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Event Propagation in Oracle 12.2\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/\",\"name\":\"All-round Database Topics\",\"description\":\"Nenad Noveljic\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#\\\/schema\\\/person\\\/51458d9dd86dbbdd19f5add451d44efa\",\"name\":\"Nenad Noveljic\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g\",\"caption\":\"Nenad Noveljic\"},\"sameAs\":[\"nenad-noveljic-9b746a6\",\"https:\\\/\\\/x.com\\\/NenadNoveljic\"],\"url\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/author\\\/nenad\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Event Propagation in Oracle 12.2 - All-round Database Topics","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:\/\/nenadnoveljic.com\/blog\/event-propagation-in-oracle-12-2\/","og_locale":"en_US","og_type":"article","og_title":"Event Propagation in Oracle 12.2 - All-round Database Topics","og_description":"Troubleshooting event propagation in Oracle 12.2 Continue Reading &rarr;","og_url":"https:\/\/nenadnoveljic.com\/blog\/event-propagation-in-oracle-12-2\/","og_site_name":"All-round Database Topics","article_published_time":"2017-12-17T20:52:56+00:00","article_modified_time":"2022-02-16T19:54:20+00:00","author":"Nenad Noveljic","twitter_card":"summary_large_image","twitter_creator":"@NenadNoveljic","twitter_misc":{"Written by":"Nenad Noveljic","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/nenadnoveljic.com\/blog\/event-propagation-in-oracle-12-2\/#article","isPartOf":{"@id":"https:\/\/nenadnoveljic.com\/blog\/event-propagation-in-oracle-12-2\/"},"author":{"name":"Nenad Noveljic","@id":"https:\/\/nenadnoveljic.com\/blog\/#\/schema\/person\/51458d9dd86dbbdd19f5add451d44efa"},"headline":"Event Propagation in Oracle 12.2","datePublished":"2017-12-17T20:52:56+00:00","dateModified":"2022-02-16T19:54:20+00:00","mainEntityOfPage":{"@id":"https:\/\/nenadnoveljic.com\/blog\/event-propagation-in-oracle-12-2\/"},"wordCount":893,"commentCount":4,"articleSection":["12c","DTrace","gdb","ORA-00600","Oracle"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/nenadnoveljic.com\/blog\/event-propagation-in-oracle-12-2\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/nenadnoveljic.com\/blog\/event-propagation-in-oracle-12-2\/","url":"https:\/\/nenadnoveljic.com\/blog\/event-propagation-in-oracle-12-2\/","name":"Event Propagation in Oracle 12.2 - All-round Database Topics","isPartOf":{"@id":"https:\/\/nenadnoveljic.com\/blog\/#website"},"datePublished":"2017-12-17T20:52:56+00:00","dateModified":"2022-02-16T19:54:20+00:00","author":{"@id":"https:\/\/nenadnoveljic.com\/blog\/#\/schema\/person\/51458d9dd86dbbdd19f5add451d44efa"},"breadcrumb":{"@id":"https:\/\/nenadnoveljic.com\/blog\/event-propagation-in-oracle-12-2\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/nenadnoveljic.com\/blog\/event-propagation-in-oracle-12-2\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/nenadnoveljic.com\/blog\/event-propagation-in-oracle-12-2\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/nenadnoveljic.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Event Propagation in Oracle 12.2"}]},{"@type":"WebSite","@id":"https:\/\/nenadnoveljic.com\/blog\/#website","url":"https:\/\/nenadnoveljic.com\/blog\/","name":"All-round Database Topics","description":"Nenad Noveljic","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/nenadnoveljic.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/nenadnoveljic.com\/blog\/#\/schema\/person\/51458d9dd86dbbdd19f5add451d44efa","name":"Nenad Noveljic","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g","caption":"Nenad Noveljic"},"sameAs":["nenad-noveljic-9b746a6","https:\/\/x.com\/NenadNoveljic"],"url":"https:\/\/nenadnoveljic.com\/blog\/author\/nenad\/"}]}},"_links":{"self":[{"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/posts\/1651","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/comments?post=1651"}],"version-history":[{"count":1,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/posts\/1651\/revisions"}],"predecessor-version":[{"id":2365,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/posts\/1651\/revisions\/2365"}],"wp:attachment":[{"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/media?parent=1651"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/categories?post=1651"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/tags?post=1651"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}